aws appsync - 从 ios 客户端获取 401

aws appsync - getting 401s from ios client

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

我正在使用教程中的基本代码和 Cognito 身份验证:

    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 = { [=11=]["id"] }
    }
    catch {
        NSLog("Error initializing appsync client. \(error)")
    }

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

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

任何帮助将不胜感激,我正在全力以赴。

对于允许调用您的 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/*"
         ]
      }
   ]
}

您需要根据您设置池的方式在已验证 and/or 未验证 Cognito 角色上进行设置。有关 IAM 策略的更多详细信息,请参见此处:AppSync Security Guide - AWS_IAM Authorization

补充回答

为您的设置水平设置一些东西可能是个好主意。首先转到 AWS AppSync 控制台,对于您的 API,单击左侧的设置选项卡,然后将 select 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,客户端将在运行时承担这些角色之一。 Select 该角色(或为两者执行此操作)并单击添加内联策略,然后单击 JSON 选项卡。输入以下政策(仅供测试):

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

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