
Token也称为动态密钥,是在加入频道时用于校验用户权限的一组字符串;鉴权是指在用户访问你的系统前,对其进行身份校验。用户在使用声网服务,如加入音视频通话或登录信令系统时,声网会使用 Token 对其鉴权。
某个展览馆需要游客实名认证后,获取专属入场券才可参观。游客在完成实名认证后可以获取到具备有效期限制的专属入场券,在进场时提供在有效期内的入场券,方能进场。其中:
●进场时校验入场券相当于鉴权,即校验 Token 是否和 声网 AppID、频道号、用户 ID 等信息匹配,且在有效期内。
声网的产品和服务中大部分采用Token 鉴权的方式。下面,我们针对如何生成和使用 Token,以及 Token 鉴权中常见的问题进行详细的讲解。
2.1 Token 鉴权原理
9.客户端更新 Token
● 你在声网控制台创建项目时生成的 App ID
● 频道名
● 用户 ID
● 用户权限,如是否能发流或收流
● Token 的过期时间
2.2 申请与生成Token
可以看到,在用户加入频道前,客户端需要先向服务器申请Token,并在 服务器 生成 Token,且 Token 必须与 需要加入频道的用户所对应的 AppID、频道名、用户 ID(UID)信息、用户权限(是否能发流或收流) 一一对应,并且确保生成的 Token 在有效期内。然后才能以 UID、频道号 和 Token 加入对应频道。
● 部署 Token 服务器(官方文档):
https://docs.agora.io/cn/live-streaming-premium-4.x/token_server_ios_ng?platform=iOS#%E9%83%A8%E7%BD%B2-token-%E6%9C%8D%E5%8A%A1%E5%99%A8
●用Token-Flutter 连接 Agora (2021-09-15)
https://www.rtcdeveloper.cn/cn/community/blog/22929
● 使用 Swift 部署声网 Token 服务器 (2022-10-27):
https://www.rtcdeveloper.cn/cn/community/blog/24981
●在NET Core 上建立 Agora AccessToken 服务 (2020-11-14):
https://www.rtcdeveloper.cn/cn/community/blog/19790
● 如何用 GoLang 为声网 Agora 应用构建 Token 服务器 (2020-12-09):
https://www.rtcdeveloper.cn/cn/community/blog/20102
● 如何使用 NodeJS 为声网 Agora 应用构建 Token 服务器 (2020-12-03):
https://www.rtcdeveloper.cn/cn/community/blog/20024
● 使用 Java 构建 Agora 令牌服务器 (2021-02-07):
https://www.rtcdeveloper.cn/cn/community/blog/20709
● 用 Java 构建声网令牌服务器 (2023-01-10):
https://www.rtcdeveloper.cn/cn/community/blog/25430
生成Token,可以使用声网提供的 Demo 实现,Demo 地址请参考:Token 生成器代码
*请务必注意:例如用户使用 UID=123456(int 型)加入频道 ChannelName="test",那么生成 Token 时传入的参数 UID 和 ChannelName 必须是相对应的,即 UID=123456(int 型)且 ChannelName="test",否则会导致鉴权失败。
2.3 Token 过期处理
Token最大有效期为 24 小时。当即将过期时,客户端会收到 Token 即将过期的回调;Token 过期时,SDK 会触发 Token 过期回调。具体处理方式如下:
● 在 Token 过期前 30 秒,SDK 会触发 tokenPrivilegeWillExpire 回调。收到该回调后,客户端需要从服务器获取新的Token 并调用 renewToken 将新生成的 Token 传给 SDK。
● Token 过期时,SDK 会触发 rtcEngineRequestToken 回调。收到该回调后,客户端需要从服务器获取新的 Token 并调用 joinChannel 方法,再使用新的 Token 重新加入频道。
一般来说,我们建议在Token 过期前,及时更新 Token,即从服务器获取新的 Token 并调用 renewToken 将新生成的Token 传给 SDK。
101:App ID无效
问题描述:
● Native 端:SDK 在初始化声网服务时返回错误码 ERR_INVALID_APP_ID(101);或调用 joinChannel 方法加入频道时,SDK 回调 onError 事件,并报告错误码 ERR_INVALID_APP_ID(101)。
● Web 端:在初始化 声网服务或调用 Client.join 方法加入频道时,Console 控制台打印错误码 ERR_INVALID_VENDOR_KEY(101)。
109/118/2:Token 已过期
问题描述:
110:Token 无效
问题描述:
● Native 端:调用 joinChannel 方法加入频道时,SDK 回调 onError 事件,并报告错误码 ERR_INVALID_TOKEN(110)。
● Web 端:调用 Client.join 方法加入频道时,Console 控制台打印错误码 ERR_NO_AUTHORIZED(110)。
问题原因:
生成的 Token 无效。一般有以下原因:
● 你在服务端生成 Token 时填入的 App ID、用户 ID 和频道名,与你初始化和加入频道时填入的 App ID、用户 ID 和频道名不匹配。
解决方法:
● 在加入频道前,请确认你在初始化时填入的 App ID 对应的项目是否已启用主要/次要证书。
● 用于生成 Token 的频道名和加入频道时填入的频道名一致。
119:静态厂商使用动态密钥
该错误码仅适用于RTC Web SDK。
120:动态厂商使用静态密钥
该错误码仅适用于RTC Web SDK。
Token过期相关事件回调
为保证通信体验,声网提供如下两个回调,提醒用户Token 即将过期或已经过期:
● onTokenPrivilegeWillExpire:该回调表示 Token 即将在 30 秒内失效。收到这个回调时,你需要在服务端重新生成Token,然后调用 renewToken 方法,将新生成的 Token 传给 SDK。
各语言Token错误码对照
错误码
|
Java/C++/C#
|
Objective-C
|
Javascript
|
101
|
ERR_INVALID_APP_ID
|
AgoraErrorCodeInvalidAppId
|
ERR_INVALID_VENDOR_KEY
|
109
|
ERR_TOKEN_EXPIRED
|
AgoraErrorCodeTokenExpired
|
ERR_DYNAMIC_KEY_TIMEOUT
|
110
|
ERR_INVALID_TOKEN
|
AgoraErrorCodeInvalidToken
|
ERR_NO_AUTHORIZED
|
2
|
/
|
/
|
K_TIMESTAMP_EXPIRED
|
118
|
/
|
/
|
ERR_DYNAMIC_KEY_EXPIRED
|
119
|
/
|
/
|
ERR_STATIC_USE_DYNAMIC_KEY
|
120
|
/
|
/
|
ERR_DYNAMIC_USE_STATIC_KEY |
● 带你用 Golang 搭建声网 Token Server【声网 RTE 教程】(2023-02-07):
https://www.bilibili.com/video/BV1rM411v7hg/?spm_id_from=333.999.0.0
● 如何处理 Token 相关错误码?
https://docs.agora.io/cn/All/faq/token_error
● 使用 Token 鉴权
https://docs.agora.io/cn/live-streaming-premium-4.x/token_server_ios_ng?platform=iOS#%E9%83%A8%E7%BD%B2-token-%E6%9C%8D%E5%8A%A1%E5%99%A8
关注实时互动领域的
技术实践、行业洞察、人物观点
☟☟☟

