You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用Node.js生成适配agora-rn-uikit的Agora临时RTC Token

解决方案:生成适配agora-rn-uikit的Agora RTC Token

1. 明确Agora控制台临时Token的特性

控制台生成的临时Token默认遵循以下规则:

  • 基于UID生成(而非用户账号)
  • UID设为0(允许客户端自动获取临时UID)
  • 角色为publisher(拥有发布和订阅流的权限)
  • 默认有效期24小时

2. 调整Node.js服务器代码

修改生成逻辑,匹配控制台的Token规则,同时支持客户端动态获取对应UID的Token:

const express = require("express");
const { RtcTokenBuilder, RtcRole } = require("agora-access-token");
require("dotenv/config");

const app = express();

const nocache = (_, resp, next) => {
  resp.header("Cache-Control", "private, no-cache, no-store, must-revalidate");
  resp.header("Expires", "-1");
  resp.header("Pragma", "no-cache");
  next();
};

const generateRTCToken = (req, resp) => {
  resp.header("Access-Control-Allow-Origin", "*");

  const channelName = req.params.channel;
  if (!channelName) {
    return resp.status(500).json({ error: "channel is required" });
  }

  // 支持UID为0(控制台默认逻辑),也支持自定义UID
  let uid = req.params.uid ? parseInt(req.params.uid, 10) : 0;
  
  // 固定设为publisher(和控制台一致,确保拥有发布订阅权限)
  const role = RtcRole.PUBLISHER;

  // 默认有效期3600秒,可通过query参数调整
  let expireTime = req.query.expiry ? parseInt(req.query.expiry, 10) : 3600;
  const currentTime = Math.floor(Date.now() / 1000);
  const privilegeExpireTime = currentTime + expireTime;

  // 用UID生成Token(和控制台逻辑一致)
  const token = RtcTokenBuilder.buildTokenWithUid(
    process.env.APP_ID,
    process.env.APP_CERTIFICATE,
    channelName,
    uid,
    role,
    privilegeExpireTime
  );

  return resp.json({ rtcToken: token, channel: channelName, uid });
};

// 简化路由:支持传入频道和可选UID,默认UID为0
app.get("/rtc/:channel/:uid?", nocache, generateRTCToken);

app.listen(process.env.PORT, () => {
  console.log(`Listening on port: ${process.env.PORT}`);
});

3. 调整React Native客户端代码

确保客户端使用的UID和生成Token的UID一致,或者使用UID=0让Agora自动分配:

场景1:自动分配UID(和控制台完全一致)

const App = () => {
  const [videoCall, setVideoCall] = useState(true);
  const [rtcToken, setRtcToken] = useState("");

  // 初始化时从服务器获取Token(UID=0)
  useEffect(() => {
    fetch(`http://你的服务器地址/rtc/test`) // 频道名test,UID默认0
      .then(res => res.json())
      .then(data => setRtcToken(data.rtcToken));
  }, []);

  const connectionData = {
    appId: '<你的Agora App ID>',
    channel: 'test',
    rtcToken: rtcToken,
    // 不指定rtcUid,或设为0,Agora会自动分配临时UID
  };

  const rtcCallbacks = {
    EndCall: () => setVideoCall(false),
  };

  return videoCall ? (
    rtcToken ? <AgoraUIKit connectionData={connectionData} rtcCallbacks={rtcCallbacks} /> : <Text>Loading...</Text>
  ) : (
    <Text onPress={()=>setVideoCall(true)}>Start Call</Text>
  );
};

场景2:使用自定义UID(避免冲突)

如果需要指定固定UID,确保每个客户端的UID唯一,并且获取Token时传入该UID:

// 客户端示例:UID设为12345
useEffect(() => {
  fetch(`http://你的服务器地址/rtc/test/12345`) // 传入UID=12345
    .then(res => res.json())
    .then(data => setRtcToken(data.rtcToken));
}, []);

const connectionData = {
  appId: '<你的Agora App ID>',
  channel: 'test',
  rtcToken: rtcToken,
  rtcUid: 12345 // 和请求Token时的UID一致
};

关键注意事项

  • Token参数一致性:生成Token时的appId、channelName、uid必须和客户端传入AgoraUIKit的完全一致,否则会报110错误。
  • UID唯一性:多个客户端不能使用同一个UID加入同一频道,否则会导致远端流无法显示。
  • 权限设置:必须使用RtcRole.PUBLISHER角色,否则客户端无法发布或订阅流。
  • 环境变量验证:确保服务器的APP_ID和APP_CERTIFICATE和控制台的完全一致,没有拼写错误。

内容的提问来源于stack exchange,提问作者Ahmed Al Sawy

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.19 23:55:24