1. 签名密钥[废弃保留]
1.1. 什么是签名密钥
签名密钥是由您为自己的地球号应用创建的一对 Key 和 Secret,您需要使用key和secret来为API请求计算签名字段(sign字段)。地球号API服务会根据API,key和存储在后台的secret计算签名,并和客户端传来的签名字段比较验证。如果签名不同就会返回授权失败的错误。使用时您需要了解以下几点:
每个APP创建的时候会自动生成key和secret,key一旦生成不能更改,secret可以随时重置修改。
地球号会对每个API请求进行签名验证。(请妥善保管此密钥,地球号会对密钥进行加密存储来保障密钥的安全性)。
API请求的的部分参数都会参与签名,但并非所有的请求部分都会参与签名计算,本设计初衷是用来简化签名过程。
1.2. 废弃和保留
签名密钥是地球号早期完成非登陆授权任务的主要方式,这个功能后来由应用令牌完成,而这个机制也被废弃。但,考虑到后面有任何可能性需要兼容key和secret机制。我们的APP表仍旧保留了key和secret字段。
1.2.1. 加签方法
计算的签名保存在 Request 的 Header 中,Header 名称:sign
签名计算方法步骤如下:
组织参与加签的数据
String stringToSign=
HTTPMethod + //Method必须全大写,POST,GET,PUT,DELETE
HTTPPath + //例如"/user"这样的.如果api是http://api.xdua.com/user/cwYwng2 这种样子,那么path是: "/user/cwYwng2",但path不包含query变量(url中?开头的部分)
Nonce + //客户端随机生成的一个随机数(推荐使用一个随机数的md5值)
AppSecret //创建app时获取的secret
一个例子是:POST/vfc35af277cc2d8808d1533c62173c49159e54b127abc7cca1862dac91db6256190
注意:url中的query部分不算进签名字符串里,例如:http://api.xdua.com/ugrp?uid=Dt5mvrtU ,此时参与签名的只有?之前的(不包含?号)
签名部分 | 说明 |
---|---|
POST | HTTPMethod |
Path | /vfc |
nonce | 35af277cc2d8808d1533c62173c49159e5 |
appsecret | 4b127abc7cca1862dac91db6256190 |
计算签名
String sign = md5(stringToSign);
放置签名,把签名连同appkey和nonce放置在request的header里,把"|"作为分隔符。
httpHeaders["Authorization"] = appkey+"|"+nonce+"|"+sign;
一个典型的header["Authorization"]是: "aHEVYhE0|23a54eefcb73107b69eeef63df284888|16c758083718e1bcbeef1f29ebcd3159"
签名部分 | 说明 |
---|---|
aHEVYhE0 | appkey |
23a54eefcb73107b69eeef63df284888 | 随机数nonce |
4b127abc7cca1862dac91db6256190 | appsecret |
1.2.2. 密钥泄露 修改替换
当您遇到如下情况:
- 您的某一个密钥发生了泄露,您可能想要保留该密钥与 APP 的绑定关系,但是想要修改密钥的 Key 和 Secret。
- 当您操作将密钥应用于 APP 时,可能该 APP 已经绑定了某个密钥,需要替换密钥。
以上两种情况都建议按照下面的流程来操作:
先在后端同时支持两个密钥:原来的密钥和即将修改或替换的密钥,确保切换过程中的请求能够通过签名验证,不受修改或替换的影响。 后端配置完备后,完成修改,确定新 Key 和 Secret 生效后再将之前已泄露或废弃的密钥删除。