接口通过AccessKey 和 SecrertKey实现鉴权控制,这一对Key由苏宁视频云下发
AccessKey用于表示访问用户,SecretKey用于加密访问凭证,SecretKey必须保密,仅供放在服务器端使用
每一次接口访问均需要在HTTP请求头部增加Authorization字段,其值包含签名加密信息,示例如下:
GET /svc/api3/channel/list?<params>
HOST svc.suning.com
version 3.0
Authorization <签名加密信息>
签名加密信息是用于验证请求合法性的依据,请求中不携带该信息的请求将返回认证失败错误
签名加密信息生成算法如下:
待签名字符串
json = {"rid":"b85de7d0b8c342cc823df9b36e0e4244","deadline":1466406000}
假设AccessKey 和 SecrertKey
AccessKey:oDgJmy1-HHgSiCvCB4-m5irVU6BKjUkaTeyP4axA
SecrertKey:FUAqHxu0_MJB1kZREov0UJ9mChQtS8DyGXad0oec
rid:表示本次请求唯一值
deadline:access_token预设过期UNIX时间戳(单位:秒),最大值2天后
对待签名字符串进行URL安全的Base64编码
encode_json = urlsafe_base64(json)
结果:eyJyaWQiOiJiODVkZTdkMGI4YzM0MmNjODIzZGY5YjM2ZTBlNDI0NCIsImRlYWRsaW5lIjoxNDY2NDA2MDAwfQ
使用SecertKey计算待签名字符串HMAC-SHA1签名
encode_sign = urlsafe_base64(sign)
结果:XyNiAUlquA7O3iOEo3NQkHCgq30
注:对hmac_sha1返回的原始二进制数据进行base64编码
对签名结果进行URL安全的Base64编码
sign = hmac_sha1(encode_json,<SecertKey>)
结果:5f236201496ab80ecede2384a373509070a0ab7d
将AccessKey、encode_sign和encode_json用英文冒号(:)连接起来
access_token = <AccessKey>:<encode_sign>:<encode_json>
结果:oDgJmy1-HHgSiCvCB4-m5irVU6BKjUkaTeyP4axA:XyNiAUlquA7O3iOEo3NQkHCgq30: eyJyaWQiOiJiODVkZTdkMGI4YzM0MmNjODIzZGY5YjM2ZTBlNDI0NCIsImRlYWRsaW5lIjoxNDY2NDA2MDAwfQ
URL安全的Base64编码
URL安全的Base64用于以URL方式传递Base64编码,该编码方式是生成数据内容的Base64字符串,然后替换结果字符串中的特殊字符,加号(+)换成中划线-,
斜杠(/)换成下划线(_)
接口请求的必要Header信息包含 Authorization、version、Content-Type
Authorization用来鉴权请求是否合法
version表示接口版本
Content-Type表示请求参数编码,参数为json格式时值为application/json
Authorization包含rid和deadline字段
rid唯一请求标识
deadline请求过期时间,请注意服务器时间是否正确,建议增加时间延迟以防止服务器之间时间不同步造成的请求失败