使用 Token 鉴权,指用户进行登录时,ZIM 的业务服务端会根据用户登录时携带的 Token 参数,判断用户是否有权限进行登录,避免因权限控制缺失或操作不当引发的风险问题。
用户登录 ZIM 的服务端之前,开发者服务端应先生成 Token,ZIM 服务端会对带着 Token 的用户进行校验,根据 Token 参数判断用户是否为合法登录的用户。
登录时 Token 校验的流程如下图:
以下将介绍开发者的服务端如何生成 Token、如何使用 SDK 设置 Token、以及 Token 过期时的处理方式。
Token 有效时长不能超过 24 天,为保证安全性,ZEGO 强烈建议开发者在自己的服务端生成 Token。
前往 ZEGO 控制台 创建项目,获取接入 ZIM SDK 服务所需的 AppID 和 ServerSecret。ZIM 服务权限不是默认开启的,使用前,请先在 ZEGO 控制台 自助开通 ZIM 服务(详情请参考 项目管理 - 即时通讯),若无法开通 ZIM 服务,请联系 ZEGO 技术支持开通。
客户端向开发者服务端发送请求申请 Token,由开发者服务端计算 Token 并返回给对应客户端。
为方便开发者使用,ZEGO 在 GitHub/Gitee 提供了一个开源的 zego_server_assistant 插件,支持使用 Go、C++、Java、Python、PHP、.NET、Node.js 等语言,在开发者的服务端部署生成 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 7.0 或以上版本 |
generateToken04 |
|
.NET |
.NET Framework 3.5 或以上版本 |
GenerateToken04 |
|
Node.js |
Node.js 8 或以上版本 |
generateToken04 |
以 Go 语言为例,开发者可参考以下步骤使用 zego_server_assistant 生成 Token:
import zsa "your-project-go-mod-path/zegoserverassistant"
引入插件,需要将 “your-project-go-mod-path” 替换为开发者自己的项目名称。GenerateToken04
方法生成 Token。var appId uint32 = <Your AppId> // type: uint32
userId := <Your userID> // type: string
secret := <ServerSecret> // type: 32 byte length string
var effectiveTimeInSeconds int64 = <Your token effectiveTime> //type: int64; unit: s
token, err := zsa.GenerateToken04(appId, userId, secret, effectiveTimeInSeconds)
if err != nil {
fmt.Println(err)
return
}
fmt.Println(token)
以下示例代码仅供参考。Token 有效时长不能超过 24 天,为保证安全性,ZEGO 强烈建议开发者在自己的服务端生成 Token。
浏览器端生成 Token 的代码示例请参考如下:
import CryptoJS from 'crypto-js';
const appConfig = {
appID: 0, // 填写申请的 AppID
serverSecret: '', // 填写申请的 ServerSecret
};
/**
* 生成 token
*
* Token = “04” + Base64.encode(expire_time + IV.length + IV + 二进制密文.length + 二进制密文)
* 算法:AES<ServerSecret, IV>(token_json_str),使用模式: CBC/PKCS5Padding
*
* 这里仅提供生成 token 的客户端示例代码。请务必在您的业务后台生成 token,避免泄漏您的 ServerSecret
*/
export function generateToken(userID, seconds) {
if (!userID) return '';
// 构造 加密数据
const time = (Date.now() / 1000) | 0;
const body = {
app_id: appConfig.appID,
user_id: userID,
nonce: (Math.random() * 2147483647) | 0,
ctime: time,
expire: time + (seconds || 7200), // 有效时长不能超过 24 天
};
// 加密 body
const key = CryptoJS.enc.Utf8.parse(appConfig.serverSecret);
let iv = Math.random().toString().substring(2, 18);
if (iv.length < 16) iv += iv.substring(0, 16 - iv.length);
const ciphertext = CryptoJS.AES.encrypt(JSON.stringify(body), key, { iv: CryptoJS.enc.Utf8.parse(iv) }).toString();
const ciphert = new Uint8Array(Array.from(atob(ciphertext)).map((val) => val.charCodeAt(0)));
const len_ciphert = ciphert.length;
// 组装 token 数据
const uint8 = new Uint8Array(8 + 2 + 16 + 2 + len_ciphert);
// expire: 8
uint8.set([0, 0, 0, 0]);
uint8.set(new Uint8Array(new Int32Array([body.expire]).buffer).reverse(), 4);
// iv length: 2
uint8[8] = iv.length >> 8;
uint8[9] = iv.length - (uint8[8] << 8);
// iv: 16
uint8.set(new Uint8Array(Array.from(iv).map((val) => val.charCodeAt(0))), 10);
// 密文 length: 2
uint8[26] = len_ciphert >> 8;
uint8[27] = len_ciphert - (uint8[26] << 8);
// 密文
uint8.set(ciphert, 28);
const token = `04${btoa(String.fromCharCode(...Array.from(uint8)))}`;
console.log('generateToken', iv.length, body, token);
return token;
}
Token 有效时长不能超过 24 天,为保证安全性,ZEGO 强烈建议开发者在自己的服务端生成 Token。
用户在登录时传入权限相关的 Token,并设置对应的权限。
var useID = 'xxxx';
var config = {
userName: 'xxxx',
token: '',// 有效时长不能超过 24 天,请求开发者服务端获取
}
zim.login(useID, config)
.then(function() {
// 登录成功
})
.catch(function(err) {
// 登录失败
});
在 Token 过期前 30 秒,SDK 会通过 tokenWillExpire 回调发出通知。若登录成功后 Token 有效期不足 30 秒,则会立即回调。
收到该回调后,开发者需要从自己的服务端获取新的有效 Token,并调用 SDK 提供的 renewToken 接口更新 Token。
当 Token 过期且未得到更新时,用户会掉线,收到 connectionStateChanged 回调,其中 event
为 TokenExpired
,state
为 Disconnected
。
// 注册监听“令牌即将过期”的回调
zim.on('tokenWillExpire', function(zim, second) {
var token = ''; // 有效时长不能超过 24 天,重新请求开发者服务端获取 Token
zim.renewToken(token)
.then(function({ token }) {
// 更新成功
})
.catch(function(err) {
// 更新失败
});
})
方法 | 描述 |
---|---|
login | 登录 ZIM 服务。 |
renewToken | 更新鉴权 Token。 |
tokenWillExpire | Token 过期回调。 |
联系我们
文档反馈