声网 Token 鉴权机制,以及常见的问题

news2024/11/25 20:21:12

Token鉴权是什么?

Token也称为动态密钥,是在加入频道时用于校验用户权限的一组字符串;鉴权是指在用户访问你的系统前,对其进行身份校验。用户在使用声网服务,如加入音视频通话或登录信令系统时,声网会使用 Token 对其鉴权。

我们为这种方式提供了一个较为形象的比喻,即:
某个展览馆需要游客实名认证后,获取专属入场券才可参观。游客在完成实名认证后可以获取到具备有效期限制的专属入场券,在进场时提供在有效期内的入场券,方能进场。其中:

  • 展览馆相当于声网的服务,即音视频频道或信令系统等;

  • 专属入场券相当于 Token;

  • 实名认证步骤相当于结合 声网 AppID、频道号、用户 ID 等信息 获取到专属 Token 的步骤;

  • 进场时校验入场券相当于鉴权,即校验 Token 是否和 声网 AppID、频道号、用户 ID 等信息匹配,且在有效期内。

声网的产品和服务中大部分采用Token 鉴权的方式。下面,我们针对如何生成和使用 Token,以及 Token 鉴权中常见的问题进行详细的讲解。

如何生成和使用Token?

1、Token 鉴权原理

在了解如何生成和使用Token 前,需要先了解 Token 鉴权的原理。

如图所示,共分为9个步骤:

1.客户端根据需要,向 app 服务端申请 Token

2.App 服务端生成并返回 Token

3.客户端以 UID、频道名以及获取到的 Token 加入频道

4.声网平台读取该 Token 中包含的信息,并进行校验

5.客户端收到加入频道成功回调,并获取用户 UID

6.Token 最大有效期为 24 小时。当即将过期时,客户端会收到 Token 即将过期的回调

7.此时,如果客户端需要继续进行音视频互动,需要申请新的 Token

8.App 服务端生成并返回 Token

9.客户端更新 Token

这个过程中,用户需要自行实现步骤1、2、3、7、8、9 的代码逻辑。
其中,对应的Token 包含以下信息:

  • 你在声网控制台创建项目时生成的 App ID

  • 频道名

  • 用户 ID

  • 用户权限,如是否能发流或收流

  • Token 的过期时间

2、申请与生成Token

可以看到,在用户加入频道前,客户端需要先向服务器申请Token,并在 服务器 生成 Token,且 Token 必须与 需要加入频道的用户所对应的 AppID、频道名、用户 ID(UID)信息、用户权限(是否能发流或收流) 一一对应,并且确保生成的 Token 在有效期内。然后才能以 UID、频道号 和 Token 加入对应频道。

向服务器申请Token,可以通过向服务器发送 GET 请求等方式自行实现,以下文章以供参考:

  • 部署 Token 服务器(官方文档):

https://docs.agora.io/cn/live-streaming-premium-4.x/token_server_ios_ng?platform=iOS#%E9%83%A8%E7%BD%B2-token-%E6%9C%8D%E5%8A%A1%E5%99%A8

  • 用Token-Flutter 连接 Agora (2021-09-15)

https://www.rtcdeveloper.cn/cn/community/blog/22929

  • 使用 Swift 部署声网 Token 服务器 (2022-10-27):

https://www.rtcdeveloper.cn/cn/community/blog/24981

  • 在NET Core 上建立 Agora AccessToken 服务 (2020-11-14):

https://www.rtcdeveloper.cn/cn/community/blog/19790

  • 如何用 GoLang 为声网 Agora 应用构建 Token 服务器 (2020-12-09):

https://www.rtcdeveloper.cn/cn/community/blog/20102

  • 如何使用 NodeJS 为声网 Agora 应用构建 Token 服务器 (2020-12-03):

https://www.rtcdeveloper.cn/cn/community/blog/20024

  • 使用 Java 构建 Agora 令牌服务器 (2021-02-07):

https://www.rtcdeveloper.cn/cn/community/blog/20709

  • 用 Java 构建声网令牌服务器 (2023-01-10):

https://www.rtcdeveloper.cn/cn/community/blog/25430

生成Token,可以使用声网提供的 Demo 实现,Demo 地址请参考:Token 生成器代码

请务必注意:例如用户使用 UID=123456(int 型)加入频道 ChannelName=“test”,那么生成 Token 时传入的参数 UID 和 ChannelName 必须是相对应的,即 UID=123456(int 型)且 ChannelName=“test”,否则会导致鉴权失败。

3、Token 过期处理

Token最大有效期为 24 小时。当即将过期时,客户端会收到 Token 即将过期的回调;Token 过期时,SDK 会触发 Token 过期回调。具体处理方式如下:

  • 在 Token 过期前 30 秒,SDK 会触发 tokenPrivilegeWillExpire 回调。收到该回调后,客户端需要从服务器获取新的Token 并调用 renewToken 将新生成的 Token 传给 SDK。

  • Token 过期时,SDK 会触发 rtcEngineRequestToken 回调。收到该回调后,客户端需要从服务器获取新的 Token 并调用 joinChannel 方法,再使用新的 Token 重新加入频道。

一般来说,我们建议在Token 过期前,及时更新 Token,即从服务器获取新的 Token 并调用 renewToken 将新生成的Token 传给 SDK。

常见问题

当你的声网项目中不存在无证书并且启用了主要/次要证书,则表示你选择使用动态密钥 Token 对用户进行鉴权。

由于Token 具有一定的时效性,因此 app 在运行过程中,你有可能会收到如下与 Token 相关的错误码或事件回调。本文对这些事件进行了梳理,提供触发的原因以及解决方法,帮助你在 App 出现异常时进行问题排查。

101:App ID无效

问题描述:

  • Native 端:SDK 在初始化声网服务时返回错误码 ERR_INVALID_APP_ID(101);或调用 joinChannel 方法加入频道时,SDK 回调 onError 事件,并报告错误码 ERR_INVALID_APP_ID(101)。

  • Web 端:在初始化 声网服务或调用 Client.join 方法加入频道时,Console 控制台打印错误码 ERR_INVALID_VENDOR_KEY(101)。

问题原因:
不是有效的App ID,一般是由于 App ID 的数据类型不对引起的。

解决方法:
建议检查 App ID 数据格式是否有效。声网的 App ID 为 String 型,请使用正确数据类型的 App ID,重新初始化声网服务。

109/118/2:Token 已过期

问题描述:

  • Native 端:调用 joinChannel 方法加入频道时,SDK 回调 onError 事件,并报告错误码 ERR_TOKEN_EXPIRED(109)。

  • Web 端:调用 Client.join 方法加入频道时,Console 控制台打印错误码 ERR_DYNAMIC_KEY_TIMEOUT(109)或ERR_DYNAMIC_KEY_EXPIRED(118)。

问题原因:

Token过期。

解决方法:

Token一旦过期,你就需要在服务端重新生成一个 Token,然后调用 renewToken 方法尝试重新加入频道。

110:Token 无效

问题描述:

  • Native 端:调用 joinChannel 方法加入频道时,SDK 回调 onError 事件,并报告错误码 ERR_INVALID_TOKEN(110)。

  • Web 端:调用 Client.join 方法加入频道时,Console 控制台打印错误码 ERR_NO_AUTHORIZED(110)。

问题原因:

生成的 Token 无效。一般有以下原因:

  • 你的声网项目中不存在无证书并且启用了主要/次要证书,但是加入频道时却未传入 Token;或者项目未开启主要/次要证书,就试图使用 Token 加入频道。

  • 你在服务端生成 Token 时填入的 App ID、用户 ID 和频道名,与你初始化和加入频道时填入的 App ID、用户 ID 和频道名不匹配。

解决方法:

  • 在加入频道前,请确认你在初始化时填入的 App ID 对应的项目是否已启用主要/次要证书。

  • 如果未启用主要/次要证书,则不能使用 Token 加入频道。

  • 如果项目中存在无证书并且已启用主要/次要证书,则既可以仅使用 App ID 加入频道,也可以使用主要/次要证书生成的 Token 加入频道。

  • 如果项目中不存在无证书并且已启用主要/次要证书,则必须使用 Token 加入频道。

  • 当确认使用 Token 加入频道时,还需要确认:

  • 用于生成 Token 的 App ID 和初始化服务时填入的 App ID 一致。

  • 用于生成 Token 的用户 ID 和加入频道时填入的用户 ID 一致,且数据类型也一致。

  • 用于生成 Token 的频道名和加入频道时填入的频道名一致。

119:静态厂商使用动态密钥

该错误码仅适用于RTC Web SDK。

问题描述:

Web端调用 Client.join 方法加入频道时,Console 控制台打印错误码 ERR_STATIC_USE_DYNAMIC_KEY(119)。

问题原因:

表示静态厂商使用了动态密钥。一般是由于使用的 App ID 对应的声网项目未启用主要/次要证书,却试图使用 Token 加入频道引起。

解决方法:

对于未开启主要/次要证书的项目,你可以不使用 Token 加入频道。你也可以先启用主要/次要证书,然后在服务端生成 Token 后重新加入频道。

120:动态厂商使用静态密钥

该错误码仅适用于RTC Web SDK。

问题描述:

Web端调用 Client.join 方法加入频道时,Console 控制台打印错误码 ERR_DYNAMIC_USE_STATIC_KEY(120)。

问题原因:

表示动态厂商使用了静态密钥。一般是由于使用的 App ID 对应的声网项目中不存在无证书并且已启用主要/次要证书,加入频道时却没有传入 Token 引起。

解决方法:

如果 App ID 对应的项目中不存在无证书并且已启用主要/次要证书,则必须使用 Token 进行鉴权。你也可以换一个没有启用主要/次要证书的项目的 App ID,然后尝试重新加入频道。

Token过期相关事件回调

为保证通信体验,声网提供如下两个回调,提醒用户Token 即将过期或已经过期:

  • onTokenPrivilegeWillExpire:该回调表示 Token 即将在 30 秒内失效。收到这个回调时,你需要在服务端重新生成Token,然后调用 renewToken 方法,将新生成的 Token 传给 SDK。

  • onRequestToken(Web 平台为 onTokenPrivilegeDidExpire):该回调表示 Token 已经失效。收到这个回调时,你需要在服务端重新生成 Token,然后调用 joinChannel 方法重新尝试加入频道。

各语言Token错误码对照

附录

  • 注册并试用每月 10000 分钟免费的声网视频SDK,体验四行代码、三十分钟快速构建沉浸式实时互动场景
  • 下载体验声网相关 SDK & Demo

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/471873.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

广州华锐互动:工厂园区数字孪生系统让企业管理更加高效便捷

随着信息技术的快速发展,企业管理越来越倾向于数字化和智能化,而数字孪生技术在这一领域中扮演着重要角色。 工厂园区数字孪生系统是一种基于数字孪生技术的智能化系统,可以模拟工厂生产过程,将真实场景数字化,并进行…

高阶数据结构 ——— 并查集

文章目录 并查集并查集的原理并查集的实现并查集的初始化查找元素所在的集合合并两个元素所在的集合获取并查集中集合的个数并查集的路径压缩元素的编号问题 并查集的题目省份的数量等式方程的可满足性 并查集 并查集是一种树型的数据结构,用于处理一些不相交集合的…

如何合理使用 Jetpack 组件开发 Android 项目?

Jetpack 是 Android 官方推出的一套开发库,其中包含众多的组件,可以让 Android 开发者更快更高效地开发应用程序。Jetpack 组件分为四大部分:架构、行为、UI 和基础组件。 下面详细阐述如何合理使用 Jetpack 组件开发 Android 项目。 1. 熟练…

openQA----基于openSUSE部署openQA

【原文链接】openQA----基于openSUSE部署openQA (1)下载 openqa-bootstrap 脚本并执行 cd /opt/ curl -s https://raw.githubusercontent.com/os-autoinst/openQA/master/script/openqa-bootstrap | bash -x(2)配置apache proxy…

Nestjs全网最佳翻译-概况-守卫-Guards

守卫 带上装饰器 Injectable() 并实现了 CanActivate 接口的类,就是守卫。 守护只做一件事情。他们根据运行时的某些条件(如权限、角色、ACL等)来决定一个给定的请求是否会被路由处理程序处理。这通常被称为授权。在传统的Express应用程序中…

浅析AI视频智能检测技术在城市管理中的场景应用

随着中国的城市建设和发展日益加快,城镇化过程中重建设、轻管理模式带来不少管理难点,传统城管模式存在违法问题多样、缺乏源头治理、业务协同难、取证手段单一等,人员不足问题进一步加剧管理难度。随着移动互联网、物联网、云计算、大数据、…

Vue3 全局实例上挂载属性方法

导语 在大多数开发需求中,我们有时需要将某个数据,或者某个函数方法,挂载到,全局实例身上,以便于,在项目全局的任何位置都能够调用其方法,或读取其数据。 在Vue2 中,我们是在 main.j…

【Unity URP】Rendering Debugger和可视化MipMap方案

写在前面 最近开始学习Unity性能优化,是结合了《Unity游戏优化》这本书和教程《Unity性能优化》第叁节——静态资源优化(3)——纹理的基础概念一起学习。在学习纹理优化部分时候遇到了问题,固定管线下Unity的Scene窗口有一个可视化Mipmap的渲染模式&…

ChatGPT实现数据结构转换

数据结构转换 在应用系统开发和维护中,经常会有配置数据或客户数据需要在不同的序列化结构中相互转换的需求。不同编程语言之前,对数据结构的偏好也不一样,比如 JavaScript 一般使用 JSON、Java 一般使用 XML、Ruby 一般使用 YAML、Golang 一…

搞懂 API , API 这些特点要记住

API 是现代软件开发和应用程序中的必要组成部分,它为企业和开发者提供了极大的便利和工作效率。不过,API 也有其不足之处。下面将在这篇文章中详细探讨 API 的优点和缺点。 优点: 简化数据访问和交互 API 消除了传统的数据集成方法&#x…

使用chatGPT开发获取格点天气数据

1. 格点天气 1.1. 格点天气 以经纬度为基准的全球高精度、公里级、格点化天气预报产品,包括任意经纬度的实时天气和天气预报。其中,任意坐标的高精度天气,精确到3-5公里范围,包括:温度、湿度、大气压、天气状况、风力…

nvidia-smi命令解析

桌面端 服务器端 Fan:风扇转速(0%-100%),N/A表示没有风扇 Temp:GPU温度(GPU温度过高会导致GPU频率下降) Perf:性能状态,从P0(最大性能)到P12(最…

zookeeper 安装下载与集群

一、单机部署 1、安装包下载 https://archive.apache.org/dist/zookeeper 2、上传并解压 tar -zvxf zookeeper-3.4.14.tar.gz3、配置环境变量 my_env.sh是自己创建的环境变量文件,你也可以自己创建 vim /etc/profile.d/my_env.sh#ZOOKEEPER_HOME export ZOOKE…

什么是分布式任务调度?怎样实现任务调度

通常任务调度的程序是集成在应用中的,比如:优惠卷服务中包括了定时发放优惠卷的的调度程序,结算服务中包括了定期生成报表的任务调度程序,由于采用分布式架构,一个服务往往会部署多个冗余实例来运行我们的业务&#xf…

1.3 防火墙通过TELNET登录设备

防火墙通过TELNET登录设备 需求:使远程管理员能够通过telnet方式登录到设备上进行管理 序号任务任务说明备注1物理连接略2登录设备略3配置设备telnet设备默认不支持telnet功能,必须开启telnet功能,以及用于远程登录设备的账号密码等。重点4测…

【hello Linux】进程间通信——共享内存

目录 前言: 1. System V共享内存 1. 共享内存的理解 2. 共享内存的使用步骤 3. 共享内存的使用 1. 共享内存的创建 查看共享内存 2. 共享内存的释放 3. 共享内存的挂接 4. 共享内存的去挂接 4. 共享内存的使用示例 1. 两进程挂接与去挂接演示: 2. 两进程…

基于eNSP的IPv4加IPv6的企业/校园网络规划设计(综合实验/大作业)

作者:BSXY_19计科_陈永跃 BSXY_信息学院_名片v位于结尾处 注:未经允许禁止转发任何内容 基于eNSP的IPv4加IPv6的企业/校园网络规划设计_综合实验/大作业 前言及技术/资源下载说明( **未经允许禁止转发任何内容** )一、设计topo图与…

Postgresql逻辑优化学习

张树杰优化器原理学习 0 用例 drop table student; create table student(sno int primary key, sname varchar(10), ssex int); insert into student values(1, stu1, 0); insert into student values(2, stu2, 1); insert into student values(3, stu3, 1); insert into stu…

SPSS岭回归报错问题 第 8 列中的 错误号 34+乱码问题

1首先第一个问题,先找到Ridge Regression.sps文件 注意各国语言都有这个文件,选择English下的 得到位置,一般是安装路径\Samples\English\Ridge Regression.sps 仍然报错,将第二行变成大写:RIDGEREG ENTER&#xff0…

笔记本电脑没有声音了怎么恢复

笔记本电脑 在使用的过程中,突然没有声音的话,对于人们来说会很麻烦。那么笔记本电脑没有声音了怎么恢复呢?下面小编为大家整理了笔记本电脑没有声音的恢复方法,一起来看看吧。 方法/步骤: 方法一:网络适配器检查音频…