2017-01-28 15 views
0

これは実例かもしれませんが、一時的なAccessKeyId/SecretAccessKeyでCognito IDを取得した理由がS3などのAWSサービスにアクセスできない理由を理解しようとしています。ノード・アプリケーションからCognito AccessKeyId/SecretAccessKeyを使用してAWSサービスにアクセスする

https://github.com/aws/amazon-cognito-identity-jsに記載されているように)、私はこのようなユーザを認証しています:

var authenticationData = { 
      Username : params.Username, 
      Password : params.Password, 
     }; 
     var authenticationDetails = new AWSCognito.AuthenticationDetails(authenticationData); 
     var poolData = { 
      UserPoolId : params.UserPoolId, 
      ClientId : params.ClientId 
     }; 
     var userPool = new AWSCognito.CognitoUserPool(poolData); 
     var userData = { 
      Username : params.Username, 
      Pool : userPool 
     }; 
     var cognitoUser = new AWSCognito.CognitoUser(userData); 

     cognitoUser.authenticateUser(authenticationDetails, { 
      onSuccess: function (result) {  
       cognitoUserPoolLoginProvider = 'cognito-idp.' + params.AWSRegion + '.amazonaws.com/' + params.UserPoolId; 
       var logins = {}; 
       logins[cognitoUserPoolLoginProvider] = result.getIdToken().getJwtToken(); 

       AWS.config.credentials = new AWS.CognitoIdentityCredentials({ 
        IdentityPoolId : params.IdentityPoolId, 
        Logins : logins 
       }); 

       AWS.config.update({region: params.AWSRegion}); 

       AWS.config.credentials.get(function(err) { 
        if (err) { 
         callback(err, null); 
         console.log(AWS.config.credentials); 
        } else { 
         var creds = { 
          AccessKeyId: AWS.config.credentials.accessKeyId, 
          SecretAccessKey: AWS.config.credentials.secretAccessKey, 
          SessionToken: AWS.config.credentials.sessionToken, 
         } 

         callback(null, creds); 
        } 
       }); 
      }, 

      onFailure: function(err) { 
       callback(err, null); 
      }, 

     }); 

私のアイデンティティプールのユーザの有効なユーザ名/パスワードを提供する場合、私は与えられています:

  • accessKeyId
  • secretAccessKey
  • はsessionToken

これまでのところとても良いです。

accessKeyIdsecretAccessKeyは、そのユーザーのサービスにアクセスするために使用できる一時的な(時間制限のある)AWS資格情報であると想定しました。私はAWSのサービスにアクセスするために私のAWS CLI(aws configure)を設定するとき

はしかし、私は次のエラーを取得しています:

{ [InvalidAccessKeyId: The AWS Access Key Id you provided does not exist in our records.] 
    message: 'The AWS Access Key Id you provided does not exist in our records.', 
    code: 'InvalidAccessKeyId', 
    region: null, 
    time: Sat Jan 28 2017 11:52:10 GMT+0100 (CET), 
    requestId: '68BB8C46F7BC195D', 
    extendedRequestId: '4Z6d+MCRIiZ1CtApQfphbkWPBCO/jpI0DXqyfK5/5yKaYqwDj/OAhCgy6UJdACyuIs5UxqLPfZk=', 
    cfId: undefined, 
    statusCode: 403, 
    retryable: false, 
    retryDelay: 90.96230010036379 } 

このAWSアクセスキーは有効なキーとはみなされていないのはなぜ?

答えて

0

SessionTokenもサービスに渡す必要があります。伴わない限り、完全にサービスAPIによって認識されていない -

一時資格(私はどこかで読んSは、「セッション」を意味タール信じてKは、「キー」とは、通常、AccessKeyIdではなく、身近なAKIAよりASIAから始まります)各要求では、セッショントークンによって処理されます。

だから、なぜエラーメッセージはそれを言っていないのですか?

投機:一時的な資格証明書が導入されたとき

、彼らはAccessKeyId上のパターンマッチ(/^ASIA//^AKIA/)として実装されていなかったが、代わりに認証/認可を迂回させる「フック」のいくつかの種類として実装されましたサービスAPIエンドポイントでは、リクエスト処理の非常に早い段階で代替コードパスを使用しますが、これはリクエストにセッショントークンが存在する場合にのみ発生します。 (ワイヤではx-amz-security-tokenとして送信されます)

そうでない場合、要求は標準コードパスに渡り、資格情報は通常の資格情報であるかのように検証されます。エラーメッセージが表示されます標準の資格情報を検証するコードパスから取得します。そのシステムでは、アクセスキーIDは実際には存在しません。

関連する問題