客户端鉴权
鉴权是指在用户访问你的系统前,对其进行身份校验。用户在使用声网服务,如加入音视频通话或登录信令系统时,声网使用 Token 对其鉴权。
RTM 提供 Message Channel 和 Stream Channel 两种频道类型,使用不同类型的频道,对应的 Token 类型也不同:
- 使用 Message Channel:只需在调用
login
方法登录 RTM 系统时,传入开通了 RTM 服务的 Token(以下简称 RTM Token)。 - 使用 Stream Channel:在使用 RTM Token 鉴权的基础上,还需要在调用
join
方法加入 Stream Channel 时传入开通了 RTC 服务的 Token(以下简称 RTC Token)。
本文展示如何搭建一个使用 RTM Token 鉴权的客户端。使用 RTC Token 请参考使用 RTC Token 鉴权。
鉴权流程
下图展示了 RTM Token 鉴权的基本流程:
RTM Token 在 App 服务器上生成,其最长有效期为 24 小时。当用户从你的 App 客户端登录到 RTM 系统时,声网平台会读取该 Token 中包含的信息,并进行校验。Token 包含以下信息:
- 你在声网控制台创建项目时生成的 App ID
- RTM 用户 ID
- RTM Token 过期的 Unix 时间戳
前提条件
开始前,请确保你的项目或使用的声网产品满足如下条件:
实现用户鉴权
本节展示如何使用 RTM Token 对客户端的用户进行鉴权。
- 此示例服务器仅用于演示,请勿用于生产环境中。
- 生成 RTM Token 时填入的用户 ID 和 App ID,需要和初始化实例时填入的用户 ID 和 App ID 一致。
使用获取到的 RTM Token,通过 login
方法登录。
class TokenResult {
final String status;
final String token;
TokenResult(this.status, this.token);
}
// 定义获取 token 函数
Future<TokenResult> fetchToken({required String channelName}) async {
// 向 Token Provider 请求 token
......
String status = "success";
String token = "your_token_here";
return TokenResult(status, token);
}
rtmClient.addListener({
token:(event) => {
if(event.channelName == '') { // 当 event 中 channelName 为空时,表示 `MESSAGE` 服务 Token 过期
var result = await fetchToken(); // 获取 `MESSAGE` 服务 Token
rtmClient.renewToken(result.token); // 更新 `MESSAGE` 服务 Token
} else { // 当 event 中 channelName 不为空时,表示 `STREAM` 服务 Token 过期
var result = await fetchToken(channelName: event.channelName); // 获取 `STREAM` 服务 Token
streamChannel.renewToken(result.token); // 更新 `STREAM` 服务 Token
}
}
});
var token = await fetchToken();
var (status,response) = await rtmClient.login(token);
if (status.error == true) {
print(status);
} else {
print(response);
}
开发注意事项
App 证书与 RTM Token
生成 RTM Token 需要先在控制台启用对应项目的 App 证书。项目一旦开启了 App 证书,就必须使用 RTM Token 鉴权。
RTM Token 过期
你可以根据业务需求指定 RTM Token 的有效期 (最长为 24 小时)。当 RTM Token 临 30 秒过期时,会触发 token
回调,提醒用户 Token 即将过期。收到该回调时,你可以在服务端重新生成 RTM Token,然后调用 renewToken
方法,将新生成的 RTM Token 传给 SDK。
如果 Token 已过期,则 SDK 会触发 linkState
回调,报告如下内容:
- 当前状态(
currentState
):failed
- 触发本次状态迁移的操作(
operation
):serverReject
- 状态迁移的原因(
reason
):tokenExpired
此时,用户需要先在端侧更新 Token,排除故障后再调用 login
方法重新登录。
你可以通过 token
回调和 linkState
回调进行 Token 过期处理,但声网推荐你通过定时(例如每小时)更新 Token 来解决 Token 过期问题。