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 策略进行限制,使其不那么宽松。我还建议对经过身份验证的用户使用更严格的策略。
因此,当我 运行 从 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 策略进行限制,使其不那么宽松。我还建议对经过身份验证的用户使用更严格的策略。