【问题标题】:aws appsync - getting 401s from ios clientaws appsync - 从 ios 客户端获取 401
【发布时间】:2018-08-06 13:30:45
【问题描述】:

因此,当我从 aws 控制台运行查询时,一切正常。但是在我的 iOS 客户端上,我只收到 401 错误。

我正在使用教程中的基本代码和 cognito auth:

    credentialsProvider = AWSCognitoCredentialsProvider(regionType: AWSRegion, identityPoolId: CognitoIdentityPoolId)

    let databaseURL = URL(fileURLWithPath:NSTemporaryDirectory()).appendingPathComponent(database_name)

    do {
        // Initialize the AWS AppSync configuration
        let appSyncConfig = try AWSAppSyncClientConfiguration(url: AppSyncEndpointURL, serviceRegion: AWSRegion, credentialsProvider: credentialsProvider!, databaseURL:databaseURL)

        // Initialize the AppSync client
        appSyncClient = try AWSAppSyncClient(appSyncConfig: appSyncConfig)

        // Set id as the cache key for objects
        appSyncClient?.apolloClient?.cacheKeyForObject = { $0["id"] }
    }
    catch {
        NSLog("Error initializing appsync client. \(error)")
    }

我尝试在 ui 中连接 cognito 登录,这似乎确实让我登录,但我仍然从 appsync 客户端收到 401 错误。

注意:使用基于 apikey 的身份验证也可以正常工作 - 但此项目需要 cognito。

任何帮助将不胜感激,我正在努力解决这个问题。

【问题讨论】:

    标签: amazon-web-services amazon-cognito aws-appsync


    【解决方案1】:

    对于允许调用 AWS AppSync API 的 Cognito 身份池,您是否有关于 IAM 角色的内联策略?它应该看起来像这样:

    {
       "Version": "2012-10-17",
       "Statement": [
          {
             "Effect": "Allow",
             "Action": [
                "appsync:GraphQL"
             ],
             "Resource": [
                "arn:aws:appsync:us-west-2:123456789012:apis/YourGraphQLApiId/*"
             ]
          }
       ]
    }
    

    您需要在 Authenticated 和/或 UnAuthenticated Cognito 角色上进行设置,具体取决于您设置池的方式。可以在此处找到有关 IAM 政策的更多详细信息:AppSync Security Guide - AWS_IAM Authorization

    补充答案

    为您的设置水平设置一些东西可能是个好主意。首先转到 AWS AppSync 控制台,对于您的 API,单击左侧的设置选项卡并选择 AWS Identity and Access Management (IAM) 作为授权类型。单击保存。然后在您的桌面上安装 awsmobile CLI:

    npm install -g awsmobile-cli
    

    接下来进入您的本地应用程序项目目录,对其进行初始化并通过user-signin 功能添加 Cognito:

    cd ./my-project
    awsmobile init                #select defaults
    awsmobile user-signin enable
    

    这将使用 AWS Mobile Hub 自动为您创建和配置新的 Cognito 用户池和 Cognito 身份池。它还将设置正确的 IAM 策略,但目前它不配置 AppSync 策略,您需要手动执行此操作。

    打开 IAM 控制台并单击左侧的角色。在搜索框中输入您使用上面的 awsmobile CLI 创建的项目的名称。其中一个角色的前缀为 _auth_MOBILEHUB,而一个角色的前缀为 _unauth_MOBILEHUB。根据您是登录还是仅在未经身份验证的状态下使用 Cognito,客户端将在运行时承担这些角色之一。选择该角色(或对两者都执行此操作)并单击添加内联策略,然后单击 JSON 选项卡。输入以下政策(仅供测试):

    {
       "Version": "2012-10-17",
       "Statement": [
          {
             "Effect": "Allow",
             "Action": [
                "appsync:GraphQL"
             ],
             "Resource": [
                "*"
             ]
          }
       ]
    }
    

    现在,如果您仍然遇到 401 错误,则说明您的服务设置中除了客户端之外还有其他问题,您可能需要向 AWS 支持开具票证。但是,如果这现在有效,那么您应该限制此 IAM 策略,使其不那么宽松。我还建议对经过身份验证的用户使用更严格的策略。

    【讨论】:

    • 我打赌就是这样。我以为那是缺失的,无法弄清楚。
    • 好的,这适用于我不使用 lambda 的调用(使用 dynamodb 解析器的调用),但对于调用 lambda 的调用,我仍然得到 401。我尝试添加权限让 cognito 用户调用 lambda,但这没有帮助(或者我做错了)
    • Cognito 用户不需要调用 Lambda 的权限,只需要调用 GraphQL API 中的字段的权限。 AWS AppSync 是有权调用具有您在数据源页面上设置(或创建)的角色的 Lambda 函数的事物。因此可能是:1) 这些字段上的解析器的 IAM 策略不正确或 2) 您为 Lambda 数据源配置的角色不正确。消除过程的快速测试是在该字段上为解析器设置 DynamoDB,如果它有效,那么它是您在该数据源上配置的角色,如果不是,那么是 GraphQL API IAM 策略。
    • 好吧,废话,现在又失败了 - 有没有地方我可以看到联系 appsync 的尝试被拒绝了?或任何登录失败?我担心 cognito 会发生某种速率限制或失败的事情。
    • 我打开了 DD 日志,它说“'identityPoolId' 处的值 'us-west-2_AOBLAH' 未能满足约束:成员必须满足正则表达式模式:...”我得到了该池 ID 值的错误值?我正在使用我的 cognito 用户池中的池 ID
    猜你喜欢
    • 2020-03-20
    • 2019-02-21
    • 2019-01-27
    • 2020-08-30
    • 2021-09-23
    • 2018-10-27
    • 1970-01-01
    • 2020-12-05
    • 2020-08-31
    相关资源
    最近更新 更多