GrowingIO接口认证

术语

  • 公钥: 请求时用来做身份校验的一串字符码
  • 私钥: 双方所约定的加密算法的私钥
  • X-Client-Id: GrowingIO 分配的项目公钥
  • ai: 项目ID,可在项目管理的项目概览里获得这串ID,也是集成 SDK 时 setAccountId 所用的部分。
  • project: 项目UID,访问项目的时候,页面 URL 以 /projects/:project_uid 开头,里面的 project_uid 即要传输的项目UID
  • auth: 通过认证算法计算出来的签名,见第二部分示例代码
  • tm: 当前请求时间戳

认证

____________                  ___________    (ai/project/auth)   _____________
|          |                 |           |--(B) Authorization ->|             |
|          |--(A) Request  ->|   Client  |                      |             |
|  Client  |<-(D)-- Code  ---|   Server  |<--(C) Auth Grant  ---|  GrowingIO  |
|          |                 |___________|     (Auth Code)      |   Server    |
|          |                                                    |             |
|          |--(E)------------  Access Code  ------------------> |             |
|__________|                                                    |_____________|

GrowingIO 会给每个项目分配个公钥(X-Client-Id)和私钥。具体认证步骤如下。

  1. 用户打开客户页面,会向 Client Server 发起一个请求
  2. Client Server 在渲染页面时,会向 Growing Server 做认证请求,请求参数包括 ai, project 和 auth,头部参数包含 X-Client-Id。

    POST https://www.growingio.com/auth/token -H "X-Client-Id: client-id" -d "project=123abc&ai=13411891aaffda&tm=1465020309123&auth=ab3i5dazoo58314l0qqrj1aslfj1ldfaqeroqi"
    

    其中,auth 的计算方式是,

    Java 版本示例代码

    public String authToken(String secret, String project, String ai, Long tm) throws Exception {
      String message = "POST\n/auth/token\nproject="+project+"&ai="+ai+"&tm="+tm;
      Mac hmac = Mac.getInstance("HmacSHA256");
      hmac.init(new SecretKeySpec(secret.getBytes("UTF-8"), "HmacSHA256"));
      byte[] signature = hmac.doFinal(message.getBytes("UTF-8"));
      return Hex.encodeHexString(signature);
    }
    
    authToken("这里是 GrowingIO 给项目分配的私钥", "项目UID", "项目ID", "申请时间戳")
    

    Scala 版本示例代码

    import javax.crypto.Mac
    import javax.crypto.spec.SecretKeySpec
    import org.apache.commons.codec.binary.Hex
    
    def authToken(secret: String, project: String, ai: String, tm: Long) = {
     val messages = s"POST\n/auth/token\nproject=$project&ai=$ai&tm=$tm"
     val hmac = Mac.getInstance("HmacSHA256")
     hmac.init(new SecretKeySpec(secret.getBytes("UTF-8"), "HmacSHA256"))
     val signature = hmac.doFinal(messages.getBytes("UTF-8"))
     Hex.encodeHexString(signature)
    }
    
    authToken("这里是 GrowingIO 给项目分配的私钥", "项目UID", "项目ID", "申请时间戳")
    

    Python 版本示例代码

    import hashlib
    import hmac
    
    def authToken(secret, project, ai, tm):
      message = ("POST\n/auth/token\nproject=" + project + "&ai=" + ai + "&tm=" + tm).encode('utf-8')
      signature = hmac.new(bytes(secret.encode('utf-8')), bytes(message), digestmod=hashlib.sha256).hexdigest()
      return signature
    
    authToken("这里是 GrowingIO 给项目分配的私钥", "项目UID", "项目ID", "申请时间戳")
    
  3. Growing Server 收到数据后,会用请求的 body 和 key 做同样的加密,计算是不是匹配。如果匹配,返回认证码给 Client Server。

  4. Client Server 拿到认证码后,可以使用这个认证码去请求在 GrowingIO 中的数据,比如看板和单图。

API 定义

Resource

POST /auth/token

Authorization

在 Header 里面添加一个属性:

名字 类型 描述 示例
X-Client-Id String GrowingIO 分配的公钥 X-Client-Id: 123abc

Query Parameter

名字 类型 描述 示例
ai String 项目ID 2a1b4018cd954ec2bcc69da5138bdb96
project String 项目UID 123abc
tm Long 申请时间戳 1465020309123
auth String 加密签名 ab3i5dazoo58314l0qqrj1aslfj1ldfaqeroqi

Response

   {
     "status":"success",
     "code":"2RhY0XZ9xyBfayAPm0aa5CoJhDJkEUcmRiBJBT6XyeIXhHrdz334Tf3I85Esm74Q"
   }

results matching ""

    No results matching ""