logo
当前页

使用 Token 鉴权

2024-10-11

功能介绍

鉴权是指验证用户是否拥有访问系统的权限,来避免因权限控制缺失或操作不当引发的安全风险问题,ZEGO 通过 Token(包括基础鉴权 Token 和权限认证 Token) 对用户进行鉴权。

鉴权方式描述应用场景
基础鉴权 Token开发者在登录房间时必须带上 Token 参数,来验证用户的合法性。基础鉴权 Token 为 Token 的基本能力,用于业务的简单权限验证场景,绝大多数情况下生成该 Token 即可。
权限认证 Token为了进一步提高安全性开放了房间 ID 和推流 ID 这两个权限位,可以验证登录房间的 ID 和推流 ID。房间 ID 和推流 ID 权限位的一般使用场景如下:
  • 房间有普通房间和会员房间的区别,需要控制非会员用户登录会员房间。
  • 语聊房或秀场直播中,需要控制推流用户和麦上用户的一致,防止“幽灵麦”现象,即在房间里听到了非麦上用户声音的情况。
  • 狼人杀等发言游戏,需要防止应用被黑客破解之后,黑客可以使用其他用户 ID 登录同一房间,获取到游戏进行的信息进行作弊,影响正常用户的游戏体验。

前提条件

  • 基础鉴权 Token 默认开通,权限认证 Token(即房间 ID 和推流 ID 权限位)请联系 ZEGO 技术支持开通。
  • 已在项目中集成 ZEGO Express SDK(2.17.3 及以上版本),并实现了基本的音视频推拉流功能,请参考 快速开始 - 集成快速开始 - 实现流程
注意
  • 仅 2.17.3 及以上版本 ZEGO Express SDK,支持参考本文档使用 Token 鉴权。
  • 若您集成的是 2.17.3 之前版本的 ZEGO Express SDK(使用 AppSign 鉴权),现在想升级到 2.17.3 版本且使用 Token 鉴权,可以通过 如何从 AppSign 鉴权升级为 Token 鉴权 文档了解 AppSign 鉴权和 Token 鉴权更多信息。

流程概述

使用 Token 鉴权时,需要开发者先生成 Token,再携带 Token 登录房间。ZEGO 服务端对带着 Token 的用户进行校验。

以使用 Token 判断用户是否能登录房间为例介绍使用流程,如下图:

  1. 开发者客户端发起申请 Token 的请求。
  2. 在开发者的服务端上生成 Token,并返回给开发者客户端。
  3. 开发者客户端携带申请到的 Token 和 userID、roomID 信息,登录对应的房间。
  4. ZEGO SDK 会自动将 Token 发送到 ZEGO 服务端进行校验。
  5. ZEGO 服务端会将校验结果返回给 ZEGO SDK。
  6. ZEGO SDK 再将校验的结果直接返回给开发者客户端,没有权限的客户端将登录失败。

生成 Token 并使用

本节将详细介绍开发者如何通过服务端生成 Token、如何使用 Token 和 Token 过期时的处理方式。

1 获取 AppID 和 ServerSecret

生成 Token 需要开发者项目的唯一标识 AppID 和密钥 ServerSecret,请参考 控制台 - 项目管理 中的 “项目信息”获取。

开发者获得项目的 AppID 和 ServerSecret 信息后,根据实际业务需求,即可在自己的服务端生成 Token。开发者客户端向开发者服务端发送申请 Token 请求,由开发者服务端生成 Token 后返回给对应客户端。

2 在服务端生成 Token

注意

Token 临时获取方式:为方便开发者调试,ZEGO 控制台 提供生成临时 Token 的功能,开发者可直接获取临时 Token 来使用,详情请参考 控制台 - 开发辅助。但是在开发者自己的线上环境中,一定要通过自己的服务端生成 Token。

ZEGO 在 GitHub/Gitee 提供了一个开源的 zego_server_assistant 插件,请使用插件中的 “token04” 版本来生成 Token。插件支持 Go、C++、Java、Objective-C、Python、PHP、.NET、Node.js 语言:

语言支持版本关键函数插件下载地址使用示例
基础鉴权 Token权限认证 Token
GoGo 1.14.15 或以上版本GenerateToken04
C++C++ 11 或以上版本GenerateToken04
JavaJava 1.8 或以上版本generateToken04
PythonPython 3.6.8 或以上版本generate_token04
PHPPHP 5.6 或以上版本generateToken04
.NET.NET Framework 3.5 或以上版本GenerateToken04
Node.jsNode.js 8 或以上版本generateToken04

以 Go 语言为例,开发者可参考以下步骤使用 zego_server_assistant 生成 Token:

  1. 使用命令 git clone https://github.com/zegoim/zego_server_assistant 获取依赖包。
  2. 在您的代码中,通过 import "github.com/zegoim/zego_server_assistant/token/go/src/token04" 引入插件。
  3. 调用插件提供的 GenerateToken04 方法生成 Token。
注意

3 使用 Token

用户携带获取到的 Token 和 user、roomID 信息,通过 loginRoom 接口登录对应的房间。

注意

调用 loginRoom 接口登录房间时使用的 userID,必须和 “在服务端生成 Token” 时使用的 userID 保持一致。

zgEngine.loginRoom('roomID', { userID: 'zego', userName: zego}, config = {token: 'xxxx'});

如果开发者需要在登录房间后修改权限位,也可以调用 renewToken 接口更新 Token,更新后会影响下一次登录某些房间和推某些流的权限,之前已经成功的房间登录和推流不受影响。

zgEngine.renewToken(roomID = 'roomID', token = 'xxxx');

4 Token 过期处理机制

注意

Token 过期可能导致推拉流异常等问题,请严格按照以下说明,及时处理过期 Token。

在 Token 过期前 30 秒,SDK 会通过 onRoomTokenWillExpire 回调发出通知。

收到该回调后,开发者需要从自己的服务端获取新的有效 Token,并调用 SDK 提供的 renewToken 接口更新 Token。

若您接入的是 2.17.3 及以上版本的 ZEGO Express SDK,在 Token 过期后,未调用 renewToken 接口更新 Token,则当权限过期时:

  • 已登录的用户不会被踢出房间。
  • 当前已成功的推拉流不受影响。但是停止推流后无法再推流,除非更新 Token。
说明

ZEGO 还提供了另一种 Token 过期处理方式,您可以联系 ZEGO 技术支持配置:

  • 已登录的用户会被踢出房间,且只有更新 Token 后,才可以再次登录房间。
  • 当前已成功的推流会被停止。
zgEngine.on("onRoomTokenWillExpire", res=>
{
    zgEngine.renewToken(roomID = TheRoomID, token = 'xxxx');
});

其他

若您在开发过程中还无法通过服务端下发 Token 时,可以先使用客户端代码生成 Token,待服务端开发完后,再完成对接。

注意
  • App 上线时,切勿在客户端生成 Token,否则您的 ServerSecret 将暴露在风险中。
  • 为保证安全性,强烈推荐您使用服务端生成 Token,否则会存在 ServerSecret 被窃取的风险。

zego_server_assistant 插件中用于客户端生成 Token 的各语言参考信息如下:

语言支持版本关键函数具体地址
C++C++ 11 或以上版本GenerateToken04
JavaJava 1.8 或以上版本generateToken04
Objective-C-GenerateToken04

如需使用客户端生成 Token,请参考 使用 Token

若 Token 过期,请参考 Token 过期时的处理方式 进行处理。

API 参考

方法描述
loginRoom登录房间
renewToken更新 Token
onRoomTokenWillExpireToken 过期回调

相关文档

如何防止音视频互动中的幽灵麦或炸房的现象?

Previous

设置回调

Next

多源采集