生成Token

最近更新时间:2023-09-15 02:31:35

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

服务端生成 RTK Token 的库使用 RTM 生产 Token 的现有服务库

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

前提条件

生成 RTK Token

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

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

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

C++

int main(int argc, char const *argv[]) {
 
  // 请填入你的项目 App ID
  std::string appID  = "xxxxxxxxxxxxxxxxxxxxxxxx";
  // 请填入你的项目权限密钥
  std::string appCertificate = "xxxxxxxxxxxxxxxxxxxxxxxx";
  // 请填入用户 ID
  std::string user= "test_user_id";
  // Token 服务过期时间。
  uint32_t expirationTimeInSeconds = 3600;
  uint32_t currentTimeStamp = time(NULL);
  uint32_t privilegeExpiredTs = currentTimeStamp + expirationTimeInSeconds;
 
  std::string result =
    RtmTokenBuilder::buildToken(appID, appCertificate, user,
        RTKUserRole::RTK_User, privilegeExpiredTs);
  std::cout << "Rtk Token:" << result << std::endl;
  return 0;
 
}

参考步骤

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

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

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

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

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

      ./RtmTokenBuilderSample
    

Java

    // 请填入你的项目 App ID
    private String appId = "xxxxxxxxxxxxxxxxxxxxxxxx";
    // 请填入你的项目权限密钥
    private String appCertificate = "xxxxxxxxxxxxxxxxxxxxxxxx";
    // 请填入用户 ID
    private String userId = "test_user";
    // Token 服务过期时间。
    private int expireTimestamp = 1446455471;

    @Test
    public void testRtmTokenBuilderWithDefalutPriviledge() throws Exception {
        RtmTokenBuilder builder = new RtmTokenBuilder();
        String result = builder.buildToken(appId, appCertificate, userId, Role.Rtm_User, expireTimestamp);
        
        RtmTokenBuilder tester = new RtmTokenBuilder();
        tester.mTokenCreator = new AccessToken("", "", "", "");
        tester.mTokenCreator.fromString(result);
        
        assertEquals(builder.mTokenCreator.appId, tester.mTokenCreator.appId);
        assertEquals(builder.mTokenCreator.crcChannelName, tester.mTokenCreator.crcChannelName);
        assertEquals(builder.mTokenCreator.message.salt, tester.mTokenCreator.message.salt);
    }

参考步骤

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

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

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

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

Python

    // 请填入你的项目 App ID
    appID = "xxxxxxxxxxxxxxxxxxxxxxxx"
    // 请填入你的项目权限密钥
    appCertificate = "xxxxxxxxxxxxxxxxxxxxxxxx"
    // 请填入用户 ID
    user = "test_user_id"
    // Token 服务过期时间。
    expirationTimeInSeconds = 3600
    currentTimestamp = int(time.time())
    privilegeExpiredTs = currentTimestamp + expirationTimeInSeconds

    def main():
        token = RtmTokenBuilder.buildToken(appID, appCertificate, user, Role_Rtm_User, privilegeExpiredTs)
        print("Rtk Token: {}".format(token))

    if __name__ == "__main__":
        main()

参考步骤

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

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

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

  4. python RtmTokenBuilderSample.py

Python3

    // 请填入你的项目 App ID
    appID = "xxxxxxxxxxxxxxxxxxxxxxxx"
    // 请填入你的项目权限密钥
    appCertificate = "xxxxxxxxxxxxxxxxxxxxxxxx"
    // 请填入用户 ID
    user = "test_user_id"
    // Token 服务过期时间。
    expirationTimeInSeconds = 3600
    currentTimestamp = int(time.time())
    privilegeExpiredTs = currentTimestamp + expirationTimeInSeconds

    def main():
        token = RtmTokenBuilder.buildToken(appID, appCertificate, user, Role_Rtm_User, privilegeExpiredTs)
        print("Rtk Token: {}".format(token))

    if __name__ == "__main__":
        main()

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

参考步骤

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

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

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

  4. python RtmTokenBuilderSample.py

PHP

    // 请填入你的项目 App ID
    $appID = "xxxxxxxxxxxxxxxxxxxxxxxx";
    // 请填入你的项目权限密钥
    $appCertificate = "xxxxxxxxxxxxxxxxxxxxxxxx";
    // 请填入用户 ID
    $user = "test_user_id";
    $role = RtmTokenBuilder::RoleRTKUser;
    // Token 服务过期时间。
    $expireTimeInSeconds = 3600;
    $currentTimestamp = (new DateTime("now", new DateTimeZone('UTC')))->getTimestamp();
    $privilegeExpiredTs = $currentTimestamp + $expireTimeInSeconds;

    $token = RtmTokenBuilder::buildToken($appID, $appCertificate, $user, $role, $privilegeExpiredTs);
    echo 'Rtk Token: ' . $token . PHP_EOL;

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

参考步骤

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

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

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

  4. php RtmTokenBuilderSample.php<

Node.js

    // 请填入你的项目 App ID
    const appID  = "xxxxxxxxxxxxxxxxxxxxxxxx";
    // 请填入你的项目权限密钥
    const appCertificate = "xxxxxxxxxxxxxxxxxxxxxxxx";
    // 请填入用户 ID
    const account = "test_user_id";
    // Token 服务过期时间。
    const expirationTimeInSeconds = 3600
    const currentTimestamp = Math.floor(Date.now() / 1000)

    const privilegeExpiredTs = currentTimestamp + expirationTimeInSeconds

    const token = RtmTokenBuilder.buildToken(appID, appCertificate, account, RtmRole, privilegeExpiredTs);
    console.log("Rtk Token: " + token);

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

参考步骤

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

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

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

  4. node RtmTokenBuilderSample.js

Go

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

    result, err := Rtmtokenbuilder.BuildToken(appID, appCertificate, user, Rtmtokenbuilder.RoleRTKUser, expireTimestamp)
    if err != nil {
        fmt.Println(err)
    } else {
        fmt.Printf("Rtk Token: %s\n", result)
    }

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

参考步骤

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

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

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

    go build

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

    ./RtmTokenBuilder

参数说明

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

static std::string buildToken(const std::string& appId,
                                const std::string& appCertificate,
                                const std::string& userAccount,
                                RtmUserRole userRole,
                                uint32_t privilegeExpiredTs = 0);
参数描述
appId你在 anyRTC 控制台创建项目时生成的 App ID。
appCertificate你的 权限密钥。
userAccount用于登录 RTK 系统的用户 ID。
userRole用户角色。暂时只支持一种角色,请使用默认值 Rtm_User
privilegeExpiredTs此参数暂不生效。你无需设置此参数。每个 RTK Token 的有效期都是 24 小时。

注意事项

参数匹配

生成 RTK Token 时填入的用户 ID,需要和登录 RTK 系统时填入的用户 ID 一致。

权限密钥与 RTK Token

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

RTK Token 过期

RTK Token 的有效期最大为 24 小时。

SDK 处于已连接 CONNECTION_STATE_CONNECTED状态时,即使 RTK Token 过期,用户也不会被踢出。用户登录时使用已过期的 RTK Token 则会返回LOGIN_ERR_TOKEN_EXPIRED 错误。

RTK 系统只会在 RTK Token 过期且 SDK 处于重连 CONNECTION_STATE_RECONNECTING 状态时才会触发 onTokenExpired 回调(Web 平台为 TokenExpired,OC 平台为 rtmKitTokenDidExpire),表示 RTK Token 已失效且重连需要新的 RTK Token。收到这个回调时,你需要在服务端重新生成 RTK Token,然后调用 renewToken 方法,将新生成的 RTK Token 传给 SDK。