为何Amazon Cognito Authorizer仅作认证器,获取角色后仍无法授权?
疑问1:为何Amazon Cognito Authorizer仅能充当认证器,无法实现授权器的功能?
其实这得从Cognito Authorizer的核心设计定位说起——它从诞生起就被设定为一个身份验证组件,而非授权组件。咱们拿API Gateway里的Cognito Authorizer举例子:它的核心工作就是验证传入的JWT令牌(比如id_token或access_token)是否合法:检查签名是否有效、令牌是否过期、受众(aud)是否匹配你的Cognito用户池,以及令牌是否被篡改等等。
一旦验证通过,它只会告诉API Gateway“这个用户是合法的身份”,但不会去判断“这个用户能不能访问当前API资源”。授权(也就是决定用户能做什么)的工作,要么交给API Gateway的IAM资源策略,要么交给Lambda授权器,或者由你的后端服务自己来处理。Cognito Authorizer的职责边界很清晰:只负责“确认你是谁”,不负责“允许你做什么”。
疑问2:为何Amazon Cognito Authorizer即便能从认证令牌中获取角色,且该角色已配置允许和拒绝策略,仍仅作为认证器而非授权器?
这里有个关键的误解点:令牌里携带的Cognito角色(比如cognito:roles或cognito:preferred_role这些claims),和API Gateway的授权逻辑是脱节的。
首先,Cognito Authorizer不会自动读取令牌里的角色,也不会基于这个角色的IAM策略来生成API访问的授权决策。它只是把这些角色信息作为用户claims的一部分,传递给后续的环节(比如后端Lambda或者API Gateway),但不会主动应用这些策略。
其次,Cognito里配置的角色,本质上是给用户访问AWS服务(比如S3、DynamoDB)用的,而不是直接用来控制API Gateway的访问权限。如果想要基于令牌里的角色来控制API访问,你需要额外做这些操作:
- 用Lambda授权器替代(或配合)Cognito Authorizer:在Lambda里解析JWT令牌,取出角色信息,然后根据角色对应的IAM策略生成允许/拒绝的授权响应,返回给API Gateway。
- 或者在API Gateway的资源策略里,基于用户的角色ARN来设置访问规则,但这需要你手动关联角色和API资源。
简单说:Cognito令牌里的角色只是身份信息的一部分,Cognito Authorizer不会帮你把这些角色的权限映射到API访问上——授权的逻辑需要你额外搭建。
内容的提问来源于stack exchange,提问作者Naresh Sharma

