logo
当前页

使用 Token 鉴权

简介

为了避免未经授权的服务访问或操作,ZEGO 使用 Token 来验证用户身份、控制及验证用户权限,因此您需要在登录房间时传入 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 再将校验的结果直接返回给开发者客户端,没有权限的客户端将登录失败。

4.1 获取 AppId 和 ServerSecret

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

在您的服务器上生成 Token

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

ZEGO 在 GitHub/Gitee 提供了一个开源的 Token 生成器 插件,支持使用 Go、C++、Java、Objective-C、Python、PHP、.NET、Node.js 语言生成 Token。

目前,我们提供的 Token 生成器支持生成以下两种类型的 Token:

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

生成两种 Token 时 payload 要求如下:

  • 基础鉴权 Token: 为了检查用户身份,您可以将 null 传递给 payload 字段。
  • 权限认证 Token: 为了通过验证房间 ID 和已推流的流 ID 来检查用户权限,需要根据以下验证规则生成有效 payload 字段:
    • 仅验证房间登录权限: payload 的 privilege 字段添加启用验证房间配置并禁用验证流发布权限配置。同时 room_id 设置为有效的房间 ID。
    • 仅验证流发布权限: payload 的 privilege 字段添加禁用验证房间配置并启用验证流发布权限配置。同时 stream_id_list 设置为有效的流 ID 列表。
    • 验证房间登录和流发布权限: payload 的 privilege 字段添加启用验证房间配置并启用验证流发布权限配置。同时 room_id 设置为有效的房间 ID,stream_id_list 设置为有效的流 ID 列表。
警告

出于业务安全考虑,您必须在应用服务器上生成 Token,否则,存在 ServerSecret 被盗取的风险。

语言支持的版本关键函数代码库地址示例代码 - 基础鉴权 Token示例代码 - 权限认证 Token
GoGo 1.14.15 or laterGenerateToken04
C++C++ 11 or laterGenerateToken04
JavaJava 1.8 or latergenerateToken04
PythonPython 3.6.8 or latergenerate_token04
PHPPHP 7.0 or latergenerateToken04
.NET.NET Framework 3.5 or laterGenerateToken04
Node.jsNode.js 8 or latergenerateToken04

如何获取临时 Token

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

使用 Token

如果你需要使用 Token 而不是 Appsign,您可以调用initWith而不带上appsign参数来完成初始化。

Untitled
ZIMKit.initWith(application, appID);
1
Copied!

如果您在没有appSign的情况下进行初始化,当调用ZIMKit.connectUser时将需要一个token。

更新 Token

在大多数情况下,上述提到的Token 获取方法应该可以正常工作。然而,在某些极端情况下,它可能不可靠。

为了确保 Token 的可靠性,您可以进行以下修改:

  1. Token 的有效期应尽可能设置得长,例如3天。
  2. 监听onTokenWillExpire回调,并调用renewToken来更新新的 Token。
Untitled
ZIMKit.registerZIMKitDelegate(new ZIMKitDelegate() {
    @Override
    public void onTokenWillExpire(int second) {
        // 请从您的应用服务器获取 Token。
        ZIMKit.renewToken(token,callback);
    }
});
1
Copied!
  1. 在适当的时候更新 Token,比如当应用程序进入前台时。
Untitled
// 请从您的应用服务器获取 Token。
ZIMKit.renewToken(token,callback);
1
Copied!

Previous

与 音视频通话 UIKit 一起使用

Next

向离线应用发送消息