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

如何在使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.12 05:01:27