使用 Token 鉴权
功能简介
鉴权是指验证用户是否拥有访问系统的权限,来避免因权限控制缺失或操作不当引发的安全风险问题,ZEGO 通过 Token(包括基础鉴权 Token 和权限认证 Token) 对用户进行鉴权。
鉴权方式 | 描述 | 应用场景 |
---|---|---|
基础鉴权 Token | 开发者在登录房间时必须带上 Token 参数,来验证用户的合法性。 | 基础鉴权 Token 为 Token 的基本能力,用于业务的简单权限验证场景,绝大多数情况下生成该 Token 即可。 |
权限认证 Token | 为了进一步提高安全性开放了房间 ID 和推流 ID 这两个权限位,可以验证登录房间的 ID 和推流 ID。 | 房间 ID 和推流 ID 权限位的一般使用场景如下:
|
前提条件
- 基础鉴权 Token 默认开通,权限认证 Token(即房间 ID 和推流 ID 权限位)请联系 ZEGO 技术支持开通。
- 已在项目中集成 ZEGO Express SDK,并实现了基本的音视频推拉流功能,详情请参考:
- 微信小程序 - 集成 SDK 和 微信小程序 - 实现流程,微信小程序 SDK 需要在 2.10.0 或以上版本。
- 支付宝小程序 - 集成 SDK 和 支付宝小程序 - 实现流程。
实现流程
使用 Token 鉴权时,需要开发者先生成 Token,再携带 Token 登录房间。ZEGO 服务端对带着 Token 的用户进行校验。
以使用 Token 判断用户是否能登录房间为例介绍使用流程,如下图:

- 开发者客户端发起申请 Token 的请求。
- 在开发者的服务端上生成 Token,并返回给开发者客户端。
- 开发者客户端携带申请到的 Token 和 userID、roomID 信息,登录对应的房间。
- ZEGO SDK 会自动将 Token 发送到 ZEGO 服务端进行校验。
- ZEGO 服务端会将校验结果返回给 ZEGO SDK。
- ZEGO SDK 再将校验的结果直接返回给开发者客户端,没有权限的客户端将登录失败。
使用步骤
本节将详细介绍开发者如何生成 Token、如何使用 Token 和 Token 过期时的处理方式。
1 获取 AppId 和 ServerSecret
生成 Token 需要开发者项目的唯一标识 AppId 和密钥 ServerSecret,请参考 控制台 - 项目管理 中的 “项目信息”获取。
2 生成 Token
zego_server_assistant 插件中用于服务端生成 Token 的各语言参考信息如下:
开发者获得项目的 AppID 和 ServerSecret 信息后,根据实际业务需求,即可在自己的服务端生成 Token。开发者客户端向开发者服务端发送申请 Token 请求,由开发者服务端生成 Token 后返回给到对应客户端。
ZEGO 在 GitHub/Gitee 提供了一个开源的 zego_server_assistant 插件,支持使用 Go、C++、Java、Objective-C、Python、PHP、.NET、Node.js 语言,在开发者的服务端部署生成 Token。
zego_server_assistant 插件中提供了生成权限认证 Token 的示例代码,权限认证 Token 是在登录房间鉴权后,为了进一步提高安全性,开放房间 ID 和推流 ID 这两个权限位,可以验证登录房间的 ID 和推流 ID,此时 “payload” 字段需要按照规格生成。权限位校验规则如下:
- 只校验登录权限:登录时校验权限,推流时不校验权限。
- 同时校验登录和推流权限:登录和推流时均校验权限。
- 为保证安全性,强烈推荐您使用服务端生成 Token,否则会存在 ServerSecret 被窃取的风险。
- ZEGO Express SDK 2.10.0 及以上版本请使用 zego_server_assistant 中的 “token04” 来生成 Token。
zego_server_assistant 插件中用于服务端生成 Token 的各语言参考信息如下:
语言 | 支持版本 | 关键函数 | 代码库地址 | 示例代码地址 |
---|---|---|---|---|
Go | Go 1.14.15 或以上版本 | GenerateToken04 | ||
C++ | C++ 11 或以上版本 | GenerateToken04 | ||
Java | Java 1.8 或以上版本 | generateToken04 | ||
Python | Python 3.6.8 或以上版本 | generate_token04 | ||
PHP | PHP 5.6 或以上版本 | generateToken04 | ||
.NET | .NET Framework 3.5 或以上版本 | GenerateToken04 | ||
Node.js | Node.js 8 或以上版本 | generateToken04 |
以 Go 语言为例,开发者可参考以下步骤使用 zego_server_assistant 生成 Token:
- 使用命令
git clone https://github.com/zegoim/zego_server_assistant
获取依赖包。 - 在您的代码中,通过
import "github.com/zegoim/zego_server_assistant/token/go/src/token04"
引入插件。 - 调用插件提供的 GenerateToken04 方法生成 Token。
生成 Token 的示例代码如下:
- 运行生成 Token 的 Java 源码时,如果出现 “java.security.InvalidKeyException Key Size” 异常提示,请参考 相关常见问题文档 解决。
- Token 校验:当您通过自己的服务端生成 Token 后,若需要校验 Token 正确性,可以使用 ZEGO 控制台的自助校验工具,详情请参考开发辅助文档的 Token 校验章节。
临时 Token 获取方式
为方便开发者体验使用 Token 鉴权,ZEGO 控制台 提供生成临时 Token 的功能,开发者可直接获取临时 Token 来使用,详情请参考 控制台 - 开发辅助。但是在开发者自己的线上环境中,一定要通过自己的服务端生成 Token。
3 使用 Token
用户携带获取到的 Token 和 userID、roomID 信息,通过 loginRoom 接口登录对应的房间。
调用 loginRoom 接口登录房间时使用的 userID,必须和 “生成 Token” 时使用的 userID 保持一致。
let roomID = 'xxx' // 要登录的房间 ID
let token = 'xxxxxxxxxx' // 请求开发者服务端获取
let user = {userID : 'xxxx'} // 房间内用户唯一标识
let loginResult = zg.loginRoom(roomID, token, user): Promise<boolean>
如果开发者需要在登录房间后修改推流权限位,可以调用 renewToken 接口更新 Token,更新后会影响下一次登推流的权限,之前已经成功的推流不受影响。
let token = await getToken(); // 重新请求开发者服务端获取 Token;
zg.renewToken(token);
4 Token 过期时的处理方式
Token 过期可能导致推拉流异常等问题,请严格按照以下说明,及时处理过期 Token。
在 Token 过期前 30 秒,SDK 会通过 tokenWillExpire 回调发出通知。
收到该回调后,开发者需要从自己的服务端获取新的有效 Token,并调用 SDK 提供的 renewToken 接口更新 Token。否则:
- 已登录的用户不会被踢出房间。
- 当前已成功的推拉流不受影响,但是停止推流后无法再推流,除非更新 Token。
zg.on('tokenWillExpire',(roomID: string)=>{
let token = await getToken(); // 重新请求开发者服务端获取 Token
zg.renewToken(token);
});
API 参考
方法 | 描述 |
---|---|
loginRoom | 登录房间 |
renewToken | 更新 Token |
tokenWillExpire | Token 过期回调 |