目录
安全认证
安全认证机制
整体流程

名词解释
App: 开发者开发之应用
SDK: MIMC SDK
appProxyService: 代理认证服务
TokenService: 小米认证服务
appId: 应用ID,小米开放平台申请分配
appKey: 应用Key,小米开放平台申请分配
appSec: 应用Sec,小米开放平台申请分配
appAccount: 应用账号系统内用户账号ID,应用账号系统内唯一
token: 小米认证服务(TokenService)下发Token
服务端实现代理认证服务
服务端实现代理认证服务(appProxyService),顺序做以下事情:
1. 代理认证服务存储appKey/appSec等敏感数据
访问小米认证服务需要appKey/appSec等,这些数据非常敏感,
如果放在应用端代码中会非常容易泄露,而且一旦泄漏无法更新,
而存储在代理认证服务,则泄露风险很低,一旦泄露也可以快速更新。
2. 代理认证服务做账号合法性认证
代理认证服务需要保证登录的appAccount在其账号系统内是合法有效的
3. 调用小米认证服务(TokenService)
代理认证服务在保证用户合法以后,调用小米认证服务,
并将[小米认证服务下发的原始数据]适当封装后,返回给安全认证接口
应用端实现安全认证接口
应用端实现安全认证接口,做以下事情:
1. 访问代理认证服务(appProxyService)
2. 代理认证服务返回结果中解析[小米认证服务下发的原始数据]并返回
注意:
访问代理认证服务(appProxyService)传入的appAccount,
必须与User构造函数传入的appAccount相同
各语言平台SDK安全认证接口实现逻辑:
Android:
Java:
C++:
实现MIMCTokenFetcher.fetchToken(),同步访问代理认证服务,
从代理认证服务返回结果中解析[小米认证服务下发的原始数据]并返回
WebJS:
实现function fetchMIMCToken(),同步访问代理认证服务,
从代理认证服务返回结果中解析[小米认证服务下发的原始数据]并返回
C#:
实现IMIMCTokenFetcher.fetchToken(),同步访问代理认证服务,
从代理认证服务返回结果中解析[小米认证服务下发的原始数据]并返回
iOS:
初始化NSMutableURLRequest,用于异步访问应用代理认证服务
实现parseTokenDelegate,从NSMutableURLRequest异步返回结果中
解析[小米认证服务下发的原始数据]并返回
GO:
实现FetchToken() *string,同步访问代理认证服务,
从代理认证服务返回结果中解析[小米认证服务下发的原始数据]并返回
如何调用小米认证服务
参数列表
Variable | Meanings |
---|---|
$appId | 小米开放平台申请的AppId |
$appKey | 小米开放平台申请的AppKey |
$appSecret | 小米开放平台申请的AppSecret |
$appPackage | 小米开放平台申请的AppPackage |
$regionKey | 表示地区关键词,不传时默认为REGION_CN。REGION_CN(中国)、REGION_US(美国)、REGION_RU(俄罗斯) 、REGION_IN(印度)、REGION_DE(法兰克福)、REGION_SGP(新加坡) |
$appAccount | 用户在APP账号系统内唯一ID |
$chid | MIMC服务的标识,为常量9 |
$uuid | $appAccount在MIMC内对应userId,开发者可忽略 |
$token | $appAccount在MIMC系统中的token |
HTTP 请求
接口1: curl "https://mimc.chat.xiaomi.net/api/account/token" -XPOST -d '{"appId":$appId,"appKey":$appKey,"appSecret":$appSecret,"appAccount":$appAccount}' -H "Content-Type: application/json"
接口2: curl "https://mimc.chat.xiaomi.net/api/account/token" -XPOST -d '{"appId":$appId,"appKey":$appKey,"appSecret":$appSecret,"appAccount":$appAccount,"regionKey":$regionKey}' -H "Content-Type: application/json"
JSON结果
{ "code": 200, "message": "success", "data": { "appId": $appId, "appPackage": $appPackage, "appAccount": $appAccount, "miChid": $chid, "miUserId": $uuid, "miUserSecurityKey": $appSecret, "token": $token, "regionBucket": $regionBucket, "feDomainName": $feDomainName, "relayDomainName": $relayDomainName } }
备注:对于以上JSON结果,应用方不需要理解其格式,最终通过安全认证接口原样返回即可
如何处理token泄露
当小米安全认证的token信息泄露时,可以调用如下的kick接口使已泄露token过期。
参数列表
Variable | Meanings |
---|---|
$appId | 小米开放平台申请的AppId |
$appKey | 小米开放平台申请的AppKey |
$appSecret | 小米开放平台申请的AppSecret |
$appAccount | 用户在APP账号系统内唯一ID |
$appAccountEncode | 用户在APP账号系统内唯一ID |
$userToken | token泄露的appAccount的token(使用user.getToken()获取) |
注意:
token的获取使用User.getToken()方法。
身份认证有两种方式:1.token; 2.app信息,app账号($appKey,$appSecret,$appAccount)。
当两种认证信息都存在时,优先验证前者。前者一般用于app客户端,后者一般用于app服务端。下面给出了这两种的使用方式。
以下所有的http接口中,如果传入的appAccount是-H参数且含有中文,那么就需要做下面两件事(不含中文则不需要):
(1)将appAccount进行base64编码之后再传入;
(2)需要加上appAccountEncode参数,表示对appAccount进行了base64编码;
-H "appAccountEncode:base64"
HTTP 请求
curl "https://mimc.chat.xiaomi.net/api/account/kick" -XPOST -H "Content-Type: application/json" -H "appId:$appId" -H "token:$userToken" curl "https://mimc.chat.xiaomi.net/api/account/kick" -XPOST -H "Content-Type: application/json" -H "appId:$appId" -H "appKey:$appKey" -H "appSecret:$appSecret" -H "appAccount:$appAccount"
JSON结果
{ "code": 200, "message": "success" }