无法在API Gateway中获取Cognito Identity作为路径参数
API Gateway直接存S3时拿不到Cognito用户ID的解决办法
核心原因
API Gateway直接集成S3的非Lambda场景里,context.identity这类变量没法直接在集成请求的路径/参数映射里用——只有Lambda集成或者自定义授权器输出的上下文参数,才能在这种映射里被访问到。你其他Lambda端点能正常获取用户信息,就是因为Lambda能直接拿到完整的请求上下文。
可行解决方案
1. 添加自定义授权器(推荐方案)
创建一个简单的Cognito自定义授权器,验证用户身份后把用户ID注入请求上下文:
- 授权器类型选「Cognito用户池」,关联你已有的用户池
- 在授权器的输出设置中,将
cognito:username或sub(用户唯一ID)设为自定义上下文参数,比如命名为cognitoUserId - 在PUT端点的Method Request里启用这个自定义授权器
之后在S3集成请求的Path Override中,就可以通过$context.authorizer.cognitoUserId引用用户ID了。
2. 改用Lambda中转(兼容老配置)
如果不想调整授权器,可以把直接集成S3改成Lambda集成:
- 编写一个极简Lambda函数,接收上传文件,从
event.requestContext.identity.cognitoIdentityId中获取用户ID - Lambda将文件以用户ID为文件名上传到目标S3桶
- API Gateway的PUT端点集成该Lambda,处理上传逻辑
3. 排查现有配置遗漏(仅针对坚持直接集成的情况)
若一定要用直接集成S3的方式,检查以下配置:
- 确认Method Request的授权类型是「Cognito User Pool」,且已正确关联用户池,测试调用时确实携带了有效的JWT令牌
- 检查集成请求的映射模板,对应上传文件的Content-Type(如
multipart/form-data或application/octet-stream)下,是否正确引用了上下文变量(注意直接集成S3的映射模板规则和Lambda集成不同)
示例配置(自定义授权器方案)
授权器配置完成后,在S3集成请求的Path override中设置:
your-bucket-name/${context.authorizer.cognitoUserId}-${context.requestId}-${method.request.path.wishid}
需确保Method Request中已添加wishid路径参数,且已启用自定义授权器。
内容的提问来源于stack exchange,提问作者Darren
相关产品推荐
相关产品推荐

