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", "申请时间戳")
    1. Growing Server 收到数据后,会用请求的 body 和 key 做同样的加密,计算是不是匹配。如果匹配,返回认证码给 Client Server。
  3. 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 ""