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

如何在Node.js Azure函数中为无服务器SignalR服务自定义协商用户

在Node.js Azure函数中为SignalR令牌注入用户身份

可行,你可以通过手动使用Azure SignalR Service管理SDK生成连接信息的方式,将解析后的用户标识注入到SignalR访问令牌中,完全规避客户端伪造身份的风险,同时满足SignalR服务对用户身份标识的要求。

实现步骤:

  1. 安装SignalR管理SDK依赖
    在函数项目中安装官方管理SDK:
npm install @azure/signalr-service-management
  1. 修改协商端点代码
    移除原有的signalRConnectionInfo输入绑定,改用SDK手动生成带用户ID的连接信息,同时集成你们已有的JWT验证逻辑:
const { SignalRManagementClient } = require("@azure/signalr-service-management");

async function negotiate(request, context) {
  try {
    // 1. 提取并验证客户端携带的JWT(替换为你们的共享验证逻辑)
    const authHeader = request.headers.get("Authorization");
    if (!authHeader || !authHeader.startsWith("Bearer ")) {
      return { status: 401, body: "未授权" };
    }
    const jwtToken = authHeader.slice(7);
    // 调用你们的共享逻辑验证JWT并获取用户标识
    const userId = await yourSharedAuthLogic.validateAndGetUserId(jwtToken);
    if (!userId) {
      return { status: 401, body: "无效令牌" };
    }

    // 2. 使用管理SDK生成带用户ID的SignalR连接信息
    const connectionString = process.env.AzureSignalRConnectionString;
    const signalRClient = new SignalRManagementClient(connectionString);
    const connectionInfo = await signalRClient.getClientConnectionInfo("my-hub", { userId });

    return { body: JSON.stringify(connectionInfo) };
  } catch (error) {
    context.log(error);
    return {
      status: 500,
      jsonBody: { message: "生成连接信息失败" }
    };
  }
}

app.post("negotiate", {
  authLevel: "anonymous", // 保持匿名,因为已自行处理JWT验证
  handler: negotiate,
  route: "negotiate"
});

关键说明:

  • 这种方式完全通过你们的可信逻辑获取用户ID,避免了直接从请求头/参数提取身份的伪造风险;
  • SDK生成的连接信息中,访问令牌会自动包含SignalR服务所需的asrs.s.uid声明,确保服务能识别用户身份,支持后续向特定用户发送消息;
  • 需确保函数应用的环境变量中配置了AzureSignalRConnectionString,值为你的Azure SignalR服务连接字符串。

为什么原有绑定方式不适用:

  • userId绑定:直接从请求头/参数提取,无法保证身份的真实性,存在伪造风险;
  • idToken+claimTypeList绑定:仅能传播JWT中的现有声明,但无法将用户标识映射到SignalR服务要求的asrs.s.uid字段,因此服务无法识别用户身份。

内容的提问来源于stack exchange,提问作者yohny

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.17 22:23:21