2017-01-13 17 views
0

私たちは、AWS V4シグネチャメカニズムを使用して、iOSアプリケーションからAPIゲートウェイエンドポイントを呼び出します。コードにアクセスキーIDと秘密鍵が埋め込まれていましたが、正常に動作していました。明らかにこれは安全な方法ではなく、AWS Cognitoを使用することをお勧めします。 Objective-C iOSコードのAWSCredentialsオブジェクトから取得した一時アクセスキーと秘密(おそらく同様にセッションキー)を使用して、APIゲートウェイエンドポイントに安全なリクエストを行うにはどうすればよいか知りたかったのです。AWS Cognitoを使用したAWS APIゲートウェイの呼び出し

アカウントアクセスキーと秘密の代わりにV4シグネチャを生成するためにCognitoから取得した一時アクセスキーと秘密を使用しようとしましたが、これは正しいアプローチのようには見えません。 APIゲートウェイメソッドは、認証設定としてAWS_IAMを使用して有効になっています。私たちが必要としないので、

AWSCognitoCredentialsProvider *credentialsProvider = [[AWSCognitoCredentialsProvider alloc] initWithRegionType:AWSRegionUSEast1 identityPoolId:@"us-east-1:xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"]; 

私たちは、非認証の役割を使用している

{ status code: 403, headers { 
    Connection = "keep-alive"; 
    "Content-Length" = 69; 
    "Content-Type" = "application/json"; 
    Date = "Fri, 13 Jan 2017 10:26:38 GMT"; 
    Via = "1.1 .....cloudfront.net (CloudFront)"; 
    "X-Amz-Cf-Id" = "..."; 
    "X-Cache" = "Error from cloudfront"; 
    "x-amzn-ErrorType" = UnrecognizedClientException; 
    "x-amzn-RequestId" = "..."; 
} } 

IdentityPoolIdが使用されているAWS Cognitoに連携アイデンティティの下に作成アイデンティティプールから:

この

は、エラーは、我々が取得することですユーザー固有の認証の任意の形式。そして、この役割は、以下のポリシーを持っています AmazonAPIGatewayInvokeFullAccess AmazonAPIGatewayPushToCloudWatchLogs CloudFrontFullAccess AmazonCognitoDeveloperAuthenticatedIdentities AmazonAPIGatewayAdministrator CloudFrontReadOnlyAccess IAMReadOnlyAccess AmazonCognitoPowerUser

私はV4署名を生成するCognitoを使用するか、完全にプロセスをバイパスすることができますどのように、ここで助けてください。

+0

資格プロバイダを使用している構成を登録しましたか? – donkon

答えて

0

それはあなたが応答としてUnrecognizedClientExceptionを取得しているように見えますが、APIゲートウェイは、UnrecognizedClientExceptionを返しません。エラーを受け取った要求IDを持っていますか?

設定を登録するのを忘れるかもしれない場合は、設定をサービスマネージャに登録する必要があります。

AWSCognitoCredentialsProvider *creds = [[AWSCognitoCredentialsProvider alloc] initWithRegionType:AWSRegionUSEast1 identityPoolId:your_cognito_pool_id]; 

AWSServiceConfiguration *configuration = [[AWSServiceConfiguration alloc] initWithRegion:AWSRegionUSEast1 credentialsProvider:creds]; 

AWSServiceManager.defaultServiceManager.defaultServiceConfiguration = configuration; 

認証されていない役割のポリシーについては、認証されていないユーザーにはあまりにも強力な権限を与えていると思います。 APIを呼び出せるようにするには、AmazonAPIGatewayInvokeFullAccess、またはメソッドレベルまでスコープを指定するだけです。 HTTPヘッダを送信

0

は、 "X-AMZ-セキュリティトークン" AWSCredentials対象から得られた変数SESSIONKEYの値の問題を解決:

[request setValue:sessionToken forHTTPHeaderField:@"X-Amz-Security-Token"]; 

AWSCredentialsオブジェクトを使用して取得される:

[[credentialsProvider credentials] continueWithBlock:^id(AWSTask<AWSCredentials *> *task) { 
     if (task.error) { 
      DDLogCError(@"failed getting credentials: %@", task.error); 
     } 
     else { 
      AWSCredentials *credentials = task.result; 
     } 
     return nil; 
    }] 

はい、ポリシーを1つだけに調整しました - AmazonAPIGatewayInvokeFullAccess。 フィードバックいただきありがとうございます。

関連する問題