如何在使用Amazon Cognito认证时实现AWS AppSync GraphQL API部分公开访问
嘿,我来帮你梳理这两个场景的具体操作步骤,都是实际用过的靠谱方案~
一、让Amplify + Cognito认证的API开放部分接口访问
你当前的API默认绑定了Cognito认证,只有登录用户能调用。要开放部分接口,得从API Gateway资源策略和客户端调用逻辑两个地方入手:
修改API Gateway资源策略
登录AWS控制台找到你的API Gateway实例,进入「资源」页面,选中要开放的接口路径(比如/public/announcements),切换到「资源策略」标签,添加一条允许匿名访问的规则。示例策略如下(记得替换占位符为你的实际信息):{ "Version": "2012-10-17", "Statement": [ // 保留原有Cognito认证的规则,确保已登录用户仍能访问所有接口 { "Effect": "Allow", "Principal": { "Federated": "cognito-identity.amazonaws.com" }, "Action": "execute-api:Invoke", "Resource": "arn:aws:execute-api:你的区域:你的账号ID:你的API ID/*/*/*", "Condition": { "StringEquals": { "cognito-identity.amazonaws.com:aud": "你的Cognito身份池ID" }, "ForAnyValue:StringLike": { "cognito-identity.amazonaws.com:amr": "authenticated" } } }, // 新增公开访问规则,仅针对指定路径 { "Effect": "Allow", "Principal": "*", "Action": "execute-api:Invoke", "Resource": "arn:aws:execute-api:你的区域:你的账号ID:你的API ID/*/GET/public/announcements" } ] }保存后记得点击「部署API」,选择对应的阶段生效。
客户端调用调整
之前用Amplify的API模块调用时默认会带Cognito令牌,调用公开接口时要跳过认证:import { API } from 'aws-amplify'; const fetchPublicAnnouncements = async () => { try { const response = await API.get('你的API名称', '/public/announcements', { authMode: 'NONE' // 关键:跳过认证逻辑 }); console.log(response); } catch (error) { console.error(error); } };
二、AWS AppSync GraphQL API 实现公开访问
分两种常见需求,按需选择:
情况1:完全公开整个API
适合所有操作都不需要认证的场景:
- 登录AWS AppSync控制台,进入你的API,点击「设置」标签,在「认证模式」里添加「无(NONE)」或「API密钥」:
- 选「无(NONE)」:任何人可直接调用,无任何限制;
- 选「API密钥」:用户需携带API密钥才能调用,比完全公开更安全,可生成密钥分发给客户端。
- 客户端配置对应认证模式:
import { Amplify } from 'aws-amplify'; Amplify.configure({ aws_appsync_graphqlEndpoint: '你的AppSync端点', aws_appsync_region: '你的区域', aws_appsync_authenticationType: 'NONE', // 或 'API_KEY' aws_appsync_apiKey: '你的API密钥' // 选API_KEY时必填 });
情况2:仅开放部分GraphQL操作(更推荐)
大部分操作仍需Cognito认证,仅特定查询/突变公开,用AppSync的@auth指令即可实现:
- 打开Amplify项目里的GraphQL schema文件(路径:
amplify/backend/api/你的API名称/schema.graphql),给需要公开的操作添加规则:type Post @model { id: ID! title: String! content: String! author: String! } type Query { # 公开获取单个帖子 getPublicPost(id: ID!): Post @auth(rules: [{ allow: public }]) # 公开获取帖子列表 listPublicPosts: [Post] @auth(rules: [{ allow: public }]) # 仅登录用户能查看自己的帖子 getMyPosts: [Post] @auth(rules: [{ allow: owner }]) } - 执行
amplify push更新AppSync配置,系统会自动生成对应的 resolver 权限。 - 客户端调用公开查询时,同样跳过认证:
import { API, graphqlOperation } from 'aws-amplify'; import { getPublicPost } from './graphql/queries'; const fetchPublicPost = async (postId) => { try { const response = await API.graphql({ query: getPublicPost, variables: { id: postId }, authMode: 'NONE' }); console.log(response.data.getPublicPost); } catch (error) { console.error(error); } };
内容的提问来源于stack exchange,提问作者simplikios
相关产品推荐
相关产品推荐

