使用Agora SDK实现屏幕共享时出现NO_AUTHORIZED认证错误如何解决
错误根因
Join failed: NO_AUTHORIZED 是声网Web SDK 3.x的鉴权失败错误,由屏幕共享独立Client的鉴权参数不匹配导致,具体触发原因和修复方案如下:
- Token与UID绑定校验失败
你当前复用了主视频通话的Token用于屏幕共享的独立Client,存在两个问题:- 如果主通话Token生成时绑定了指定UID,屏幕共享Client调用
join方法时传入null作为UID参数,会直接触发鉴权失败 - 同一Token不可同时用于两个不同Client实例加入同一频道,会触发互踢或鉴权失败
修复方案:为屏幕共享Client单独生成专属Token,生成时绑定一个和主通话UID不重复的独立UID,调用join方法时第三个参数传入该绑定UID,不要传null
- 如果主通话Token生成时绑定了指定UID,屏幕共享Client调用
- AppID不匹配
检查shareClient.init传入的AppID,和生成屏幕共享Token时使用的AppID是否完全一致,大小写、特殊字符不能有差异。如果是临时调试,可以先将声网项目的鉴权模式切换为仅AppID模式,验证功能逻辑是否正常,排除Token生成逻辑错误 - 频道名不匹配
确认join方法传入的频道名,和生成屏幕共享Token时填入的频道名完全一致,注意空格、大小写、特殊字符的区别
修正后代码示例
async shareScreen() { this.shareClient = AgoraRTC.createClient({ mode: 'rtc', codec: 'vp8' }) // 此处AppID需和生成屏幕共享Token的AppID完全一致 this.shareClient.init('你的项目AppID', () => { // 第一个参数填屏幕共享专属Token,第三个参数填和Token绑定的独立UID this.shareClient.join('屏幕共享专属有效Token', '和主通话一致的频道名', 屏幕共享独立UID, (uid) => { const streamSpec = { streamID: uid, audio: false, video: false, screen: true } if (isFirefox()) { streamSpec.mediaSource = 'window'; } else if (!isCompatibleChrome()) { streamSpec.extensionId = 'minllpmhdgpndnkomcoccfekfegnlikg'; } this.shareScreenStream = AgoraRTC.createStream(streamSpec); // 初始化流 this.shareScreenStream.init(() => { this.shareScreenStream.play('renderer'); this.shareClient.publish(this.shareScreenStream); }, function(err) { console.log(err); }); }, function(err) { console.log(err); }) }); }
额外排查提示
如果调整后仍报错,可以在Token生成服务端增加日志,确认生成Token时传入的AppID、频道名、UID三个参数,和客户端调用join时传入的三个参数完全匹配,90%以上的NO_AUTHORIZED错误都是参数不匹配导致的。
内容的提问来源于stack exchange,提问作者Mhd Omar Bahra
相关产品推荐
相关产品推荐

