Skip to content

Latest commit

 

History

History
131 lines (96 loc) · 5.58 KB

authentication.md

File metadata and controls

131 lines (96 loc) · 5.58 KB

GrowingIO API 认证

术语

认证

____________                  ___________    (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", "申请时间戳")

    PHP版本示例代码

    <?php
    
    function authToken($secret, $project, $ai, $tm) {
        $str = "POST\n/auth/token\nproject=${project}&ai=${ai}&tm=${tm}";
        $signature = hash_hmac("sha256", $str, $secret);
        return $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 https://www.growingio.com/auth/token

Authorization

在 Header 里面添加一个属性:

名字 类型 描述 示例
X-Client-Id String GrowingIO 分配的公钥,请在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"
   }