Amazon web services aws appsync-从ios客户端获取401s

Amazon web services aws appsync-从ios客户端获取401s,amazon-web-services,amazon-cognito,aws-appsync,Amazon Web Services,Amazon Cognito,Aws Appsync,因此,当我从aws控制台运行查询时,情况非常好。然而,在我的iOS客户端上,我只收到401个错误 我正在使用教程和cognito auth中的基本代码: credentialsProvider = AWSCognitoCredentialsProvider(regionType: AWSRegion, identityPoolId: CognitoIdentityPoolId) let databaseURL = URL(fileURLWithPath:NSTemporaryD

因此,当我从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)")
    }
我尝试连接cognito登录ui,它似乎确实让我登录,但我仍然从appsync客户端收到401个错误

注意:使用基于apikeybased的auth也可以很好地工作——但是这个项目需要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/*"
         ]
      }
   ]
}
您需要根据您设置池的方式,在经过身份验证和/或未经身份验证的Cognito角色上设置此选项。有关IAM政策的更多详细信息,请参见:

附加答案

为您的设置水平设置某些内容可能是一个好主意。首先转到AWS AppSync控制台,对于您的API,单击左侧的设置选项卡,并选择AWS身份和访问管理(IAM)作为授权类型。单击保存。然后在桌面上安装awsmobile CLI:

npm install -g awsmobile-cli
接下来进入本地应用程序项目目录,对其进行初始化,并通过
用户登录
功能添加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选项卡。输入以下策略(仅用于测试):


现在,如果您仍然收到401错误,那么除了客户端之外,您的服务设置中还有其他正在进行的操作,您可能希望使用AWS支持打开一个记录单。但是,如果这现在起作用,那么您应该对此IAM策略进行限制,以使其不那么允许。我还建议对经过身份验证的用户使用更严格的策略

我打赌就是这样。我认为它丢失了,无法找到它。好吧,这适用于我不使用lambda的调用(使用dynamodb解析器的调用),但是对于调用lambda的调用,我仍然得到了401。我尝试为cognito用户添加调用lambda的权限,但这没有帮助(或者我做得不对),cognito用户不需要调用lambda的权限,只需要调用GraphQLAPI中的字段的权限。AWS AppSync是一种有权使用您在数据源页面上设置(或创建)的角色调用Lambda函数的工具。因此可能是:1)这些字段上的解析程序的IAM策略不正确,或者2)为Lambda数据源配置的角色不正确。消除过程的快速测试是在该字段上为解析器设置DynamoDB,如果有效,则是您在该数据源上配置的角色,如果无效,则是GraphQL API IAM策略。废话,现在又失败了-是否有地方可以看到联系appsync的尝试被拒绝?或任何登录失败?我担心cognito会出现某种速率限制或失败的情况。我打开DD日志,它说“identityPoolId”处的值“us-west-2_AOBLAH”无法满足约束:成员必须满足正则表达式模式:…“我是否为池ID值获取了错误的值?”?我正在使用cognito用户池中的池id
{
   "Version": "2012-10-17",
   "Statement": [
      {
         "Effect": "Allow",
         "Action": [
            "appsync:GraphQL"
         ],
         "Resource": [
            "*"
         ]
      }
   ]
}