在华为云国际站(Huawei Cloud International Site)使用API时,API的访问通常需要通过API Key(AK)和Secret Key(SK)进行身份验证。下面是如何使用方法签名以及AK/SK进行API请求的基本步骤:
1. 获取AK和SK
首先,您需要在华为云账号中生成和获取您的AK(Access Key)和SK(Secret Key)。登录华为云管理控制台,在“我的凭证”或相关的API凭证管理页面中生成AK和SK。
2. 生成签名
每个API请求都需要附带一个签名,签名的生成过程一般包括以下几个步骤:
步骤 1:构造规范请求字符串
规范请求字符串包含HTTP请求方法、请求头、请求参数等。具体格式如下:
HTTP请求方法
CanonicalURI
CanonicalQueryString
CanonicalHeaders
SignedHeaders
- HTTP请求方法: GET, POST等
- CanonicalURI: 请求的URI路径(例如:/v1/)
- CanonicalQueryString: 请求参数字符串,按照参数名称的字典序排序
- CanonicalHeaders: HTTP头部信息,包含Host和其它必要的头部信息
- SignedHeaders: 签名的头部信息列表
步骤 2:构造待签名字符串
规范请求字符串构造完成后,使用以下模板构造待签名字符串:
算法
请求时间
CredentialScope
哈希值(CanonicalRequest)
- 算法: 通常为HMAC-SHA256
- 请求时间: 格式为yyyyMMdd’T’HHmmss’Z’
- CredentialScope: 格式为日期/区域/service名称/aws4_request,例如:20210716/us-east-1/s3/aws4_request
- 哈希值(CanonicalRequest): 规范请求字符串的SHA256哈希值
步骤 3:计算签名
使用SK计算待签名字符串的HMAC值,生成最终的签名。具体步骤如下:
-
生成签名密钥:
kDate = HMAC-SHA256("AWS4" + SK, Date) kRegion = HMAC-SHA256(kDate, Region) kService = HMAC-SHA256(kRegion, Service) kSigning = HMAC-SHA256(kService, "aws4_request")
-
计算最终签名:
Signature = HMAC-SHA256(kSigning, StringToSign)
3. 发送API请求
在发送API请求时,需要在请求头部中加入认证信息:
Authorization: Algorithm Credential=AK/Date/Region/Service/aws4_request, SignedHeaders=SignedHeaders, Signature=Signature
此外,还需要在请求头部中包含请求时间(X-Sdk-Date)和其他必要的头部信息。
示例代码
以下是一个使用Python生成签名并发送请求的简化示例:
import hashlib
import hmac
import requests
from datetime import datetime
def sign(key, msg):
return hmac.new(key, msg.encode('utf-8'), hashlib.sha256).digest()
def get_signature_key(key, date_stamp, region_name, service_name):
k_date = sign(('AWS4' + key).encode('utf-8'), date_stamp)
k_region = sign(k_date, region_name)
k_service = sign(k_region, service_name)
k_signing = sign(k_service, 'aws4_request')
return k_signing
def create_signature(ak, sk, method, canonical_uri, query_string, headers, payload, region, service):
t = datetime.utcnow()
amz_date = t.strftime('%Y%m%dT%H%M%SZ')
date_stamp = t.strftime('%Y%m%d')
canonical_querystring = '&'.join(['{}={}'.format(k, headers[k]) for k in sorted(headers)])
canonical_headers = 'host:{}n'.format(headers['host'])
signed_headers = 'host'
payload_hash = hashlib.sha256(payload.encode('utf-8')).hexdigest()
canonical_request = '{}n{}n{}n{}n{}n{}'.format(method, canonical_uri, canonical_querystring, canonical_headers, signed_headers, payload_hash)
algorithm = 'AWS4-HMAC-SHA256'
credential_scope = '{}/{}/{}/aws4_request'.format(date_stamp, region, service)
string_to_sign = '{}n{}n{}n{}'.format(algorithm, amz_date, credential_scope, hashlib.sha256(canonical_request.encode('utf-8')).hexdigest())
signing_key = get_signature_key(sk, date_stamp, region, service)
signature = hmac.new(signing_key, string_to_sign.encode('utf-8'), hashlib.sha256).hexdigest()
authorization_header = '{} Credential={}/{}, SignedHeaders={}, Signature={}'.format(algorithm, ak, credential_scope, signed_headers, signature)
headers['Authorization'] = authorization_header
headers['x-amz-date'] = amz_date
return headers
# 示例请求
ak = 'your-access-key'
sk = 'your-secret-key'
method = 'GET'
canonical_uri = '/path/to/resource'
query_string = ''
headers = {
'host': 'service.region.huaweicloud.com'
}
payload = ''
region = 'region'
service = 'service'
signed_headers = create_signature(ak, sk, method, canonical_uri, query_string, headers, payload, region, service)
response = requests.get('https://service.region.huaweicloud.com/path/to/resource', headers=signed_headers)
print(response.text)
以上代码只是一个基本的示例,实际使用中可能需要根据具体的API和需求进行调整。华为云的API文档中也提供了详细的签名生成方法和示例代码,建议参考官方文档获取最新的信息。
发布者:luotuoemo,转转请注明出处:https://www.jintuiyun.com/190948.html