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 技术支持开通。

注意
  • 仅 2.17.0 及以上版本 ZEGO Express SDK,支持参考本文档使用 Token 鉴权。
  • 若您集成的是 2.17.0 之前版本的 ZEGO Express SDK(使用 AppSign 鉴权),现在想升级到 2.17.0 版本且使用 Token 鉴权,可以通过 如何从 AppSign 鉴权升级为 Token 鉴权 文档了解 AppSign 鉴权和 Token 鉴权更多信息。

流程概述

场景 1:登录房间场景

使用 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 再将校验的结果直接返回给开发者客户端,没有权限的客户端将登录失败。

场景 2:登录万人音视频的范围场景

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

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

  1. 开发者客户端发起申请 Token 的请求。
  2. 在开发者的服务端上生成 Token,并返回给开发者客户端。
  3. 开发者客户端携带申请到的 Token 和 userID、sceneID 信息,登录对应的场景。
  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。
注意

范围场景模块暂不支持权限认证 Token。

注意

3 使用 Token

场景 1:登录房间场景

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

注意

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

std::string roomID = 'xxx'; // 要登录的房间ID
ZegoUser user;
user.userID = 'xxxx';
user.userName = 'xxxx';
ZegoRoomConfig config;
config.token = 'xxxxxxxxxx' // 请求开发者服务端获取
engine->loginRoom(roomID, user, config);

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

std::string token = getToken(); // 重新请求开发者服务端获取 Token;
engine->renewToken(token);

场景 2:登录万人音视频的范围场景

用户携带获取到的 Token 和 user、sceneID 信息,登录对应的场景。

注意

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

long long sceneID = 123; // 要登录的场景 ID
ZegoUser user;
user.userID = 'xxxx';
user.userName = 'xxxx';
ZegoSceneParam param;
param.sceneID = sceneID;
param.user = user;
param.token = @"xxxxxxxx"; // 请求开发者服务端获取

rangeScene->loginScene(param, [](int errorCode, const ZegoSceneConfig &config) {});

4 Token 过期时的处理方式

注意

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

场景 1:登录房间场景

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

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

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

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

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

  • 已登录的用户会被踢出房间,且只有更新 Token 后,才可以再次登录房间。
  • 当前已成功的推流会被停止。
void onRoomTokenWillExpire(const std::string& /*roomID*/, int /*remainTimeInSecond*/) override {
    std::string token = getToken(); // 重新请求开发者服务端获取 Token
    engine->renewToken(roomID, token);
}

场景 2:登录万人音视频的范围场景

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

收到该回调后,开发者需要从自己的服务端获取新的有效 Token,并调用 SDK 提供的 IZegoRangeScene.renewToken 接口更新 Token。若未处理,Token 过期的处理机制如下:

  • 已登录的用户不会被踢出场景。
  • 当前已成功的推拉流不受影响,但是会影响用户的下一次推拉流操作。
void RangeScene::onSceneTokenWillExpire(IZegoRangeScene *rangeScene, int remainTimeInSecond) {
    std::string token = getToken(); // 重新请求开发者服务端获取 Token
    // 请切换线程调用 renewToken
    rangeScene->renewToken(token);
}

其他

若您在开发过程中还无法通过服务端下发 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 过期回调

相关文档

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

2024-10-11

Previous

场景化音视频配置

Next

通话前检测