GrowingIO API 认证

2
梦回
ho
Last updated last month

1.术语

  • 公钥( X-Client-Id): GrowingIO 分配的项目公钥,请求时用来做身份校验的一串字符码,请在项目配置页面获取

  • 私钥: 双方所约定的加密算法的私钥

  • ai: 项目ID,可在项目配置中获得,也是集成 SDK 时 setAccountId 所用的部分。

  • project: 项目UID,访问项目的时候,页面 URL 以 /projects/:project_uid 开头,例如 https://www.growingio.com/admin/projects/nxog09md/dashboard中的nxog09md

  • auth: 通过认证算法计算出来的签名,见第二部分示例代码

  • tm: 当前请求时间戳(unix 毫秒时间戳)

2.认证

____________ ___________ (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)和私钥。具体认证步骤如下。

  • 用户打开客户页面,会向 Client Server 发起一个请求

  • Client Server 在渲染页面时,会向 Growing Server 做认证请求,请求参数包括 ai, project 和 auth,头部参数包含 公钥(X-Client-Id )。

3.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

Post body采用raw格式上传而不是key-value键值对方式上传。如:project=123abc&ai=2a1b4018cd954ec2bcc69da5138bdb96&tm=1465020309123&auth=ab3i5dazoo58314l0qqrj1aslfj1ldfaqeroqi

Response

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

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

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