RoomKit
  • iOS : Objective-C
  • Android
  • macOS
  • Windows
  • Web
  • 小程序
  • Flutter
  • React Native
  • 产品简介
    • 概述
    • 发布日志
  • 开通 RoomKit 服务
  • 下载
  • 体验 App
  • 快速开始
  • 进阶功能
  • 客户端 API
  • 服务端 API
  • 常见错误码
  • 常见问题
  • 文档中心
  • RoomKit
  • 服务端 API
  • RoomKit 服务端 API
  • 获取服务器 AccessToken

获取服务器 AccessToken

更新时间:2022-06-17 19:25

1 描述

获取服务器 access_token,用于调用服务端 API 时进行鉴权。

2 接口原型

  • 请求方法:POST

  • 请求地址:

    服务环境 调用频率限制 请求地址
    国内正式环境
    10 次/秒
    https://roomkit-api.zego.im/auth/get_access_token
  • 传输协议:HTTPS

3 请求参数

参数 类型 是否必选 示例 描述
token
String
"CIE7hNPK6Y55DeUJBSDrInP"
后台服务认证凭证。
secret_id
Int
12580
创建企业时,ZEGO 分配的 secret ID【登录 RoomKit 管理后台,在鉴权信息页面中获取】。

token 生成规则说明:

我们提供了 Postman Collection 帮助您调测,内含本参数的生成逻辑,您可参考 服务端 API 调测指南 使用 Postman 快速调试该接口。

tokenInfo = '{
    "ver": 1,
    "hash": "adfdkjakka1213aa",
    "nonce": "1b9c42gh1k0ax19y",
    "expired": 1531446463
}'
注意这里要先构造 JSON,再转成字符串。

token = base64(tokenInfo)

token 字段说明:

参数 类型 是否必选 描述
ver
Int
版本号,默认填 1。
hash
String
  • C:hash = md5sum(sprintf("%u%s%s%u",secret_id, secret_key, nonce, expired))
  • Python: md5("%d%s%s%d"%("secret_id", "secret_key".lower(), "nonce", expire\_second)))
  • Golang: fmt.Sprintf("%x", md5.Sum([]byte(fmt.Sprintf("%d%s%s%d",secret_id, strings.ToLower(secret_key), "nonce", expire\_second))))

md5sum 最终结果为 32 字节小写 hex 编码。
nonce
String
随机串,8 bytes。
expired
Int
请求参数中的 token 的失效时间,Unix 时间戳,单位:秒,(例:time.now().unix()[当前时间戳]+3600[有效期])。

hash 字段说明:

参数 类型 是否必选 描述
secret_id
Int
创建企业时,ZEGO 分配的 secret ID【登录 RoomKit 管理后台,在鉴权信息页面中获取】。
secret_key
String
创建企业时,ZEGO 分配的 secret key【登录 RoomKit 管理后台,在鉴权信息页面中获取】。
nonce
String
随机串,8 bytes。跟 token 中的 nounce 保持一致。
expired
Int
请求参数中的 token 失效时间,Unix 时间戳,单位:秒。跟 token 中的 expired 保持一致。

4 请求示例

以下是 access_token 接口的请求示例。

{
    "token" : "CIE7hNPK6Y55DeUJBSDrInP",
    "secret_id": 12580
}

5 响应参数

参数 类型 示例 描述
ret
Object
-
接口调用结果。
ret.code
Int
0
错误码。
ret.msg
String
"succeed"
错误信息。
ret.version
String
"1.0.0"
版本号。
data
Object
-
接口调用返回数据。
data.access_token
String
"access_token_value"
服务端返回的 access_token。
data.expires_in
Int
3600
access_token 过期时间,单位:秒。

6 响应示例

以下是 access_token 接口的响应示例。

{
    "ret": {
        "code": 0,
        "msg": "succeed",
        "version": "1.0.0"
    },
    "data": {
        "access_token": "access_token",
        "expires_in": 7200
    }
}

7 示例代码

7.1 Python 示例代码

import base64
import time
import hashlib
import json
import requests

# secret_id 创建企业时,ZEGO 分配的 整型 secret ID
# secret_key 创建企业时,ZEGO 分配的 字符串长度为32的 secret key
def get_access_token(secret_id, secret_key):
    nonce = 'asdasdss'
    expire_second = int(time.mktime(time.localtime(time.time()))) + 3600
    hashSrc = ("%d%s%s%d" % (secret_id, secret_key.lower(), nonce, expire_second))
    hash = hashlib.md5(hashSrc.encode()).hexdigest()
    tokeninfo1 = {"ver": 1, "hash": hash, "nonce": nonce, "expired": expire_second}
    tokeninfo = json.dumps(tokeninfo1)
    token = base64.b64encode(tokeninfo.encode()).decode()
    url = 'https://roomkit-api.zego.im/auth/get_access_token'
    data = {
        "token": token,
        "secret_id": secret_id
    }
    r = requests.post(url=url, json=data)
    respondStr = r.content.decode()
    access_token = json.loads(respondStr)["data"]["access_token"]
    return access_token

7.2 Golang 示例代码

import (
    "bytes"
    "crypto/md5"
    "encoding/base64"
    "encoding/json"
    "errors"
    "fmt"
    "io/ioutil"
    "net/http"
    "strings"
    "testing"
    "time"
)

// secret_id 创建企业时,ZEGO 分配的 整型 secret ID
// secret_key 创建企业时,ZEGO 分配的 字符串长度为32的 secret key
func GetAccessToken(secretId int, secretKey string) (accessToken string, err error) {
    nonce := "asdasdss"
    expired := time.Now().Unix() + 3600

    m := md5.New()
    m.Write([]byte(fmt.Sprintf("%d%s%s%d", secretId, strings.ToLower(secretKey), nonce, expired)))
    hash := fmt.Sprintf("%x", m.Sum(nil))

    var tokenInfo struct{
        Ver     int     `json:"ver"`
        Hash     string    `json:"hash"`
        Nonce     string    `json:"nonce"`
        Expired int     `json:"expired"`
    }
    tokenInfo.Hash = hash
    tokenInfo.Expired = int(expired)
    tokenInfo.Ver = 1
    tokenInfo.Nonce = nonce
    tokenInfoStr, _ := json.Marshal(tokenInfo)

    var reqStruct struct{
        SecretId     int     `json:"secret_id"`
        Token         string    `json:"token"`
    }
    reqStruct.SecretId = secretId
    reqStruct.Token = base64.StdEncoding.EncodeToString(tokenInfoStr)
    reqBody, _ := json.Marshal(reqStruct)

    req, err := http.NewRequest(http.MethodPost, "https://roomkit-api.zego.im/auth/get_access_token", bytes.NewBuffer(reqBody))
    req.Header.Set("Content-Type", "application/json")

    client := &http.Client{}
    var resp *http.Response
    resp, err = client.Do(req)
    if err != nil {
        return
    }
    defer resp.Body.Close()

    var respBody []byte
    respBody, err = ioutil.ReadAll(resp.Body)
    if err != nil {
        return
    }

    var ret struct{
        Ret struct{
            Code     int     `json:"code"`
            Msg     string    `json:"msg"`
            Version string    `json:"version"`
        }                    `json:"ret"`
        Data struct{
            AccessToken     string    `json:"access_token"`
            ExpiresIn        int     `json:"expires_in"`
        }
    }

    err = json.Unmarshal(respBody, &ret)
    if err != nil {
        return
    }
    if ret.Ret.Code != 0 {
        return "", errors.New(ret.Ret.Msg)
    }

    return ret.Data.AccessToken, nil
}

7.3 Java 示例代码

package demo;

import java.io.UnsupportedEncodingException;
import java.security.*; 
import java.util.*;

import com.alibaba.fastjson.*;

public class tokenTest {

    public static void main(String[] args) throws UnsupportedEncodingException {
        long current_time = System.currentTimeMillis()/1000; //获取当前unix时间戳
        long expired_time = current_time+3600; //过期unix时间戳,单位:秒

        String secretId = "1000000";  // 创建企业时,ZEGO 分配的 整型 secret ID
        String secretKey = "123456abcdefghijklmnopqrstuvwxyz";  // 创建企业时,ZEGO 分配的 字符串长度为32的 secret key
        String nonce = "xxxxxxxxx"; //自定义的随机字符串

        // 待加密信息
        String originString = secretId + secretKey + nonce + Long.toString(expired_time);

        //hash加密
        String hashString = getMD5(originString);

        //定义一个tokeninfo json 
        LinkedHashMap  hashMap = new LinkedHashMap();

        hashMap.put("ver",1);
        hashMap.put("hash",hashString);
        hashMap.put("nonce",nonce);
        hashMap.put("expired",expired_time);
        String  tokeninfo= JSON.toJSONString(hashMap);

        //Base64 加密
        final Base64.Encoder encoder = Base64.getEncoder();   //加密
        final byte[] textByte = tokeninfo.getBytes("UTF-8");

        final String encodeToken = encoder.encodeToString(textByte);
        System.out.println("--token--:"+encodeToken);
    }

    //生成MD5
    public static String getMD5(String message) {
        String md5 = "";
        try {
            MessageDigest md = MessageDigest.getInstance("MD5");  // 创建一个md5算法对象
            byte[] messageByte = message.getBytes("UTF-8");
            byte[] md5Byte = md.digest(messageByte);              // 获得MD5字节数组,16*8=128位
            md5 = bytesToHex(md5Byte);                            // 转换为16进制字符串
        } catch (Exception e) {
            System.out.println("erro md5 creat!!!!");
            e.printStackTrace();
        }
        return md5;
    }

     // 二进制转十六进制
    public static String bytesToHex(byte[] bytes) {
        StringBuffer hexStr = new StringBuffer();
        int num;
        for (int i = 0; i < bytes.length; i++) {
            num = bytes[i];
             if(num < 0) {
                 num += 256;
            }
            if(num < 16){
                hexStr.append("0");
            }
            hexStr.append(Integer.toHexString(num));
        }
        return hexStr.toString();
    }
}

/**
 * 最后,将生成的Token复制到以下curl -X POST替换掉其中的token,修改对应的secret_id,然后取请求得到正确的"access_token"
 * 
 * */

// curl -X POST https://roomkit-api.zego.im/auth/get_access_token -d '{"secretId": 1000000,"token": encode_token}'

7.4 Php 示例代码

<?php

$current_time = time(); //获取当前时间
$expired_time = $current_time + 3600; //过期时间,单位:秒

$secretId = 1000000; // 创建企业时,ZEGO 分配的 整型 secret ID
$secretKey = "123456abcdefghijklmnopqrstuvwxyz"; // 创建企业时,ZEGO 分配的 字符串长度为32的 secret key
$nonce = "xxxxxxxxx"; //自定义的随机字符串

// 待加密信息
$origin = $secretId . $secretKey . $nonce . $expired_time;

//hash加密
$hash = md5($origin);

$token = [
    'ver' => 1,
    'hash' => $hash,
    'nonce' => $nonce,
    'expired' => $expired_time
];
//定义一个tokeninfo json 
$token = json_encode($token);

//Base64 加密
$encode_token = base64_encode($token);

echo $encode_token;


/**
 * 最后,将生成的Token复制到以下curl -X POST替换掉其中的token,修改对应的secret_id,然后取请求得到正确的"access_token"
 * 
 * */

// curl -X POST https://roomkit-api.zego.im/auth/get_access_token -d '{"secretId": 1000000,"token": encode_token}'
?>
本篇目录