MAC签名验证
1. API MAC签名算法
小米开放平台对一些API需要进行MAC验证, 在调用API时用MAC加密算法对请求进行加密,并将结果放到请求的header中。
1.1 MAC计算
- 请求内容标准化
标准化的请求字符串,就是用指定的请求属性按照某个规则拼接而成的字符串。在这里,其实标准化请求字符串,就是将nonce,HTTP方法,HOST,URI,QUERY以换行符(即:\n
)为连接符,合并起来得到的字符串(格式串结尾增加\n
),其中涉及到属性:
属性 | 说明 | 示例 |
---|---|---|
nonce | 由随机数和时间戳组成,格式:随机数:当前分钟数 | 54897465748976549:21459478(注意冒号分割) |
HTTP方法 | 调用API时请求方式 | GET/ POST (大写) |
HOST | 调用API时的host | 例如: open.account.xiaomi.com(没有http或https) |
URI | 调用API时的path(必须以/开头) | 例如: /user/profile |
QUERY | 请求参数名称按照字典序排列的query串, 内容为空 的query字 段不参与签名 |
clientId=xxx&token=xxx |
- 标准化示例
54897465748976549:21459478\nGET\nopen.account.xiaomi.com\n/user/profile\nclientId=xxx&token=xxx\n
(为了更明白的说明,换行符用\n
来显示)
- Mac计算
客户端使用MAC算法 + MAC密钥来对“标准化的请求字符串”进行加密,计算出消息认证码,MAC算法有hmac-sha-1
、 hmac-sha-256
两种,目前只支持hmac-sha-1
。
mac = HMAC-SHA1(mac_key, 标准化的请求字符串)
, 不同的语言有不同的mac算法的实现, 具体可以参考OAuth SDK
- Mac计算示例
以请求用户基本信息api为例说明:
请求的url: https://open.account.xiaomi.com/user/profile
参数:
clientId=179887661252608&token=eJxjYGAQydknLLCFsVyIR-DxSqdTnQFGfX4yDAwMjAzxQJIheJfnRTDtvAhMM8SE_2FgWDw7Rg3MYzdUMFIwVjABMplzE5MBClYRuw
nonce: 2870867952176701445:23282360
HTTP方法: GET
标准化字符串:
2870867952176701445:23282360\nGET\nopen.account.xiamomi.com\n/user/profile\nclientId=179887661252608&token=eJxjYGAQydknLLCFsVyIR-DxSqdTnQFGfX4yDAwMjAzxQJIheJfnRTDtvAhMM8SE_2FgWDw7Rg3MYzdUMFIwVjABMplzE5MBClYRuw\n
Mac Key: ORhx44qK6Alqf8vt2rGB5f-oPq0
签名结果输出(Base64之后的结果): 9uvros2WcjMaJ3pH25eQZU9p5pA=
1.2 MAC请求格式
- Header格式说明
采用MAC签名验证调用API,需要将相关签名信息放入请求的http请求的 Header 中,第三方在发送API请求时需要在请求Header中添加 Authorization 字段。Authorization字段内容如下:Authorization: MAC access_token="token value",nonce="随机码" ,mac="签名值"
- 字段含义说明:
access_token : 授权时下发的access_token
nonce: 随机串,计算mac时候使用的nonce
mac: 按照上面的方法计算得到的结果(例如:9uvros2WcjMaJ3pH25eQZU9p5pA=
)
2. 验证用户密码接口_xmSign验证算法
验证用户密码接口 _xmSign
是基于API MAC签名算法来的, 区别在于MAC签名计算签名的时候使用的是Mac_key, _xmSign
计算用的是client_secret。
_xmSign= HmacSha1(client_secret, Callback标准化字符串)
, 其中_xmNonce
和_xmSign
不参与标准化。
2.1 _xmSign签名验证示例
第三方提供的Callback: http://third_url.com/xm
小米验证成功之后调用callback:
http://third_url.com/xm?xmResult=true&xmUserId=1909031&code=93D6A6663C1095587F68281E654D5526&_xmNonce=5964262989045079397%3A24012419&_xmSign=m%2FM1Ia6fOBfKWUbae5G5UXnqh5I%3D
其中_xmNonce=5964262989045079397:24012419
,_xmSign=m/M1Ia6fOBfKWUbae5G5UXnqh5I=
参数: xmResult=true&xmUserId=1909031&code=93D6A6663C1095587F68281E654D5526
(_xmNonce
和_xmSign
不参与标准化)
nonce: 5964262989045079397:24012419
HTTP方法: GET
标准化字符串:
5964262989045079397:24012419\nGET\nxiaomi.com\n/\n&code=93D6A6663C1095587F68281E654D5526&xmUserId=1909031&xmResult=true\n
client secret: ORhx44qK6Alqf8vt2rGB5f-oPq0
签名结果输出(Base64之后的结果): m/M1Ia6fOBfKWUbae5G5UXnqh5I=