1.API MAC簽名算法
小米開放平臺一些API需要進行MA C驗證,在調用API時用MAC加密算法對請求進行加密,并將結果放到請求的header中。
1.1 MAC計算
·請求內容標準化
標準化的請求字符串,就是用指定的請求屬性按照某個規(guī)則拼接而成的字符串。在這里,其實標準化請求字符串,就是將nonce,HTTP METHOD,HOST,URI,QUERY以換行符(即:n)為連接符,合并起來得到的字符串(格式串結尾增加n),其中涉及到屬性:
·標準化示例
54897465748976549:21459478nGETnopen.account.xiaomi.comn/user/profilenclientId=xxx&token=xxxn
注意:上述換行符“n”僅用于展示
·MAC計算
客戶端使用MAC算法和MAC密鑰來對“標準化的請求字符串”進行加密計算出消息認證碼,MAC算法有hmac-sha-1和hmac-sha-256兩種,我們目前只支持hmac-sha-1。
mac=HMAC-SHA1(mac_key,標準化的請求字符串)
MAC計算示例,以請求用戶基本信息API為例說明:
請求地址:https://open.account.xiaomi.com/user/profile
請求參數(shù):
clientId=179887661252608&token=eJxjYGAQydknLLCFsVyIR-DxSqdTnQFGfX4yDAwMjAzxQJIheJfnRTDtvAhMM8SE_2FgWDw7Rg3MYzdUMFIwVjABMplzE5MBClYRuw
nonce:2870867952176701445:23282360
HTTP方法:GET
拼接得到標準化字符串:
2870867952176701445:23282360nGETnopen.account.xiamomi.comn/user/profilenclientId=179887661252608&token=eJxjYGAQydknLLCFsVyIR-DxSqdTnQFGfX4yDAwMjAzxQJIheJfnRTDtvAhMM8SE_2FgWDw7Rg3MYzdUMFIwVjABMplzE5MBClYRuwn
Mac Key:
ORhx44qK6Alqf8vt2rGB5f-oPq0
簽名結果輸出(已Base64編碼):
9uvros2WcjMaJ3pH25eQZU9p5pA=
1.2 MAC請求格式
·Header格式說明
采用MAC簽名驗證調用API,需要將相關簽名信息放入請求的HTTP請求的header中,第三方在發(fā)送API請求時需要在請求header中添加Authorization字段。Authorization字段內容如下:
Authorization:MAC access_token="token value",nonce="隨機碼",mac="簽名值"
·字段說明:
access_token:授權時下發(fā)的訪問令牌
nonce:隨機串,計算mac時候使用的nonce
mac:按照上面的方法計算得到的結果(例如:9uvros2WcjMaJ3pH25eQZU9p5pA=)
2._xmSign簽名算法
驗證用戶密碼接口中的_xmSign字段基于API MAC簽名算法生成,兩者的區(qū)別在于MAC簽名計算簽名的時候使用的是mac_key,_xmSign計算用的是client_secret。
_xmSign=HmacSha1(client_secret,callback標準化字符串)
其中_xmNonce和_xmSign不參與標準化。
_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=
參數(shù):
xmResult=true&xmUserId=1909031&code=93D6A6663C1095587F68281E654D5526(_xmNonce和_xmSign不參與標準化)
nonce:5964262989045079397:24012419
HTTP方法:GET
拼接得到的標準化字符串:
5964262989045079397:24012419nGETnxiaomi.comn/n&code=93D6A6663C1095587F68281E654D5526&xmUserId=1909031&xmResult=truen
client secret:
ORhx44qK6Alqf8vt2rGB5f-oPq0
簽名結果輸出(已Base64編碼):
m/M1Ia6fOBfKWUbae5G5UXnqh5I=