应用客户端在加入 RTC 房间,登录以收发实时消息时,都需要传入 Token 参数,完成鉴权。此 Token 来自你的应用服务端,由应用服务端在加入房间时,根据 RTC AppID、RTC AppKey、需要加入的 RTC RoomID、加入房间时使用的 RTC UserID、时间戳等参数实时生成。
RTC 服务端在收到进房请求时,会校验进房请求中携带的 Token 信息,如果校验不成功,进房会失败。
鉴权全流程如下。
客户端根据需要,向应用服务端申请 Token。
应用服务端生成 Token。
应用服务端将 Token 下发到客户端。
客户端使用获取到的 Token 申请加入房间。
说明:加入房间时设置的 uid 和 roomid 需与用于生成 Token 的 uid 和 roomid 保持一致,否则会加入房间失败,并收到错误提示为
ERROR_CODE_INVALID_TOKEN的onRoomStateChanged回调。
RTC 服务端验证 Token。
应用客户端收到来自 RTC SDK 的回调,获取加入房间的结果(成功/失败)。
Token 是有一定有效期的。Token 过期前 30 s,客户端会收到 onTokenWillExpire 回调。
说明:Token 过期后,用户将被移出房间,并收到
ERROR_CODE_INVALID_TOKEN回调,错误码是ERROR_CODE_TOKEN_EXPIRED。需要在申请新的 Token 之后调用JoinRoom加入房间。
此时,如果客户端需要继续进行音视频通话,需要申请新的 Token。
如步骤2。
如步骤3。
调用 updateToken 接口,使用新的 Token,更新 Token。
你需要自行实现步骤 1,2,3,4,11 的代码逻辑。
你可以参考 RTC 提供的示例代码,在应用服务端实现 Token 的生成。
以下文件包含了多种语言实现的相关代码:
【附件下载】: RTC_Token.zip,大小为 47.53KB以 Golang 为例,参考以下代码:
var (
appID = "xxxxx" // 申请到的app ID
appKey = "xxxxx" // 申请后的app key
roomID = "room" // 生成用于登录实时消息服务的 Token 时传空值
userID = "uid"
)
t := AccessToken.New(appID, appKey, roomID, userID)
// 添加此 Token 的有效时间,两小时过期。过期后,你无法使用此 Token 进房。
t.ExpireTime(time.Now().Add(time.Hour * 2))
// 添加订阅流权限,永不过期
t.AddPrivilege(AccessToken.PrivSubscribeStream, time.Time{})
// 添加发布流权限,永不过期
t.AddPrivilege(AccessToken.PrivPubscribeStream, time.Time{})
// 获取最终生成的token
token,err := t.Serialize()
go注意:
PrivPublishStream、PrivSubscribeStream 为保留参数,无实际控制权限;3.50.3 及以后版本,如需通过 token 控制连麦权限,可以联系技术支持团队开通白名单后,设置有效的 PrivPublishStream、PrivSubscribeStream。注意,无论使用哪个版本,至少任意设置其中一个参数才能成功进房,建议设置为永不过期。在进行应用测试时,你可以在控制台上获取测试使用的临时 Token,无需在应用服务端部署 Token 生成服务。
一般进行测试时,常用两台或多台设备进行音视频通话。进行测试时,这些设备应加入同一个房间。在申请临时 Token 和加入房间时,这些设备应使用同一个 roomId 和不同的 uid。申请 Token 时,临时 Token 是根据 roomId,uid,和时间戳信息生成的,每个临时 Token 都不一样。申请完临时 Token 后,你应记录下申请时的 roomId 和 uid,以及申请得到的临时 Token,以供使用设备加入房间时使用。
当申请的临时 Token只用于进行实时消息功能测试时,房间 ID 可填写任意值。
你可以在 控制台-应用管理 页面,输入相关信息,并生成对应的 Token,用于功能测试。
临时 Token 仅用于测试阶段,有使用时间限制,且安全性较低。若该项目准备正式上线,你必须使用遵循以上步骤在应用服务端生成的 Token。