0

因此,当我从 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。

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

4

1 回答 1

1

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

{
   "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 安全指南 - AWS_IAM 授权

附加答案

为您的设置水平设置一些东西可能是个好主意。首先转到 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 策略,使其不那么宽松。我还建议对经过身份验证的用户使用更严格的策略。

于 2018-02-27T05:10:31.193 回答