• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    公众号

ios - AWSAPIGatewayClient 总是导致未经授权

[复制链接]
菜鸟教程小白 发表于 2022-12-13 00:49:34 | 显示全部楼层 |阅读模式 打印 上一主题 下一主题

当为 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;



Best Answer-推荐答案


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

我建议您执行以下步骤:

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

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

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

  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/

回复

使用道具 举报

懒得打字嘛,点击右侧快捷回复 【右侧内容,后台自定义】
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关注0

粉丝2

帖子830918

发布主题
阅读排行 更多
广告位

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap