2016-05-27 17 views
3

IAMとして許可されたAPIゲートウェイエンドポイントをセットアップしました。AWS Cognito生成された資格情報がAPIゲートウェイで受け付けられない

まず、自分のユーザーの資格情報(キー、シークレット)を使用してリソースにアクセスしようとしました。

次に、Cognitoにアイデンティティプールを設定しました。プールでは、認証されたアクセスと認証されていないアクセスの両方が可能です。 私はPHP SDKを使用して認証情報を生成しています

$id = $cognitoClient->getId([ 
     'AccountId' => 'xxx', 
     'IdentityPoolId' => 'xxx', 
    ]); 
$credentials = $cognitoClient->getCredentialsForIdentity([ 
    'IdentityId' => $id->get('IdentityId') 
])->get('Credentials'); 

これは、認証情報を生成することができる - AccessKeyIdSecretKeySessionTokenが返されています。

私が認証されていないアクセスを添付しました役割は、このように定義されています

信頼関係:

{ 
    "Version": "2012-10-17", 
    "Statement": [ 
    { 
     "Effect": "Allow", 
     "Principal": { 
     "Federated": "cognito-identity.amazonaws.com" 
     }, 
     "Action": "sts:AssumeRoleWithWebIdentity", 
     "Condition": { 
     "StringEquals": { 
      "cognito-identity.amazonaws.com:aud": "xxx" 
     } 
     } 
    } 
    ] 
} 

インラインポリシー:

{ 
    "Version": "2012-10-17", 
    "Statement": [ 
    { 
     "Effect": "Allow", 
     "Action": "cognito-sync:*", 
     "Resource": [ 
      "arn:aws:cognito-sync:us-east-1:123456789012:identitypool/${cognito-identity.amazonaws.com:aud}/identity/${cognito-identity.amazonaws.com:sub}/*" 
     ] 
    } 
    ] 
} 

{ 
    "Version": "2012-10-17", 
    "Statement": [ 
    { 
     "Effect": "Allow", 
     "Action": "cognito-sync:*", 
     "Resource": [ 
      "arn:aws:cognito-sync:us-east-1:xxxxx:identitypool/*" 
     ] 
    } 
    ] 
} 

{ 
    "Version": "2012-10-17", 
    "Statement": [ 
    { 
     "Effect": "Allow", 
     "Action": [ 
      "apigateway:*" 
     ], 
     "Resource": [ 
      "*" 
     ] 
    } 
    ] 
} 

私は任意の管理ポリシーを添付していません役割を持って

PHP SDKを使用してクレデンシャルを生成した後、私はリソースにアクセスするためにpostmanを使用します(私はアカウントクレジットを使っている間も郵便配達員を使いました)。この呼び出しは次のエラーを与える:

{"message":"The security token included in the request is invalid."}

私はここで間違って起こっているかを判断することができません。

答えて

3

今のところ、展開ごとに生成できるJavascript SDKを使用するように切り替えました。

SDKを使用して問題を解決しています。私が観察したことの1つは、私が渡していなかったSDKのセッショントークンを渡す必要があることです(私はそれをどこに置くべきかわかりません)。

+0

それは私の推測になるだろう。 Postmanが一時的な資格情報をサポートしているかどうかはわかりませんが、Cognitoや任意のセッション資格情報を使用する場合は、リクエストでSessionTokenを送信する必要があります。 SDKがあなたのために働いてくれてうれしいです! –

2

TL; DR:Postmanと連携するには、X-Amz-Security-Tokenというヘッダーにトークンを渡す必要があります。

最初におかげで、あなた自身の答えまで私は同じ問題に苦労していました。これが解決策につながりました。あなたが見つけることができるのJavaScript SDKのREADMEに

var apigClient = apigClientFactory.newClient({ 
    accessKey: 'ACCESS_KEY', 
    secretKey: 'SECRET_KEY', 
    sessionToken: 'SESSION_TOKEN', //OPTIONAL: If you are using temporary credentials you must include the session token 
    region: 'eu-west-1' // OPTIONAL: The region where the API is deployed, by default this parameter is set to us-east-1 
}); 

[OK]を使用すると、一時的な資格情報のためのトークンを必要とするので、cognitoドキュメントではなく、ここでそれを見るために良いことが、OKでしょう。私はテストするためにjavascriptのバージョンを書くために辞任します、明らかにCORSが動作する必要があります。 CORSを有効にするページで、フィールドAccess-Control-Allow-Headersにデフォルト値Content-Type, X-Amz-Date, Authorization, X-Api-Key, X-Amz-Security-Tokenがあります。

+0

ありがとう!私は明日それを試してみるよ。それの見た目で、私はそれが動作すると思います。私はここで更新します。 – codingquark

関連する問題