生成Token

最近更新时间:2021-03-18 11:04:19

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

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

前提条件

生成 RTM Token

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

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

./src/RtmTokenBuilder.h 文件包含用于生成 RTM 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 服务过期时间。此参数暂不生效。你无需设置此参数。每个 RTM Token 的有效期都是 24 小时。
  uint32_t expirationTimeInSeconds = 3600;
  uint32_t currentTimeStamp = time(NULL);
  uint32_t privilegeExpiredTs = currentTimeStamp + expirationTimeInSeconds;
 
  std::string result =
    RtmTokenBuilder::buildToken(appID, appCertificate, user,
        RtmUserRole::Rtm_User, privilegeExpiredTs);
  std::cout << "Rtm 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. 运行如下命令行生成 RTM Token。生成的 RTM Token 会显示在 Terminal 中。

      ./RtmTokenBuilderSample
    

Java

    // 请填入你的项目 App ID
    private String appId = "xxxxxxxxxxxxxxxxxxxxxxxx";
    // 请填入你的项目权限密钥
    private String appCertificate = "xxxxxxxxxxxxxxxxxxxxxxxx";
    // 请填入用户 ID
    private String userId = "test_user";
    // Token 服务过期时间。此参数暂不生效。你无需设置此参数。每个 RTM Token 的有效期都是 24 小时。
    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 中运行项目。生成的 RTM Token 会显示在 IDE 中。

Python

    // 请填入你的项目 App ID
    appID = "xxxxxxxxxxxxxxxxxxxxxxxx"
    // 请填入你的项目权限密钥
    appCertificate = "xxxxxxxxxxxxxxxxxxxxxxxx"
    // 请填入用户 ID
    user = "test_user_id"
    // Token 服务过期时间。此参数暂不生效。你无需设置此参数。每个 RTM Token 的有效期都是 24 小时。
    expirationTimeInSeconds = 3600
    currentTimestamp = int(time.time())
    privilegeExpiredTs = currentTimestamp + expirationTimeInSeconds

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

    if __name__ == "__main__":
        main()

参考步骤

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

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

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

  4. python RtmTokenBuilderSample.py

Python3

    // 请填入你的项目 App ID
    appID = "xxxxxxxxxxxxxxxxxxxxxxxx"
    // 请填入你的项目权限密钥
    appCertificate = "xxxxxxxxxxxxxxxxxxxxxxxx"
    // 请填入用户 ID
    user = "test_user_id"
    // Token 服务过期时间。此参数暂不生效。你无需设置此参数。每个 RTM Token 的有效期都是 24 小时。
    expirationTimeInSeconds = 3600
    currentTimestamp = int(time.time())
    privilegeExpiredTs = currentTimestamp + expirationTimeInSeconds

    def main():
        token = RtmTokenBuilder.buildToken(appID, appCertificate, user, Role_Rtm_User, privilegeExpiredTs)
        print("Rtm 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 所在路径,然后运行如下命令行生成 RTM Token。 生成的 RTM Token 会显示在 Terminal 中。

  4. python RtmTokenBuilderSample.py

PHP

    // 请填入你的项目 App ID
    $appID = "xxxxxxxxxxxxxxxxxxxxxxxx";
    // 请填入你的项目权限密钥
    $appCertificate = "xxxxxxxxxxxxxxxxxxxxxxxx";
    // 请填入用户 ID
    $user = "test_user_id";
    $role = RtmTokenBuilder::RoleRtmUser;
    // Token 服务过期时间。此参数暂不生效。你无需设置此参数。每个 RTM Token 的有效期都是 24 小时。
    $expireTimeInSeconds = 3600;
    $currentTimestamp = (new DateTime("now", new DateTimeZone('UTC')))->getTimestamp();
    $privilegeExpiredTs = $currentTimestamp + $expireTimeInSeconds;

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

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

参考步骤

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

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

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

  4. php RtmTokenBuilderSample.php<

Node.js

    // 请填入你的项目 App ID
    const appID  = "xxxxxxxxxxxxxxxxxxxxxxxx";
    // 请填入你的项目权限密钥
    const appCertificate = "xxxxxxxxxxxxxxxxxxxxxxxx";
    // 请填入用户 ID
    const account = "test_user_id";
    // Token 服务过期时间。此参数暂不生效。你无需设置此参数。每个 RTM Token 的有效期都是 24 小时。
    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("Rtm Token: " + token);

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

参考步骤

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

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

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

  4. node RtmTokenBuilderSample.js

Go

    // 请填入你的项目 App ID
    appID := "xxxxxxxxxxxxxxxxxxxxxxxx"
    // 请填入你的项目权限密钥
    appCertificate := "xxxxxxxxxxxxxxxxxxxxxxxx"
    // 请填入用户 ID
    user := "test_user_id"
    // Token 服务过期时间。此参数暂不生效。你无需设置此参数。每个 RTM Token 的有效期都是 24 小时。
    expireTimeInSeconds := uint32(3600)
    currentTimestamp := uint32(time.Now().UTC().Unix())
    expireTimestamp := currentTimestamp + expireTimeInSeconds

    result, err := rtmtokenbuilder.BuildToken(appID, appCertificate, user, rtmtokenbuilder.RoleRtmUser, expireTimestamp)
    if err != nil {
        fmt.Println(err)
    } else {
        fmt.Printf("Rtm 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 为例,介绍生成 RTM 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用于登录 RTM 系统的用户 ID。
userRole用户角色。暂时只支持一种角色,请使用默认值 Rtm_User
privilegeExpiredTs此参数暂不生效。你无需设置此参数。每个 RTM Token 的有效期都是 24 小时。

注意事项

参数匹配

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

权限密钥与 RTM Token

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

RTM Token 过期

RTM Token 的有效期为 24 小时。

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

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