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

无需AWS Incognito实现Appsync公共/私有访问的鉴权问题咨询

无Cognito用户池场景下Amplify @auth配置与运行逻辑指南

前置适配说明

不用Cognito用户池的前提下,@auth可以直接适配你现有两种业务场景的权限管控,核心用到apiKey(公开端)和IAM(后台Lambda)两种授权provider。

具体配置步骤

1. 先配置AppSync全局授权模式

在Amplify项目的AppSync配置中,将默认授权模式设置为API_KEY,同时额外添加IAM作为第二授权模式,无需修改现有公开端的API密钥调用逻辑。

2. Schema中配置@auth权限规则

可以按模型全局或者单字段/接口粒度配置权限,两种常用场景示例如下:

示例1:模型全局权限配置

适合模型级的权限统一管控,比如公开端仅能读数据,后台可做全量操作:

type Post 
  @model 
  @auth(rules: [
    # 公开端持有效API密钥仅可读数据
    { allow: public, provider: apiKey, operations: [read] },
    # 后台Lambda持IAM权限可做增删改查全操作
    { allow: private, provider: iam, operations: [create, read, update, delete] }
  ]) {
  id: ID!
  title: String!
  content: String!
  internalFlag: Boolean
}

示例2:单接口/字段粒度权限配置

适合需要限制特定GraphQL查询/突变访问的场景,敏感接口仅对后台Lambda开放:

type Query {
  # 公开端可调用,持有效API密钥即可访问
  listPublicPosts(filter: PostFilter): [Post] @auth(rules: [{ allow: public, provider: apiKey }])
  # 仅后台Lambda可调用
  listAllSensitivePosts: [Post] @auth(rules: [{ allow: private, provider: iam }])
}

type Mutation {
  # 仅后台Lambda可调用,公开端即使拿到API密钥也无法访问
  deletePost(postId: ID!): Post @auth(rules: [{ allow: private, provider: iam }])
}

3. 后台Lambda调用配置

给调用GraphQL接口的Lambda执行角色附加appsync:GraphQL调用权限,按需限制可调用的接口ARN即可,无需传API密钥。Node.js调用时走AWS SDK的IAM签名请求即可完成身份校验。

对应场景下的@auth运行逻辑

  • 公开端API密钥请求流程:AppSync先校验请求头中X-Api-Key的有效性(是否存在、是否在有效期内),再匹配目标接口/模型的@auth规则,如果规则包含allow: public, provider: apiKey且操作类型匹配则放行,否则直接返回401未授权。
  • 后台Lambda IAM请求流程:AppSync先校验请求的IAM签名有效性,校验签名对应的执行角色是否有该GraphQL接口的调用权限,再匹配目标接口/模型的@auth规则,如果规则包含allow: private, provider: iam且操作类型匹配则放行,否则返回401未授权。

注意事项

  • API密钥建议设置短有效期,定期轮换,避免泄露后被滥用
  • 所有写入类、敏感查询类接口不要配置apiKey的@auth规则,仅对IAM开放
  • 如果需要更细粒度的频次、参数校验,可以配合AppSync Resolver自定义逻辑或者WAF规则实现,无需依赖Cognito用户池

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 06:57:04