本文展示如何使用 anyRTC 提供的代码在服务端生成 RTK Token。
服务端生成 RTK Token 的库使用 RTM 生产 Token 的现有服务库
RTK Token 在你的业务服务端生成。用户登录 RTK 系统时,客户端需要向服务端申请 RTK Token;服务器生成 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 库。
-
将 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
-
运行如下命令行生成 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);
}
参考步骤
-
将 ARDynamicKey 仓库下载或克隆至本地。
-
在你的 Java IDE 中打开
ARDynamicKey/java
文件。 -
打开
ARDynamicKey/java/src/main/java/io/ar/sample/RtmTokenBuilderSample.java
文件。使用自己的 App ID、权限密钥、用户 ID 替换示例代码中的值。 -
在你的 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()
参考步骤
-
将 ARDynamicKey 仓库下载或克隆至本地。
-
打开
ARDynamicKey/python/sample/RtmTokenBuilderSample.py
文件。使用自己的 App ID、权限密钥、用户 ID 替换示例代码中的值。 -
进入
RtmTokenBuilderSample.py
所在路径,然后运行如下命令行生成 RTK Token。 生成的 RTK 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("Rtk Token: {}".format(token))
if __name__ == "__main__":
main()
开始前请确保已安装 Python 3,且运行环境为 Python 3。你可以运行如下命令行查询当前 Python 版本。
参考步骤
-
将 ARDynamicKey 仓库下载或克隆至本地。
-
打开
ARDynamicKey/python3/sample/RtmTokenBuilderSample.py
文件。使用自己的 App ID、权限密钥、用户 ID 替换示例代码中的值。 -
进入
RtmTokenBuilderSample.py
所在路径,然后运行如下命令行生成 RTK Token。 生成的 RTK Token 会显示在 Terminal 中。 -
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。
参考步骤
-
将 ARDynamicKey 仓库下载或克隆至本地。
-
打开
ARDynamicKey/sample/RtmTokenBuilderSample.php
文件。使用自己的 App ID、权限密钥、用户 ID 替换示例代码中的值。 -
进入
RtmTokenBuilderSample.php
所在路径,然后运行如下命令行生成 RTK Token。 生成的 RTK 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("Rtk Token: " + token);
开始前请确保已安装最新版本的 Node.js LTS 版本。
参考步骤
-
将 ARDynamicKey 仓库下载或克隆至本地。
-
打开
ARDynamicKey/nodejs/sample/RtmTokenBuilderSample.js
文件。使用自己的 App ID、权限密钥、用户 ID 替换示例代码中的值。 -
进入
RtmTokenBuilderSample.js
所在路径,然后运行如下命令行生成 RTK Token。 生成的 RTK 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.RoleRTKUser, expireTimestamp)
if err != nil {
fmt.Println(err)
} else {
fmt.Printf("Rtk 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 为例,介绍生成 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。