Flutter无后端时如何创建Agora频道并更新AgoraRTCEngine Token
无后端纯Flutter侧实现Agora频道创建与Token更新方案
重要提示:以下方案仅适用于个人开发测试、非公开内部使用场景,将Agora App证书硬编码打包进客户端存在证书泄露、被恶意盗用产生资费损耗的风险,正式商用环境必须通过服务端生成、下发Token。
核心逻辑
Agora频道Token本质是基于约定HMAC签名算法生成的校验字符串,生成逻辑完全公开,不需要依赖官方接口或第三方服务。只要持有项目App ID、App证书、频道名、用户UID、过期时间戳这几个核心参数,即可在客户端本地计算出合法可用的Token,也可在过期时直接重新生成更新。
具体实现步骤
- 准备核心凭证
进入Agora控制台对应项目页面,复制保存项目的App ID和主App证书(即项目根目录下的服务端校验证书,不是控制台手动生成的临时Token)。 - 引入依赖
在项目pubspec.yaml中引入Agora官方提供的纯Dart版Token生成库,该库可直接从pub官方仓库获取,封装了完整的Token签名逻辑,运行时无外部服务请求。 - 封装本地Token生成工具方法
示例代码如下:// 注意:以下两个参数仅测试场景可硬编码在客户端,正式发布版本禁止写入客户端 const String kAgoraAppId = "你的项目App ID"; const String kAgoraAppCert = "你的项目主App证书"; Future<String> genLocalAgoraToken({ required String channelId, required int uid, // 可自定义Token有效期,单位为秒,示例设置为24小时 int validDurationSec = 86400, }) async { final expireTimestamp = DateTime.now().millisecondsSinceEpoch ~/ 1000 + validDurationSec; // 调用库方法直接生成Token,角色可根据业务调整为主播/观众 final token = RtcTokenBuilder.buildTokenWithUid( kAgoraAppId, kAgoraAppCert, channelId, uid, Role.broadcaster, expireTimestamp, expireTimestamp ); return token; } - 实现入频道与自动续期逻辑
- 首次加入频道时,直接调用上述
genLocalAgoraToken方法生成Token,传入joinChannel接口即可正常加入频道,无需提前在控制台手动生成Token。 - 注册RtcEngine事件回调,监听Token过期相关事件,在回调中自动重新生成并更新Token,无需退出频道、无需用户手动操作:
rtcEngine.registerEventHandler( RtcEngineEventHandler( // Token即将过期时触发,提前续期避免通话中断 onTokenPrivilegeWillExpire: (oldToken) async { final newToken = await genLocalAgoraToken( channelId: currentChannelId, uid: currentUid, ); await rtcEngine.renewToken(newToken); }, // Token已过期时触发,重新生成后恢复通话 onRequestToken: () async { final newToken = await genLocalAgoraToken( channelId: currentChannelId, uid: currentUid, ); await rtcEngine.renewToken(newToken); }, ) ); - 首次加入频道时,直接调用上述
方案说明
- 该方案完全离线运行,不需要部署任何后端服务,也不需要手动登录Agora控制台操作,只要凭证正确即可无限期生成、更新有效Token,满足无后端场景的测试、开发需求。
- 该方案的安全缺陷无法避免:客户端安装包可通过逆向工程提取硬编码的App证书,恶意获取证书后可盗用你的Agora账号资源产生资费,公开发布的正式版本禁止使用该方案。
- 后续如果部署了后端服务,仅需将本地生成Token的逻辑替换为向后端请求Token的逻辑,上层的入频道、续期业务代码不需要做任何调整。
内容的提问来源于stack exchange,提问作者Mohamed Ayman
相关产品推荐
相关产品推荐

