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算法有hmac-sha-1hmac-sha-256两种,目前只支持hmac-sha-1

mac = HMAC-SHA1(mac_key, 标准化的请求字符串), 不同的语言有不同的mac算法的实现, 具体可以参考OAuth SDK

以请求用户基本信息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请求格式

  采用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=