gpt4 book ai didi

ios - AWSAPIGatewayClient 总是导致未经授权

转载 作者:塔克拉玛干 更新时间:2023-11-02 10:24:56 24 4
gpt4 key购买 nike

当使用亚马逊为 AWSAPIGatewayClient 生成的代码时,我总是得到

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;

最佳答案

响应看起来您的 API 网关资源配置为使用 Cognito 用户池进行授权,但您的代码实际上使用 Cognito 联合身份。反过来,联合身份需要 API 网关使用 AWS_IAM 授权方,使用 IAM 角色来管理对您的资源的访问。

我建议您完成以下步骤:

  1. 关注this guide .基本上,在 Cognito Federated Identities 中,配置一个身份池以将您的用户池用作其身份验证提供程序(之一)。 (你可能已经这样做了)

  2. 在方法请求/设置/授权下检查您的 API 网关资源的授权。将其设置为 AWS_IAM。不要忘记重新部署新配置的 API,并导出新的 SDK。

  3. 您的身份池将需要两个 IAM 角色,用于未经身份验证和经过身份验证的 AWS 服务访问。您必须向您的角色添加策略以指定对您的 AWS 服务的访问权限,在这种情况下,您将需要授予 "execute-api:Invoke" 访问权限(可能只是)您的经过身份验证的角色。为此,我建议使用策略生成器,并确保将策略的 ARN 设置为仅适用于您要授予访问权限的资源,否则您的所有 API 网关资源都可能被访问。

  4. 至于 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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com