Api Gateway通过Cognito管理权限遇问题:已设拒绝组仍可访问,求原理解析
Cognito管理API Gateway访问权限的核心机制
先得把「认证」和「授权」这俩核心环节分开,很多人容易搞混:
1. 认证:只负责确认“你是谁”
当你把API Gateway和Cognito用户池绑定后,API Gateway做的第一件事是验证请求里的Token是不是合法的:
- 检查Token的签名有没有被篡改(用Cognito公开的密钥验证)
- 确认Token没过期、受众(Audience)是你的API、发行方(Issuer)是你的Cognito用户池
- 这一步只管“这个用户是我Cognito池里的合法用户”,完全不关心“他能不能访问这个API”
2. 授权:才是决定“你能不能进”的关键
认证通过后,API Gateway才会进入授权环节,这部分有两种常用玩法:
- 基于IAM的授权:
- 首先得在API Gateway的方法设置里,把「授权类型」改成「IAM」(不是只选Cognito用户池!)
- 然后给Cognito用户组绑定对应的IAM策略,策略里明确写清楚允许或拒绝访问哪些API资源、哪些动作(比如
execute-api:Invoke) - 举个拒绝访问的策略例子:
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Deny", "Action": "execute-api:Invoke", "Resource": "arn:aws:execute-api:us-east-1:123456789012:abc123/prod/GET/users" } ] }
- 自定义Lambda授权器:
- 自己写个Lambda函数,解析用户Token里的
cognito:groups字段(或者其他属性),然后返回允许/拒绝的决策 - 这种方式更灵活,适合复杂的权限逻辑,比如结合业务规则判断
- 自己写个Lambda函数,解析用户Token里的
你遇到问题的可能原因
结合你的描述——ID Token里已经有拒绝访问的用户组,但还是能访问API,大概率是这几个坑:
只开了认证,没开授权
- 你可能只是在API Gateway里把「授权类型」设成了「Cognito用户池」,但这仅仅是完成了身份验证,没有开启权限控制。API Gateway会默认允许所有合法认证的用户访问,不管他们属于哪个组。
- 解决方法:把对应API方法的授权类型改成「IAM」,然后给拒绝访问的用户组配置好对应的拒绝IAM策略。
IAM策略的资源路径不匹配
- 你写的拒绝策略里的API资源ARN和实际的API资源ARN对不上——比如环境(prod/dev)、资源路径、HTTP方法写错了,导致策略根本没生效。
- 检查方式:去API Gateway的资源页面,找到对应方法的「资源ARN」,确保和策略里的内容完全一致。
用户同时属于多个组,拒绝策略没覆盖到目标资源
- 如果用户同时在「允许访问」和「拒绝访问」的组里,虽然IAM中拒绝策略优先级更高,但如果拒绝策略的资源范围比允许策略小,还是会出现部分资源能访问的情况。比如允许策略是访问所有
/prod/*,拒绝策略是/prod/users,那访问/prod/orders还是会被允许,但访问/prod/users应该被拒绝。如果你的情况是访问被拒绝的资源还能进,那还是先检查策略的资源路径。
- 如果用户同时在「允许访问」和「拒绝访问」的组里,虽然IAM中拒绝策略优先级更高,但如果拒绝策略的资源范围比允许策略小,还是会出现部分资源能访问的情况。比如允许策略是访问所有
Token相关的小问题
- 比如调用API时传的Token里没正确携带
cognito:groups字段?不过你说ID Token里已经返回了该组,这个可能性比较小,还是优先看前面的授权配置问题。
- 比如调用API时传的Token里没正确携带
内容的提问来源于stack exchange,提问作者Clóvis Junior
相关产品推荐
相关产品推荐

