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:@"UserPool"];
</code></pre>
<p><strong> ViewController </strong></p>
<pre><code>[[ suggestionsGet] continueWithBlock:^id _Nullable(AWSTask * _Nonnull task) {
NSLog(@"%@", 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 "(null)" 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:@"YOUR_CLIENT_ID"
clientSecret:@"YOUR_CLIENT_SECRET"
poolId:@"YOUR_USER_POOL_ID"];
[AWSCognitoIdentityUserPool registerCognitoIdentityUserPoolWithConfiguration:serviceConfiguration
userPoolConfiguration:userPoolConfiguration forKey:@"UserPool"];
AWSCognitoIdentityUserPool *pool = ;
AWSCognitoCredentialsProvider *credentialsProvider = [
initWithRegionType:AWSRegionUSEast1
identityPoolId:@"YOUR_IDENTITY_POOL_ID"
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]