目录

安全认证

安全认证机制

整体流程

名词解释
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"
    }
    

回到顶部

results matching ""

    No results matching ""