

喜讯:国内、香港、海外云服务器租用特惠活动,2核/4G/10M仅需31元每月,点击抢购>>>
要调用天翼云服务器API,先来了解一下天翼云API构造请求:
1)请求的URI
例如:{URI-scheme}://{Endpoint}/{resource-path}?{query-string}
| 参数 | 描述 | 是否必选 |
|---|---|---|
| URI-scheme | 用于传输请求的协议,当前所有API均采用HTTPS协议。 | 是 |
| Endpoint | 当前资源池或者通用的域名 | 是 |
| resource-path | 资源路径,也即API访问路径。从具体API的URI模块获取,例如“获取用户1信息”API的resource-path为“/users/1”。 | 是 |
| query-string | 查询参数,是可选部分,并不是每个API都有查询参数。查询参数前面需要带一个“?”,形式为“参数名=参数取值”,例如“?userID=1”,表示查询用户ID为1的数据。 | 是 |
2)请求方法
| 方法 | 说明 |
|---|---|
| GET | 请求服务器返回指定资源。 |
| PUT | 请求服务器更新指定资源。 |
| POST | 请求服务器新增资源或执行特殊操作。 |
| DELETE | 请求服务器删除指定资源,如删除对象等。 |
| HEAD | 请求服务器资源头部。 |
| PATCH | 请求服务器更新资源的部分内容。当资源不存在的时候,PATCH可能会去创建一个新的资源。 |
3) 请求消息头
| 名称 | 描述 | ||
|---|---|---|---|
| Content-Type | 消息体的类型(格式)。推荐用户使用默认值application/json,有其他取值时会在具体接口中专门说明。 | 是 | application/json |
| .... | .... | .... | .... |
接下来需要认证鉴权:
1)信息的获取
云网平台获取
登录云网门户,在“控制台”->“个人中心”->“第三方账号绑定”,通过创建或者查看获取ak,sk。



2)基本签名流程
ctyun-eop-ak/ctyun-eop-sk基本签名流程
1、待签字符串:使用规范请求和其他信息创建待签字符串;
2、计算密钥:使用HEADER、ctyun-eop-sk、ctyun-eop-ak来创建Hmac算法的密钥;
3、计算签名:使用第三步的密钥和待签字符串在通过hmacsha256来计算签名。
4、签名应用:将生成的签名信息作为请求消息头添加到HTTP请求中。
3)创建待签名字符串
待签名字符串的构造规则如下:
待签名字符串=需要进行签名的Header排序后的组合列表+ " " + 排序的query + " " + toHex(sha256(原封的body))
| 需要进行签名的Header排序后的组合列表(排序的header) | header 以 header_name:header_value来一个一个通过 拼接起来,EOP是强制要求ctyun-eop-request-id和eop-date这个头作为Header中的一部分,并且必须是待签名Header里的一个。需要进行签名算法的Header需要进行排序(将它们的header_name以26个英文字母的顺序来排序),将排序后得到的列表进行遍历组装成待签名的header。 |
|---|---|
| 排序的query | query以&作为拼接,key和值以=连接,排序规则使用26个英文字母的顺序来排序,Query参数全部都需要进行签名 |
| toHex(sha256(原封的body)) | 传进来的body参数进行sha256摘要,对摘要出来的结果转十六进制 |
排序的header例子:
假设你需要将ctyun-eop-request-id、eop-date、host都要签名,则待签名的header构造出来是:
ctyun-eop-request-id:123456789 eop-date:20210531T100101Z host:1.1.1.1:9080
ctyun-eop-request-id、eop-date和host的排序就是这个顺序,如果你加入一个ccad的header;同时这个header也要是进行签名,则待签名的header组合:
ccda:123 ctyun-eop-request-id:123456789 eop-date:20210531T100101Z host:1.1.1.1:9080
4)构造动态密钥
发起请求时,需要构造一个eop-date的时间,这个时间的格式是yyyymmddTHHMMSSZ;言简意赅一些,就是年月日T时分秒Z
1、先是拿你申请来的ctyun-eop-sk作为密钥,eop-date作为数据,算出ktime
2、拿ktime作为密钥,你申请来的ctyun-eop-ak数据,算出kAk;
3、拿kAk作为密钥,eop-date的年月日值作为数据;算出kdate
| eop-date | yyyymmddTHHMMSSZ(20211221T163614Z)(年月日T时分秒Z) |
|---|---|
| Ktime | 使用ctyun-eop-sk作为密钥,eop-date作为数据,算出ktime;Ktime = hmacSha256(ctyun-eop-sk, eop-date) |
| kAk | 使用ktime作为密钥,你申请来的ctyun-eop-ak数据,算出kAk;kAk = hmacsha256(ktime,ctyun-eop-ak) |
| kdate | 使用kAk作为密钥,eop-date的年月日值作为数据;算出kdate;kdate = hmacsha256(kAk, eop-date) |
5)签名应用及示例
由“构造动态秘钥”和“创建待签名字符串”分别的出来的待签名字符串string_sigture、kdate生成出Sigture;
| Sigture | 待签名字符串string_sigture、kdate;再根据hmacsha256(kdate,string_sigture)得出的结果,再将结果进行base64编码得出Sigture |
|---|---|
| Eop-Authorization | ctyun-eop-ak Header=你构造待签名字符串时的header排序 Signature(注意中间有空格)header排序以分号”;”拼接例子所述:你待签名的字符串header顺序是 eop-date和host;那么你加到header里的值就是Eop-Authorization: ctyun-eop-ak Header=eop-date;host Signature=xad01/ada |
由上得到Eop-Authorization,然后将数据整合成HEADER放在http_client内,发出即可。
http_client所需请求头部如下:
Eop-Authorization: ctyun-eop-ak Header= ctyun-eop-request-id;eop-date Signature=xad01/ada
eop-date:20211221T163614Z
ctyun-eop-request-id: 123456789
(注:若需要进行签名的Header不止默认的ctyun-eop-request-id和eop-date,需要在http_client的请求头部中加上,并且Eop-Authorization中也需要增加)
下面来看一下Python调用示例:
# -*- coding: utf8 -*- import requests import json import hashlib import base64 import hmac import datetime import uuid METHOD_GET = 'GET' METHOD_POST = 'POST' # 官网accessKey AK = '3d98d123d633xxxxxxxxxxx5a60d4bb3' # 官网securityKey SK = '173615ae4177xxxxxxxxxxxd17b1c3ed' def hmac_sha256(secret, data): secret = bytearray(secret) data = bytearray(data) return hmac.new(secret, data, digestmod=hashlib.sha256).digest() def base64_of_hmac(data): return base64.b64encode(data) def get_request_uuid(): return str(uuid.uuid1()) def get_sorted_str(data): """ 鉴权用的参数整理 :param data: dict 需要整理的参数 :return: str """ sorted_data = sorted(data.items(), key=lambda item: item[0]) str_list = map(lambda x_y: '%s=%s' % (x_y[0], x_y[1]), sorted_data) return '&'.join(str_list) def build_sign(query_params, body_params, eop_date, request_uuid): """ 计算鉴权字段 :param query_params: dict get请求中的参数 :param body_params: dict post请求中的参数 :param eop_date: str 请求时间,格式为:'%Y%m%dT%H%M%SZ' :return: str """ # body_str = json.dumps(body_params) if body_params else '' body_str = json.dumps(body_params) body_digest = hashlib.sha256(body_str.encode('utf-8')).hexdigest() # 请求头中必要的两个参数 header_str = 'ctyun-eop-request-id:%s eop-date:%s ' % (request_uuid, eop_date) # url中的参数,或get参数 query_str = get_sorted_str(query_params) signature_str = '%s %s %s' % (header_str, query_str, body_digest) print_log(repr('signature_str is: %s' % signature_str)) sign_date = eop_date.split('T')[0] # 计算鉴权密钥 k_time = hmac_sha256(SK, eop_date) k_ak = hmac_sha256(k_time, AK) k_date = hmac_sha256(k_ak, sign_date) signature_base64 = base64_of_hmac(hmac_sha256(k_date, signature_str)) # 构建请求头的鉴权字段值 sign_header = '%s Headers=ctyun-eop-request-id;eop-date Signature=%s' % (AK, signature_base64) return sign_header def get_sign_headers(query_params, body): """ 获取鉴权用的请求头参数 :param query_params: dict get请求中的参数 :param body: dict post请求中的参数 :return: """ now = datetime.datetime.now() eop_date = datetime.datetime.strftime(now, '%Y%m%dT%H%M%SZ') request_uuid = get_request_uuid() headers = { # 三个鉴权用的参数 'eop-date': eop_date, 'ctyun-eop-request-id': request_uuid, 'Eop-Authorization': build_sign(query_params=query_params, body_params=body, eop_date=eop_date, request_uuid=request_uuid), } return headers def get(url, params=None, header_params=None, get_body=None): return execute(url, method=METHOD_GET, params=params, header_params=header_params, get_body=get_body) def post(url, params=None, header_params=None): return execute(url, method=METHOD_POST, params=params, header_params=header_params) def execute(url, method, params=None, header_params=None, get_body=None): get_body = get_body or {} params = params or {} header_params = header_params or {} query_params, body = (params, get_body) if method == METHOD_GET else ({}, params) headers = get_sign_headers(query_params, body) headers.update(header_params) print_log(u'url: %s' % url) print_log(u'请求方式: %s' % method) print_log(u'请求头: %s' % headers) print_log(u'请求参数: %s' % params) if method == METHOD_GET: res = requests.get(url, params=params, headers=headers, verify=False, json=get_body) else: res = requests.post(url, json=params, headers=headers, verify=False) print_log(u'返回状态码: %s' % res.status_code) print_log(u'返回: %s' % res.text) return res def print_log(log_info): now = datetime.datetime.now() log_info = u'[%s]: %s' % (str(now), log_info) print log_info post("https://ctecs-global.ctapi.ctyun.cn/v4/ecs/instance-list", params={ "regionID": "bb9fdb42056f11eda1610242ac110002", "azName": "cn-huadong1-jsnj1A-public-ctcloud" })
推荐:TOP云智能建站优惠活动,仅880元即可搭建一个后台管理五端合一的智能网站(PC网站、手机网站、百度智能小程序、微信小程序、支付宝小程序),独享百度搜索SEO优势资源,让你的网站不仅有颜值有排面,更有排名,可以实实在在为您带来效益,请点击进入TOP云智能建站>>>,或咨询在线客服了解详情。


湘公网安备43019002001857号
备案号:
客服1