本文展示如何使用 anyRTC 提供的代码在服务端生成 RTM Token。
RTM Token 在你的业务服务端生成。用户登录 RTM 系统时,客户端需要向服务端申请 RTM Token;服务器生成 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 服务过期时间。
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 库。
-
将 ARDynamicKey 仓库下载或克隆至本地。
-
打开
ARDynamicKey/cpp/sample/RtmTokenBuilderSample.cpp
文件,使用自己的 App ID、权限密钥、用户 ID 替换示例代码中的值。 -
进入
RtmTokenBuilderSample.cpp
所在路径,然后运行如下命令行。运行结束后,相同文件夹下会生成一个可执行文件RtmTokenBuilderSample
。g++ -std=c++0x -O0 -I../../ -L. RtmTokenBuilderSample.cpp -lz -lcrypto -o RtmTokenBuilderSample
-
运行如下命令行生成 RTM Token。生成的 RTM 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);
}
参考步骤
-
将 ARDynamicKey 仓库下载或克隆至本地。
-
在你的 Java IDE 中打开
ARDynamicKey/java
文件。 -
打开
ARDynamicKey/java/src/main/java/io/ar/sample/RtmTokenBuilderSample.java
文件。使用自己的 App ID、权限密钥、用户 ID 替换示例代码中的值。 -
在你的 Java IDE 中运行项目。生成的 RTM 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("Rtm Token: {}".format(token))
if __name__ == "__main__":
main()
参考步骤
-
将 ARDynamicKey 仓库下载或克隆至本地。
-
打开
ARDynamicKey/python/sample/RtmTokenBuilderSample.py
文件。使用自己的 App ID、权限密钥、用户 ID 替换示例代码中的值。 -
进入
RtmTokenBuilderSample.py
所在路径,然后运行如下命令行生成 RTM Token。 生成的 RTM Token 会显示在 Terminal 中。 -
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("Rtm Token: {}".format(token))
if __name__ == "__main__":
main()
开始前请确保已安装 Python 3,且运行环境为 Python 3。你可以运行如下命令行查询当前 Python 版本。
参考步骤
-
将 ARDynamicKey 仓库下载或克隆至本地。
-
打开
ARDynamicKey/python3/sample/RtmTokenBuilderSample.py
文件。使用自己的 App ID、权限密钥、用户 ID 替换示例代码中的值。 -
进入
RtmTokenBuilderSample.py
所在路径,然后运行如下命令行生成 RTM Token。 生成的 RTM Token 会显示在 Terminal 中。 -
python RtmTokenBuilderSample.py
PHP
// 请填入你的项目 App ID
$appID = "xxxxxxxxxxxxxxxxxxxxxxxx";
// 请填入你的项目权限密钥
$appCertificate = "xxxxxxxxxxxxxxxxxxxxxxxx";
// 请填入用户 ID
$user = "test_user_id";
$role = RtmTokenBuilder::RoleRtmUser;
// Token 服务过期时间。
$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。
参考步骤
-
将 ARDynamicKey 仓库下载或克隆至本地。
-
打开
ARDynamicKey/sample/RtmTokenBuilderSample.php
文件。使用自己的 App ID、权限密钥、用户 ID 替换示例代码中的值。 -
进入
RtmTokenBuilderSample.php
所在路径,然后运行如下命令行生成 RTM Token。 生成的 RTM Token 会显示在 Terminal 中。 -
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("Rtm Token: " + token);
开始前请确保已安装最新版本的 Node.js LTS 版本。
参考步骤
-
将 ARDynamicKey 仓库下载或克隆至本地。
-
打开
ARDynamicKey/nodejs/sample/RtmTokenBuilderSample.js
文件。使用自己的 App ID、权限密钥、用户 ID 替换示例代码中的值。 -
进入
RtmTokenBuilderSample.js
所在路径,然后运行如下命令行生成 RTM Token。 生成的 RTM Token 会显示在 Terminal 中。 -
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.RoleRtmUser, expireTimestamp)
if err != nil {
fmt.Println(err)
} else {
fmt.Printf("Rtm Token: %s\n", result)
}
开始前请确保已安装最新版本的 Golang。
参考步骤
-
将 ARDynamicKey 仓库下载或克隆至本地。
-
打开
ARDynamicKey/go/sample/RtmTokenBuilder/sample.go
文件。使用自己的 App ID、权限密钥、用户 ID 替换示例代码中的值。 -
进入
sample.go
所在路径,然后运行如下命令行。 运行结束后,相同文件夹下会生成一个可执行文件RtmTokenBuilder
。go build
-
运行如下命令行生成 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。