如何通过AWS API Gateway + Cognito + IAM限制外部用户访问API特定端点的指定方法
如何通过AWS API Gateway + Cognito + IAM限制外部用户访问API特定端点的指定方法
看起来你已经搭好核心的基础组件了,剩下的就是把这些环节彻底打通,我来一步步给你梳理清楚具体操作:
1. 确认API Gateway目标方法的授权类型
进入AWS API Gateway控制台,找到你要保护的那个端点的POST/PUT/DELETE方法,把它们的「授权类型」修改为IAM。如果你的GET方法允许外部用户访问,要么保持原有授权(比如Cognito用户池授权),要么也设置为IAM并给外部角色配置对应权限。
2. 细化IAM角色的权限策略
针对外部用户的IAM角色,修改其权限策略,明确只允许对目标端点执行GET操作,同时拒绝POST/PUT/DELETE的调用权限。示例策略如下:
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": "execute-api:Invoke", "Resource": "arn:aws:execute-api:你的区域:你的账号ID:API ID/阶段/GET/端点路径" }, { "Effect": "Deny", "Action": ["execute-api:Invoke"], "Resource": [ "arn:aws:execute-api:你的区域:你的账号ID:API ID/阶段/POST/端点路径", "arn:aws:execute-api:你的区域:你的账号ID:API ID/阶段/PUT/端点路径", "arn:aws:execute-api:你的区域:你的账号ID:API ID/阶段/DELETE/端点路径" ] } ] }
而内部用户的IAM角色,直接配置允许所有方法的execute-api:Invoke权限即可,不需要添加Deny规则。
3. 配置Cognito用户组与IAM角色的映射
- 如果你还没关联身份池,先创建一个Cognito身份池并关联你的用户池;
- 进入身份池的「认证提供商」设置,选择Cognito后找到「角色映射」选项;
- 开启「使用自定义角色映射」,然后设置规则:当用户属于
internal组时,分配内部IAM角色;属于external组时,分配外部IAM角色。这里的匹配条件可以用cognito:groups字段,对应组名即可。
4. 确保API Gateway正确传递身份信息
如果你的API用的是Lambda代理集成,身份信息会自动传递到后端;如果是其他集成方式,需要在「集成请求」的请求模板里,确保Cognito的用户组或身份ID被正确传递——不过核心是让IAM能识别用户对应的角色,这一步只要角色映射配置正确,一般不会有问题。
5. 测试验证
- 用外部组的用户账号生成Cognito访问令牌,调用POST/PUT/DELETE方法,应该会收到
403 Forbidden响应; - 调用GET方法则应该正常返回数据;
- 切换到内部组用户测试,所有方法都能正常执行。
备注:内容来源于stack exchange,提问作者Devin Gardner
相关产品推荐
相关产品推荐

