如何让ApiGateway在WebSocket会话全程保留授权头以便断开时获取?
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
相关产品推荐
相关产品推荐

