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

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字段(或者其他属性),然后返回允许/拒绝的决策
    • 这种方式更灵活,适合复杂的权限逻辑,比如结合业务规则判断
你遇到问题的可能原因

结合你的描述——ID Token里已经有拒绝访问的用户组,但还是能访问API,大概率是这几个坑:

  1. 只开了认证,没开授权

    • 你可能只是在API Gateway里把「授权类型」设成了「Cognito用户池」,但这仅仅是完成了身份验证,没有开启权限控制。API Gateway会默认允许所有合法认证的用户访问,不管他们属于哪个组。
    • 解决方法:把对应API方法的授权类型改成「IAM」,然后给拒绝访问的用户组配置好对应的拒绝IAM策略。
  2. IAM策略的资源路径不匹配

    • 你写的拒绝策略里的API资源ARN和实际的API资源ARN对不上——比如环境(prod/dev)、资源路径、HTTP方法写错了,导致策略根本没生效。
    • 检查方式:去API Gateway的资源页面,找到对应方法的「资源ARN」,确保和策略里的内容完全一致。
  3. 用户同时属于多个组,拒绝策略没覆盖到目标资源

    • 如果用户同时在「允许访问」和「拒绝访问」的组里,虽然IAM中拒绝策略优先级更高,但如果拒绝策略的资源范围比允许策略小,还是会出现部分资源能访问的情况。比如允许策略是访问所有/prod/*,拒绝策略是/prod/users,那访问/prod/orders还是会被允许,但访问/prod/users应该被拒绝。如果你的情况是访问被拒绝的资源还能进,那还是先检查策略的资源路径。
  4. Token相关的小问题

    • 比如调用API时传的Token里没正确携带cognito:groups字段?不过你说ID Token里已经返回了该组,这个可能性比较小,还是优先看前面的授权配置问题。

内容的提问来源于stack exchange,提问作者Clóvis Junior

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 07:09:47