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

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解析器协同工作,具体做法如下:

  1. 前端传递令牌:
    通过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
  }
});
  1. Lambda授权器处理令牌:
    在Lambda授权器中解析并验证该Cognito令牌的有效性(可使用AWS SDK的cognitoidentityserviceprovider客户端或第三方JWT库),同时结合业务逻辑完成授权判断。验证通过后,可将用户的username等信息放入授权上下文,传递给后续的VTL解析器。

  2. VTL解析器协同校验:
    自动生成的VTL解析器可以读取Lambda授权器返回的上下文信息,结合owner字段完成所有者校验。比如在VTL中通过$context.identity.username匹配数据的owner字段,实现Lambda授权+所有者授权的双重验证。

这样既利用了Lambda授权的灵活性,又保留了Cognito所有者授权的便捷性,两者可以协同执行。

内容的提问来源于stack exchange,提问作者ldwii

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.10 11:35:36