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

如何让ApiGateway在WebSocket会话全程保留授权头以便断开时获取?

AWS API Gateway WebSocket 保留Authorization头至$disconnect事件的实现方案

AWS API Gateway WebSocket服务默认不会在$disconnect路由事件中直接携带连接建立时的authorization请求头,但可以通过以下两种可靠方式实现连接生命周期内的信息保留:

方法一:连接建立时存储身份信息到连接元数据

在$connect路由的后端处理逻辑(比如Lambda函数)中,从请求上下文提取authorization头的值,调用API Gateway的PutConnection接口将该值存入连接的自定义元数据中。当$disconnect事件触发时,就能从事件上下文的connectionAttributes字段中读取到之前存储的信息。

示例代码(Node.js Lambda为例):

$connect 处理函数

const AWS = require('aws-sdk');
const apigatewayManagementApi = new AWS.ApiGatewayManagementApi({
  endpoint: process.env.API_GATEWAY_WEBSOCKET_ENDPOINT
});

exports.handler = async (event) => {
  const authHeader = event.requestContext.authorization;
  const connectionId = event.requestContext.connectionId;

  // 将authorization头存入连接元数据
  await apigatewayManagementApi.putConnection({
    ConnectionId: connectionId,
    ConnectionAttributes: {
      authorization: authHeader
    }
  }).promise();

  return { statusCode: 200 };
};

$disconnect 处理函数

exports.handler = async (event) => {
  // 从连接元数据中读取authorization值
  const authValue = event.requestContext.connectionAttributes?.authorization;
  
  // 执行断开后的处理逻辑,比如清理用户在线状态等
  console.log('用户断开连接,身份信息:', authValue);

  return { statusCode: 200 };
};

方法二:配置Lambda授权器传递身份上下文

给WebSocket API配置Lambda授权器,在授权器中验证authorization头的有效性后,将该头的值(或经过处理的身份标识)注入到授权上下文中。API Gateway会在整个连接生命周期内保留这个授权上下文,包括$disconnect事件触发时。此时在$disconnect的后端处理函数中,可直接从event.requestContext.authorizer字段获取对应的身份信息。

注意事项

  • 连接元数据的存储上限为1KB,若authorization头内容过长,建议只存储关键身份标识(如用户ID)而非完整的token。
  • 使用Lambda授权器时,合理配置缓存策略可减少重复验证的性能开销。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.09 00:40:28