Serverless中为单个API网关端点配置多种授权器的方法
单个API Gateway端点配置多种授权器的解决方案
刚好之前做过类似的跨应用授权场景,给你分享几个亲测有效的方案:
方案一:利用API Gateway原生多授权器支持(推荐)
AWS API Gateway现在已经支持单个端点绑定多个授权器了,完全适配你的需求,步骤也很清晰:
- 先在API Gateway控制台里分别配置好你的Cognito User Pool授权器和AWS_IAM授权器,确保各自单独测试能正常工作
- 进入目标端点的「集成请求」设置,找到「授权」模块,点击「添加授权器」,把这两个授权器都添加进去
- 这里的授权逻辑是OR关系——只要其中一个授权器验证通过,请求就会被放行,完美匹配你的iOS(IAM认证)和Angular(User Pool认证)双场景
- 测试小技巧:用Postman分别模拟两种请求:一种带AWS IAM签名,一种带Cognito User Pool的ID Token,确认都能正常访问端点
方案二:自定义Lambda授权器作为统一入口(兼容老版本)
如果你的API Gateway是比较旧的版本,或者需要更灵活的授权逻辑,可以用自定义授权器来统一处理两种认证方式:
- 写一个Lambda函数,在里面做两种认证的判断:
- 如果请求头的
Authorization是Bearer <token>格式,就调用Cognito的验证接口校验User Pool Token - 如果是
AWS4-HMAC-SHA256开头的签名,就用AWS SDK验证IAM签名的合法性
- 如果请求头的
- 把这个自定义授权器绑定到目标端点上,所有请求都会先经过这个Lambda判断
- 优势是可以自定义额外的权限逻辑(比如根据用户组做细粒度控制),缺点是需要自己维护Lambda代码和依赖
一些注意事项
- 权限配置要到位:IAM角色/用户需要拥有
execute-api:Invoke权限;Cognito User Pool的应用客户端要正确关联到授权器,并且token的受众(aud)要匹配 - 多授权器模式下,API Gateway会按你添加的顺序依次尝试验证,你可以把请求量更大的那个授权器放在前面,提升验证效率
- 测试时一定要覆盖两种认证场景,避免出现某一种授权失效的情况
内容的提问来源于stack exchange,提问作者okarlsson
相关产品推荐
相关产品推荐

