【问题标题】:How do I make an AWS AppSync GraphQL API publicly accessible while using Amazon Cognito for authentication?在使用 Amazon Cognito 进行身份验证时,如何使 AWS AppSync GraphQL API 可公开访问?
【发布时间】:2019-08-30 19:33:39
【问题描述】:

目前我在 AWS Amplify 项目中使用 Amazon Cognito 进行身份验证,因此只有登录用户才能访问该 API。 但我想让一些 api 调用公开访问。

我该怎么做?

【问题讨论】:

    标签: amazon-web-services amazon-iam aws-amplify aws-appsync


    【解决方案1】:

    对于 AppSync API - API 密钥被视为“未经身份验证”

    请参阅以下文档: https://docs.aws.amazon.com/appsync/latest/devguide/security.html#api-key-authorization

    【讨论】:

    • 但我没有通过 API 密钥进行授权,更何况是在我的问题中描述的 Cognito 用户池
    • 如果您将 Cognito 用户池作为 API 的身份验证配置,那么您必须在每个请求的 Authorization 标头中提供 Cognito JWT 令牌。架构上的 aws_auth 指令用于强制执行更细粒度的授权(即 Cognito 组),但每个请求都需要 Cognito 令牌。如果您尝试指定某些查询在没有 Cognito 令牌的情况下可公开访问,同时让其他查询需要 Cognito 令牌,那么您正在定义一个“混合身份验证”用例。请继续关注 AppSync 博客文章,了解有关混合身份验证支持的更新。
    【解决方案2】:

    我刚刚解决了这个完全相同的问题。这就是我所做的:

    1. 通过运行 amplify update auth 更新您的 API 并选择 IAM 作为您的用户处理程序(其他一切都使用默认值)

    2. 登录到您的 AWS 控制台 -> Appsync 并修改对 IAM(而不是 Cognito 池)的访问权限

    3. 转到 IAM 控制台并为 AUTH 和 UNAUTH 用户创建 IAM 策略(通过键入您的 Appsync 应用程序的名称在列表中搜索它们)

    找到 AUTH 用户并附上以下政策(使用您的信息更新):

    授权用户

    {
        "Version": "2012-10-17",
        "Statement": [
            {
                "Effect": "Allow",
                "Action": "appsync:GraphQL",
                "Resource": [
                    "arn:aws:appsync:<AWS region>:<AWS account ID>:apis/<app sync endpoint ID>/*"
                ]
            }
        ]
    }
    

    找到 unauth 用户并附上以下政策:

    {
        "Version": "2012-10-17",
        "Statement": [
            {
                "Effect": "Allow",
                "Action": "appsync:GraphQL",
                "Resource": [
                    "arn:aws:appsync:<AWS region>:<AWS account ID>:apis/<app sync endpoint ID>/types/Query/fields/<your Query name>",
            "arn:aws:appsync:<AWS region>:<AWS account ID>:apis/<app sync endpoint ID>/types/Query/fields/<your Query name>",
            "arn:aws:appsync:<AWS region>:<AWS account ID>:apis/<app sync endpoint ID>/types/Query/fields/<your Query name>"
    
                ]
            }
        ]
    }
    
    1. 现在没有记录的东西(人们从 Cognito Pools 过渡到 IAM )您需要导入 {AUTH_TYPE}

    import AWSAppSyncClient, {AUTH_TYPE} from "aws-appsync";

    并使用它在 AppSync 初始化中加载凭据

    const client = new AWSAppSyncClient(
      {
        disableOffline: true,
        url: aws_config.aws_appsync_graphqlEndpoint,
        region: aws_config.aws_cognito_region,
        auth: {
          // IAM
          type: AUTH_TYPE.AWS_IAM,
          credentials: () => Auth.currentCredentials(),
        });
    

    希望这会有所帮助。

    【讨论】:

      猜你喜欢
      • 2020-09-30
      • 2019-12-31
      • 2018-03-14
      • 2019-06-29
      • 2020-08-15
      • 2021-12-08
      • 2021-04-28
      • 2019-06-19
      • 2019-10-04
      相关资源
      最近更新 更多