客户端鉴权
鉴权是指在用户访问你的系统前,对其进行身份校验。用户在使用声网服务,如加入音视频通话或登录信令系统时,声网使用 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 - 状态迁移的原因(
reasonCode):tokenExpired
此时,用户需要先在端侧更新 Token,排除故障后再调用 login 方法重新登录。
你可以通过 token 回调和 linkState 回调进行 Token 过期处理,但声网推荐你通过定时(例如每小时)更新 Token 来解决 Token 过期问题。