AWS Javascript APIを使用して、割り当てられたコグニトIDを取得しようとしています:
AWS.config.credentials.get(function(err) {
if (!err) {
console.log("Cognito Identity Id: " + AWS.config.credentials.identityId);
}
});
これにより、以下のメッセージで400エラーが発生するのはなぜですか?
{"__type":"InvalidIdentityPoolConfigurationException","message":"Invalid identity pool configuration. Check assigned IAM roles for this pool."}
認証済みユーザーと非認証ユーザー用に構成されたIAMロールがあります。
{
"Version": "2012-10-17",
"Statement": [{
"Action": [
"mobileanalytics:PutEvents",
"cognito-sync:*"
],
"Effect": "Allow",
"Resource": [
"*"
]
}]
}
このエラーの最も一般的な理由は、IDプールを信頼するようにロールが設定されていないことです。信頼関係にリストされているIDプールIDが、使用しているIDプールと一致することを確認する必要があります。
Amazon Cognitoの信頼関係の詳細については、 開発者ガイド を参照してください。
少し掘り下げた後、RoleArnとAccountIdを資格情報に追加する必要があることに気付きました。
そこにあるドキュメントのほとんどはこれで十分であると述べていますが:
AWS.config.credentials = new AWS.CognitoIdentityCredentials({
IdentityPoolId: 'us-east-1:xxxxx-a87e-46ed-9519-xxxxxxx',
});
これでは不十分でした。
私はこれをしなければなりませんでした:
AWS.config.credentials = new AWS.CognitoIdentityCredentials({
IdentityPoolId: 'us-east-1:xxxxx-a87e-46ed-9519-xxxxx',
RoleArn: 'arn:aws:iam::xxxxx:role/Cognito_xxxxUsersUnauth_Role',
AccountId: 'xxxxxxxxx', // your AWS account ID
});
IDプールのロールのARNについて言及する必要があります。
それを正しく述べている唯一のドキュメントは this one です。
間違ったもの:
何か足りないかもしれませんが、これは確かに混乱します。
IDプール、認証ユーザーに割り当てられているロールの「信頼関係」セクションを確認します。 Cognitoプールへのアクセスを定義するポリシーがあることを確認してください。
要件ポリシーステートメントを取得する最も簡単な方法は、
私の場合、私はSAML IDプロバイダーを使用しています。 IAMロールポリシーのアクションは"Action": "sts:AssumeRoleWithSAML"
である必要があります。しかし、これが例外の根本的な原因です。手動で"Action": "sts:AssumeRoleWithWebIdentity"
に変更する必要があります。 Cognito IDプールによって作成されたロールは"Action": "sts:AssumeRoleWithWebIdentity"
を使用することがわかりました。 IDプロバイダーのタイプはチェックしません。これはバグだと思います。
IDプールの「認証された役割」と「非認証の役割」に設定された役割の信頼関係を2回以上確認しましたが、それでもエラーが発生しました。 IDプールの構成全体を確認した後、
「トークンから役割を選択」を選択しましたが、間違って構成された役割は、ユーザーのコグニトグループにアタッチしたものでした。そのため、このロールの信頼関係を更新すると問題が解決しました。
これが誰かを助けることを願っています:)
このエラーが発生し、私の問題は、カスタムCognitoDeveloperIdentityProviderのlogins()関数からAWSTask(result:nil)を返していたため、ユーザーが認証されていないロールを引き継いでいることが判明しました。