生成Token

最近更新时间:2023-02-21 10:39:53

本文展示如何使用 anyRTC 提供的代码在服务端生成 RTC Token。

RTC Token 在你的业务服务端生成。用户登录 RTC 系统时,客户端需要向服务端申请 RTC Token;服务器生成 RTC Token 后,再将其传给客户端。

前提条件

生成 RTC Token

请参考 anyRTC 在 GitHub 的Demo ARDynamicKey ,支持使用 C++、Java、Python、PHP、Node.js、Go 语言在你的服务端部署生成 RTM Token。下图以 C++ 为例,展示生成 RTM Token 代码的文件结构:

./sample/RtcTokenBuilderSample.cpp 文件包含用于生成 RTC Token 的示例代码。

./src/RtcTokenBuilder.h 文件包含用于生成 RTC Token 的 API 源代码。

C++

int main(int argc, char const *argv[]) {
  // 请填入你的项目 App ID
  std::string appID  = "xxxxxxxxxxxxxxxxxxxxxxxx";
  // 请填入你的项目权限密钥
  std::string  appCertificate = "xxxxxxxxxxxxxxxxxxxxxxxx";
  // 请填入频道名称
  std::string channelName= "123456";
  // 请填入用户 ID
  std::string userAccount = "test_user_id";
  uint32_t expirationTimeInSeconds = 3600;
  uint32_t currentTimeStamp = time(NULL);
  uint32_t privilegeExpiredTs = currentTimeStamp + expirationTimeInSeconds;
  std::string result;
  result = RtcTokenBuilder::buildTokenWithUserAccount(
      appID, appCertificate, channelName, userAccount, UserRole::Role_Publisher,
      privilegeExpiredTs);
  std::cout << "Token With UserAccount:" << result << std::endl;
  return 0;
}

参考步骤

开始前请确保已安装 openssl 库。

  1. ARDynamicKey 仓库下载或克隆至本地。

  2. 打开 ARDynamicKey/cpp/sample/RtcTokenBuilderSample.cpp 文件,使用自己的 App ID、权限密钥、频道名称、用户 ID 替换示例代码中的值。

  3. 进入 RtcTokenBuilderSample.cpp 所在路径,然后运行如下命令行。运行结束后,相同文件夹下会生成一个可执行文件 RtcTokenBuilderSample

      g++ -std=c++0x -O0 -I../../ -L. RtcTokenBuilderSample.cpp -lz -lcrypto -o RtcTokenBuilderSample
    
  4. 运行如下命令行生成 RTC Token。生成的 RTC Token 会显示在 Terminal 中。

      ./RtcTokenBuilderSample
    

Java

    public class RtcTokenBuilderSample {
    // 请填入你的项目 App ID   
    static String appId = "xxxxxxxxxxxxxxxxxxxxxxxx";
    // 请填入你的项目权限密钥
    static String appCertificate = "xxxxxxxxxxxxxxxxxxxxxxxx";
    // 请填入频道名称
    static String channelName = "123456";
    // 请填入用户 ID
    static String userAccount = "test_user_id";
    // Token 服务过期时间
    static int expirationTimeInSeconds = 3600; 

    public static void main(String[] args) throws Exception {
        RtcTokenBuilder token = new RtcTokenBuilder();
        int timestamp = (int)(System.currentTimeMillis() / 1000 + expirationTimeInSeconds);
        String result = token.buildTokenWithUserAccount(appId, appCertificate,  
                 channelName, userAccount, Role.Role_Publisher, timestamp);
        System.out.println(result);
    }

参考步骤

  1. ARDynamicKey 仓库下载或克隆至本地。

  2. 在你的 Java IDE 中打开 ARDynamicKey/java 文件。

  3. 打开 ARDynamicKey/java/src/main/java/io/ar/sample/RtcTokenBuilderSample.java 文件。使用自己的 App ID、权限密钥、用户 ID 、频道名称替换示例代码中的值。

  4. 在你的 Java IDE 中运行项目。生成的 RTC Token 会显示在 IDE 中。

Python

    // 请填入你的项目 App ID
    appID = "xxxxxxxxxxxxxxxxxxxxxxxx"
    // 请填入你的项目权限密钥
    appCertificate = "xxxxxxxxxxxxxxxxxxxxxxxx"
    // 请填入频道名称
    channelName = "123456"
    // 请填入用户 ID
    userAccount = "test_user_id"
    // Token 服务过期时间
    expireTimeInSeconds = 3600
    currentTimestamp = int(time.time())
    privilegeExpiredTs = currentTimestamp + expireTimeInSeconds


    def main():
        token = RtcTokenBuilder.buildTokenWithAccount(appID, appCertificate, channelName, userAccount, Role_Attendee, privilegeExpiredTs)
        print("Token with user account: {}".format(token))

    if __name__ == "__main__":
        main()

参考步骤

  1. ARDynamicKey 仓库下载或克隆至本地。

  2. 打开 ARDynamicKey/python/sample/RtmTokenBuilderSample.py 文件。使用自己的 App ID、权限密钥、用户 ID、频道名称替换示例代码中的值。

  3. 进入 RtcTokenBuilderSample.py 所在路径,然后运行如下命令行生成 RTC Token。 生成的 RTC Token 会显示在 Terminal 中。

  4. python RtcTokenBuilderSample.py

Python3

    // 请填入你的项目 App ID
    appID = "xxxxxxxxxxxxxxxxxxxxxxxx"
    // 请填入你的项目权限密钥
    appCertificate = "xxxxxxxxxxxxxxxxxxxxxxxx"
    // 请填入频道名称
    channelName = "123456"
    // 请填入用户 ID
    userAccount = "test_user_id"
    // Token 服务过期时间
    expireTimeInSeconds = 3600
    currentTimestamp = int(time.time())
    privilegeExpiredTs = currentTimestamp + expireTimeInSeconds


    def main():
        token = RtcTokenBuilder.buildTokenWithAccount(appID, appCertificate, channelName, userAccount, Role_Attendee, privilegeExpiredTs)
        print("Token with user account: {}".format(token))

    if __name__ == "__main__":
        main()

开始前请确保已安装 Python 3,且运行环境为 Python 3。你可以运行如下命令行查询当前 Python 版本。

参考步骤

  1. ARDynamicKey 仓库下载或克隆至本地。

  2. 打开 ARDynamicKey/python3/sample/RtcTokenBuilderSample.py 文件。使用自己的 App ID、权限密钥、用户 ID、频道名称替换示例代码中的值。

  3. 进入 RtcTokenBuilderSample.py 所在路径,然后运行如下命令行生成 RTC Token。 生成的 RTC Token 会显示在 Terminal 中。

  4. python RtcTokenBuilderSample.py

PHP

    // 请填入你的项目 App ID
    $appID = "xxxxxxxxxxxxxxxxxxxxxxxx";
    // 请填入你的项目权限密钥
    $appCertificate = "xxxxxxxxxxxxxxxxxxxxxxxx";
    // 频道名称
    $channelName = "123456";
    // 请填入用户 ID
    $uidStr = "test_user_id";
    $role = RtcTokenBuilder::RoleSubscriber;
    // Token 服务过期时间
    $expireTimeInSeconds = 3600;
    $currentTimestamp = (new DateTime("now", new DateTimeZone('UTC')))->getTimestamp();
    $privilegeExpiredTs = $currentTimestamp + $expireTimeInSeconds;

    $token = RtcTokenBuilder::buildTokenWithUserAccount($appID, $appCertificate, $channelName, $uidStr, $role, $privilegeExpiredTs);
    echo 'Token with user account: ' . $token . PHP_EOL;

开始前请确保已安装最新版本的 PHP。

参考步骤

  1. ARDynamicKey 仓库下载或克隆至本地。

  2. 打开 ARDynamicKey/sample/RtcTokenBuilderSample.php 文件。使用自己的 App ID、权限密钥、用户 ID、频道名称替换示例代码中的值。

  3. 进入 RtcTokenBuilderSample.php 所在路径,然后运行如下命令行生成 RTC Token。 生成的 RTC Token 会显示在 Terminal 中。

  4. php RtcTokenBuilderSample.php<

Node.js

    // 请填入你的项目 App ID
    const appID = 'xxxxxxxxxxxxxxxxxxxxxxxx';
    // 请填入你的项目权限密钥
    const appCertificate = 'xxxxxxxxxxxxxxxxxxxxxxxx';
    // 频道名称
    const channelName = '123456';
    // 请填入用户 ID
    const account = "2882341273";
    const role = RtcRole.PUBLISHER;
    // Token 服务过期时间
    const expirationTimeInSeconds = 3600

    const currentTimestamp = Math.floor(Date.now() / 1000)

    const privilegeExpiredTs = currentTimestamp + expirationTimeInSeconds

    // IMPORTANT! Build token with either the uid or with the user account. Comment out the option you do not want to use below.

    // Build token with user account
    const tokenB = RtcTokenBuilder.buildTokenWithAccount(appID, appCertificate, channelName, account, role, privilegeExpiredTs);
    console.log("Token With UserAccount: " + tokenB);

开始前请确保已安装最新版本的 Node.js LTS 版本。

参考步骤

  1. ARDynamicKey 仓库下载或克隆至本地。

  2. 打开 ARDynamicKey/nodejs/sample/RtcTokenBuilderSample.js 文件。使用自己的 App ID、权限密钥、用户 ID 替换示例代码中的值。

  3. 进入 RtcTokenBuilderSample.js 所在路径,然后运行如下命令行生成 RTC Token。 生成的 RTC Token 会显示在 Terminal 中。

  4. node RtcTokenBuilderSample.js

Go

    // 请填入你的项目 App ID
    appID := "xxxxxxxxxxxxxxxxxxxxxxxx"
    // 请填入你的项目权限密钥
    appCertificate := "xxxxxxxxxxxxxxxxxxxxxxxx"
    // 频道名称
    channelName := "123456"
    // 请填入用户 ID
    uidStr := "test_user_id"
    // Token 服务过期时间
    expireTimeInSeconds := uint32(3600)
    currentTimestamp := uint32(time.Now().UTC().Unix())
    expireTimestamp := currentTimestamp + expireTimeInSeconds

    result, err = rtctokenbuilder.BuildTokenWithUserAccount(appID, appCertificate, channelName, uidStr, rtctokenbuilder.RoleAttendee, expireTimestamp)
    if err != nil {
        fmt.Println(err)
    } else {
        fmt.Printf("Token with userAccount: %s\n", result)
    }

开始前请确保已安装最新版本的 Golang。

参考步骤

  1. ARDynamicKey 仓库下载或克隆至本地。

  2. 打开 ARDynamicKey/go/sample/RtcTokenBuilder/sample.go 文件。使用自己的 App ID、权限密钥、用户 ID、频道名称替换示例代码中的值。

  3. 进入 sample.go 所在路径,然后运行如下命令行。 运行结束后,相同文件夹下会生成一个可执行文件 RtcTokenBuilder

    go build

  4. 运行如下命令行生成 Token。生成的 Token 会显示在 Terminal 中。

    ./RtcTokenBuilder

参数说明

下文以 C++ 的 API 为例,介绍生成 RTM Token 的 API 参数含义。具体参数解释也适用于其他语言。

 static std::string buildTokenWithUserAccount(
        const std::string& appId,
        const std::string& appCertificate,
        const std::string& channelName,
        const std::string& userAccount,
        UserRole role,
        uint32_t privilegeExpiredTs = 0);
 
参数描述
appId项目 App ID。
appCertificate项目权限密钥。
channelName字符串长度不可超过 64 字节。不可设为空、null 或 "null"。支持以下字符集范围:
  • 26 个小写英文字母 a-z
  • 26 个大写英文字母 A-Z
  • 10 个数字 0-9
  • 空格
  • 常规符号等
  • userAccount用户 ID,64位字符串类型。如果不填或设置为nil,SDK 会自动分配一个。 规则同 channelName 。
    userRole用户角色。暂时只支持一种角色,请使用默认值 Role_Publisher = 1。 注:使用 php 生成 Token 时请勿携带。
    privilegeExpiredTsToken 过期的 Unix 时间戳,单位为秒。该值为当前时间戳和 Token 有效期的总和。 例如,如果你将 privilegeExpiredTs 设为当前时间戳再加 600 秒,则 Token 会在 10 分钟内过期。 Token 的最大有效期为 24 小时。 如果你将此参数设为 0,或时间长度超过 24 小时,Token 有效期依然为 24 小时。

    注意事项

    参数匹配

    生成 RTC Token 时填入的参数,需要加入频道时填入的参数一致。

    权限密钥与 RTC Token

    生成 RTC Token 需要先在控制台启用对应项目的权限密钥。项目一旦开启了权限密钥功能,就必须使用 RTC Token 鉴权。

    RTC Token 过期

    Token 的最大有效期为 24 小时。为保证通信体验,anyRTC 会在 Token 即将过期或已经过期时,分别触发以下回调:

    • onTokenPrivilegeWillExpire:该回调表示 Token 即将失效。
    • onRequestToken(Web 平台为 onTokenPrivilegeDidExpire):该回调表示 Token 已经失效。

    收到任一回调后,你需要在服务端重新生成 Token,然后调用 renewToken 方法更新 Token。