菜鸟教程小白 发表于 2022-12-13 00:49:34

ios - AWSAPIGatewayClient 总是导致未经授权


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

<blockquote>
<p>message = Unauthorized; </p>
</blockquote>

<p>作为回应。</p>

<p>这可能是什么原因?</p>

<p><strong>AppDelegate</strong></p>

<pre><code>AWSCognitoIdentityUserPool *pool = ;
AWSCognitoCredentialsProvider *credentialsProvider = [ initWithRegionType:AWSRegionUSEast1
                                                                                                identityPoolId:CognitoPoolId
                                                                                       identityProviderManager:pool];

AWSServiceConfiguration *serviceConfiguration = [ initWithRegion:CognitoIdentityUserPoolRegion
                                                                            credentialsProvider:credentialsProvider];
AWSServiceManager.defaultServiceManager.defaultServiceConfiguration = serviceConfiguration;

AWSCognitoIdentityUserPoolConfiguration *configuration = [ initWithClientId:CognitoIdentityUserPoolAppClientId
                                                                                                            clientSecret:CognitoIdentityUserPoolAppClientSecret
                                                                                                                  poolId:CognitoIdentityUserPoolId];
[AWSCognitoIdentityUserPool registerCognitoIdentityUserPoolWithConfiguration:serviceConfiguration
                                                       userPoolConfiguration:configuration
                                                                      forKey:@&#34;UserPool&#34;];
</code></pre>

<p><strong> ViewController </strong></p>

<pre><code>[[ suggestionsGet] continueWithBlock:^id _Nullable(AWSTask * _Nonnull task) {

      NSLog(@&#34;%@&#34;, task.error);
      return nil;
}];
</code></pre>

<p><strong>结果</strong></p>

<pre><code>2017-04-07 16:02:24.386 xxxx Error Domain=com.amazonaws.AWSAPIGatewayErrorDomain Code=1 &#34;(null)&#34; UserInfo={HTTPBody={
message = Unauthorized;
</code></pre></p>
                                    <br><hr><h1><strong>Best Answer-推荐答案</ strong></h1><br>
                                            <p><p>响应看起来像您的 API Gateway 资源配置为使用 Cognito 用户池进行授权,但您的代码实际上使用 Cognito 联合身份。反过来,Federated Identities 要求 API Gateway 使用 AWS_IAM 授权方,使用 IAM 角色来管理对您的资源的访问。</p>

<p>我建议您执行以下步骤:</p>

<ol>
<li><p>关注 <a href="http://docs.aws.amazon.com/cognito/latest/developerguide/amazon-cognito-integrating-user-pools-with-identity-pools.html" rel="noreferrer noopener nofollow">this guide</a> .基本上,在 Cognito 联合身份中,配置一个身份池以将您的用户池用作其身份验证提供程序(之一)。 (您可能已经这样做了)</p></li>
<li><p>在方法请求/设置/授权下检查您的 API 网关资源的授权。将其设置为 AWS_IAM。不要忘记重新部署新配置的 API,并导出新的 SDK。</p></li>
<li><p>您的身份池将需要两个 IAM 角色,用于未经身份验证和经过身份验证的 AWS 服务访问。您必须向您的角色添加一个策略以指定对您的 AWS 服务的访问权限,在这种情况下,您需要授予 <code>"execute-api:Invoke"</code> 访问权限(可能只是)您的认证的角色。我建议为此使用策略生成器,并确保将策略的 ARN 设置为仅适用于您要授予访问权限的资源,否则您的所有 API Gateway 资源都可能被访问。</p ></li>
<li><p>至于 iOS SDK 端的配置,请确保您使用指南中的代码(如下所示),您的似乎略有不同。我发现弄错这个错误会导致一系列令人困惑的错误,可能会让您从各种错误的方向寻找解决方案。</p></li>
</ol>

<p><strong>添加到 AppDelegate</strong></p>

<pre><code>AWSServiceConfiguration *serviceConfiguration = [ initWithRegion:AWSRegionUSEast1
                                                                            credentialsProvider:nil];
AWSCognitoIdentityUserPoolConfiguration *userPoolConfiguration = [ initWithClientId:@&#34;YOUR_CLIENT_ID&#34;
                                                                                                                      clientSecret:@&#34;YOUR_CLIENT_SECRET&#34;
                                                                                                                            poolId:@&#34;YOUR_USER_POOL_ID&#34;];
[AWSCognitoIdentityUserPool registerCognitoIdentityUserPoolWithConfiguration:serviceConfiguration
                                                       userPoolConfiguration:userPoolConfiguration forKey:@&#34;UserPool&#34;];
AWSCognitoIdentityUserPool *pool = ;
AWSCognitoCredentialsProvider *credentialsProvider = [
                                                      initWithRegionType:AWSRegionUSEast1
                                                      identityPoolId:@&#34;YOUR_IDENTITY_POOL_ID&#34;
                                                      identityProviderManager:pool];
</code></pre>

<p>还有一个重要的补充!一开始我发现这特别令人困惑,但在上面的代码中,您初始化了一个 <code>AWSServiceConfiguration</code> 并将 <code>credentialsProvider</code> 设置为 <code>nil</code> 以便注册您的<code>AWSCognitoIdentityUserPool</code>。但是,您需要初始化一个新的 <code>AWSServiceConfiguration</code>,它引用您的 credentialsProvider 以分配给您的 <code>AWSServiceManager.defaultServiceManager.defaultServiceConfiguration</code>。像这样:</p>

<pre><code>AWSServiceManager.defaultServiceManager.defaultServiceConfiguration = [ initWithRegion:CognitoUserPoolRegion
                                                                                                credentialsProvider:credentialsProvider];
</code></pre>

<p>上述步骤最终使我成功地将 Cognito 用户池与联合身份集成,以允许访问 API 网关资源。这个过程涉及到一些关于服务具体做什么的混淆,以及将来自不同指南的代码片段拼凑在一起。我希望这会有所帮助!</p>

<p>请注意,您也可以不使用联合身份,让您的 API 直接使用用户池进行授权。但我在这种方法上并没有成功。此外,如果您愿意,联合身份将允许您在稍后阶段添加其他授权人。 </p></p>
                                   
                                                <p style="font-size: 20px;">关于ios - AWSAPIGatewayClient 总是导致未经授权,我们在Stack Overflow上找到一个类似的问题:
                                                        <a href="https://stackoverflow.com/questions/43282163/" rel="noreferrer noopener nofollow" style="color: red;">
                                                                https://stackoverflow.com/questions/43282163/
                                                        </a>
                                                </p>
                                       
页: [1]
查看完整版本: ios - AWSAPIGatewayClient 总是导致未经授权