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

无法在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.12 16:24:57