[关闭]
@soszrg 2019-12-12T08:24:54.000000Z 字数 3284 阅读 662

RESTful API接口认证规则

yunhe


介绍

使用方式

在header中添加头域Yunhe_Autorization,值为认证字符串(生成规则参考下面描述)的Base64结果;

  1. Yunhe_Autorization: Base64(认证字符串)

认证字符串规则

  1. yunhe-auth/{version}/{client_type}/{auth_id}/{timestamp}/{nonce}/{region}/{service}/{signature}
说明
yunhe-auth 固定头
version 认证规则版本,目前为v1
client_type 客户端类型,取值:设备 device, 手机应用 app,web前端:web
auth_id 用于认证的ID信息:设备 产品id,app 应用id,web前端 AccessKeyId
timestamp 请求时间戳(毫秒级,整型)
nonce 唯一随机数。用于防止网络重放攻击。用户在不同请求中要使用不同的随机数值,可以用UUID
region 请求资源所在区域,当前固定值all
service 请求服务,当前固定值yunhe
signature 签名

签名规则

生成方式:HMAC-SHA256-HEX(SecretAccessKey,SignString)

SignString

计算公式为: SignString = HTTP Method + "\n" + CanonicalURI + "\n" + CanonicalQueryString + "\n" + CanonicalHeaders,

HTTP Method

指HTTP协议中定义的GET、PUT、POST等请求,必须使用全大写的形式。yunhe API所涉及的HTTP Method有如下四种:

CanonicalURI

CanonicalURI是对URL中的绝对路径进行编码后的结果,即CanonicalURI = UriEncodeExceptSlash(Path)。要求绝对路径Path必须以“/”开头和结尾,不以“/”开头和结尾的需要补充上,空路径为“/”,。


说明


相关举例:
若URL为https://yunhe.com/example/测试/,则其URL Path为/example/测试/,将之规范化得到CanonicalURI = /example/%E6%B5%8B%E8%AF%95/。

CanonicalQueryString

CanonicalQueryString对于URL中的Query String(Query String即URL中“?”后面的“key1 = valve1 & key2 = valve2 ”字符串)进行编码后的结果。

编码步骤如下

  1. 提取URL中的Query String项,即URL中“?”后面的“key1 = valve1 & key2 = valve2 ”字符串
  2. 将Query String根据&拆开成若干项,每一项是key=value或者只有key的形式。
  3. 对拆开后的每一项进行编码处理,分以下两种情况:当该项只有key时,转换公式为UriEncode(key) + "="的形式;当该项是key=value的形式时,转换公式为UriEncode(key) + "=" + UriEncode(value)的形式。这里value可以是空字符串。
  4. 将每一项转换后的字符串按照字典顺序(ASCII码由小到大)排序,并使用& 符号连接起来,生成相应的CanonicalQueryString。

编码示例

CanonicalHeaders

  1. 选择编码的Header:yunhe仅需对HOST头域进行编码
  2. 将认证字符串中除签名外和固定头外的其他部分拆成k-v形式, value均为字符串;如:
  1. # 认证字符串:
  2. yunhe-auth/v1/device/123/456/789/all/yunhe/signature
  3. # 拆分出的编码内容:
  4. {
  5. "verison":"v1",
  6. "client_type":"device",
  7. "auth_id":"123",
  8. "timestamp": "456",
  9. "nonce":"789",
  10. "region":"all",
  11. "service":"yunhe"
  12. }
  1. 将头域的key变成小写,并与拆分后认证字符串组合,如下:
  1. {
  2. "host": "yunhe.com"
  3. "verison":"v1",
  4. "client_type":"device",
  5. "auth_id":"123",
  6. "nonce":"456",
  7. "region":"all",
  8. "service":"yunhe"
  9. }
  1. 将上述json中所有的值两端的空白字符去除
  2. 将各项转换为UriEncode(name) + ":" + UriEncode(value) 的形式
  3. 把上面转换后的所有k-v对按照key的ASCII码由小到大进行排序,并用&将各项拼接,示例将得到如下字符串:
  1. auth_id%3d123&client_type%3ddevice&host%3dyunhe.com&nonce%3d456&region%3dall&service%3dyunhe&verison%3dv1

生成Signature及认证字符串

  1. # signature
  2. signature = HMAC-SHA256-HEX(SecureAccessKey, SignString)
  3. # 认证字符串
  4. sign_str = yunhe-auth/{version}/{client_type}/{auth_id}/{timestamp}/{nonce}/{region}/{service}/{signature}
  5. # 使用时记得对认证字符串进行BASE64编码
添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注