AWS Amplify能否同时使用Cognito与Lambda授权?
AWS Amplify多授权策略配置冲突解决及Lambda授权令牌复用方案
一、解决Lambda与Cognito所有者授权的冲突问题
Amplify API的授权策略存在优先级,默认Cognito用户池授权优先级高于Lambda授权,全局同时启用多种授权时,会优先走Cognito逻辑导致Lambda授权被跳过。解决核心是通过GraphQL Schema的细粒度配置,为不同操作指定专属授权模式,而非全局混配。
具体实现步骤:
- 对需要Cognito所有者授权的查询(queries),在Schema的字段或类型上,通过
@auth指令指定仅读操作使用所有者授权 - 对需要Lambda授权的变更(mutations),单独指定增删改操作使用自定义Lambda授权
- 避免在
amplify update api的全局配置中同时启用多种授权作为默认规则,完全依赖Schema的精准配置区分操作
示例Schema配置:
type Post @model { id: ID! title: String! content: String! owner: String! # 用于Cognito所有者匹配的字段 # 仅查询操作使用Cognito所有者授权 @auth(rules: [{ allow: owner, operations: [read], provider: userPools }]) # 增删改操作使用Lambda授权 @auth(rules: [{ allow: custom, operations: [create, update, delete], provider: lambda }]) }
配置完成后,查询操作会触发Cognito所有者校验,变更操作则会调用Lambda授权器,两者不会再冲突。
二、复用Cognito令牌实现Lambda授权与VTL解析器协同执行
可以直接将已登录Cognito用户的令牌作为Lambda授权器的自定义令牌使用,实现Lambda授权与自动生成的VTL解析器协同工作,具体做法如下:
- 前端传递令牌:
通过Amplify的Auth.currentSession()方法获取当前用户的Cognito ID令牌或访问令牌,在调用API时将其放入请求头(比如Authorization或自定义头X-Cognito-Token)。示例代码:
import { Auth, API } from 'aws-amplify'; const session = await Auth.currentSession(); const cognitoToken = session.getIdToken().getJwtToken(); // 调用API时携带令牌 const result = await API.graphql({ query: yourMutationQuery, variables: { ... }, headers: { Authorization: cognitoToken } });
Lambda授权器处理令牌:
在Lambda授权器中解析并验证该Cognito令牌的有效性(可使用AWS SDK的cognitoidentityserviceprovider客户端或第三方JWT库),同时结合业务逻辑完成授权判断。验证通过后,可将用户的username等信息放入授权上下文,传递给后续的VTL解析器。VTL解析器协同校验:
自动生成的VTL解析器可以读取Lambda授权器返回的上下文信息,结合owner字段完成所有者校验。比如在VTL中通过$context.identity.username匹配数据的owner字段,实现Lambda授权+所有者授权的双重验证。
这样既利用了Lambda授权的灵活性,又保留了Cognito所有者授权的便捷性,两者可以协同执行。
内容的提问来源于stack exchange,提问作者ldwii
相关产品推荐
相关产品推荐

