当为 AWSAPIGatewayClient 使用亚马逊生成的代码时,我总是得到 p>
message = Unauthorized;
作为回应。
这可能是什么原因?
AppDelegate
AWSCognitoIdentityUserPool *pool = [AWSCognitoIdentityUserPool CognitoIdentityUserPoolForKey"UserPool"];
AWSCognitoCredentialsProvider *credentialsProvider = [[AWSCognitoCredentialsProvider alloc] initWithRegionType:AWSRegionUSEast1
identityPoolId:CognitoPoolId
identityProviderManager:pool];
AWSServiceConfiguration *serviceConfiguration = [[AWSServiceConfiguration alloc] initWithRegion:CognitoIdentityUserPoolRegion
credentialsProvider:credentialsProvider];
AWSServiceManager.defaultServiceManager.defaultServiceConfiguration = serviceConfiguration;
AWSCognitoIdentityUserPoolConfiguration *configuration = [[AWSCognitoIdentityUserPoolConfiguration alloc] initWithClientId:CognitoIdentityUserPoolAppClientId
clientSecret:CognitoIdentityUserPoolAppClientSecret
poolId:CognitoIdentityUserPoolId];
[AWSCognitoIdentityUserPool registerCognitoIdentityUserPoolWithConfiguration:serviceConfiguration
userPoolConfiguration:configuration
forKey"UserPool"];
View Controller
[[[AWSPrjctRtClient defaultClient] suggestionsGet] continueWithBlock:^id _Nullable(AWSTask * _Nonnull task) {
NSLog(@"%@", task.error);
return nil;
}];
结果
2017-04-07 16:02:24.386 xxxx[38051:1025018] Error Domain=com.amazonaws.AWSAPIGatewayErrorDomain Code=1 "(null)" UserInfo={HTTPBody={
message = Unauthorized;
Best Answer-推荐答案 strong>
响应看起来像您的 API Gateway 资源配置为使用 Cognito 用户池进行授权,但您的代码实际上使用 Cognito 联合身份。反过来,Federated Identities 要求 API Gateway 使用 AWS_IAM 授权方,使用 IAM 角色来管理对您的资源的访问。
我建议您执行以下步骤:
关注 this guide .基本上,在 Cognito 联合身份中,配置一个身份池以将您的用户池用作其身份验证提供程序(之一)。 (您可能已经这样做了)
在方法请求/设置/授权下检查您的 API 网关资源的授权。将其设置为 AWS_IAM。不要忘记重新部署新配置的 API,并导出新的 SDK。
您的身份池将需要两个 IAM 角色,用于未经身份验证和经过身份验证的 AWS 服务访问。您必须向您的角色添加一个策略以指定对您的 AWS 服务的访问权限,在这种情况下,您需要授予 "execute-api:Invoke" 访问权限(可能只是)您的认证的角色。我建议为此使用策略生成器,并确保将策略的 ARN 设置为仅适用于您要授予访问权限的资源,否则您的所有 API Gateway 资源都可能被访问。
至于 iOS SDK 端的配置,请确保您使用指南中的代码(如下所示),您的似乎略有不同。我发现弄错这个错误会导致一系列令人困惑的错误,可能会让您从各种错误的方向寻找解决方案。
添加到 AppDelegate
AWSServiceConfiguration *serviceConfiguration = [[AWSServiceConfiguration alloc] initWithRegion:AWSRegionUSEast1
credentialsProvider:nil];
AWSCognitoIdentityUserPoolConfiguration *userPoolConfiguration = [[AWSCognitoIdentityUserPoolConfiguration alloc] initWithClientId"YOUR_CLIENT_ID"
clientSecret"YOUR_CLIENT_SECRET"
poolId"YOUR_USER_POOL_ID"];
[AWSCognitoIdentityUserPool registerCognitoIdentityUserPoolWithConfiguration:serviceConfiguration
userPoolConfiguration:userPoolConfiguration forKey"UserPool"];
AWSCognitoIdentityUserPool *pool = [AWSCognitoIdentityUserPool CognitoIdentityUserPoolForKey"UserPool"];
AWSCognitoCredentialsProvider *credentialsProvider = [[AWSCognitoCredentialsProvider alloc]
initWithRegionType:AWSRegionUSEast1
identityPoolId"YOUR_IDENTITY_POOL_ID"
identityProviderManager:pool];
还有一个重要的补充!一开始我发现这特别令人困惑,但在上面的代码中,您初始化了一个 AWSServiceConfiguration 并将 credentialsProvider 设置为 nil 以便注册您的AWSCognitoIdentityUserPool 。但是,您需要初始化一个新的 AWSServiceConfiguration ,它引用您的 credentialsProvider 以分配给您的 AWSServiceManager.defaultServiceManager.defaultServiceConfiguration 。像这样:
AWSServiceManager.defaultServiceManager.defaultServiceConfiguration = [[AWSServiceConfiguration alloc] initWithRegion:CognitoUserPoolRegion
credentialsProvider:credentialsProvider];
上述步骤最终使我成功地将 Cognito 用户池与联合身份集成,以允许访问 API 网关资源。这个过程涉及到一些关于服务具体做什么的混淆,以及将来自不同指南的代码片段拼凑在一起。我希望这会有所帮助!
请注意,您也可以不使用联合身份,让您的 API 直接使用用户池进行授权。但我在这种方法上并没有成功。此外,如果您愿意,联合身份将允许您在稍后阶段添加其他授权人。
关于ios - AWSAPIGatewayClient 总是导致未经授权,我们在Stack Overflow上找到一个类似的问题:
https://stackoverflow.com/questions/43282163/
|