无需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
相关产品推荐
相关产品推荐

