1. ホーム
  2. javascript

[解決済み] AccessDeniedです。sts:AssumeRoleWithWebIdentityを実行する権限がありません。

2022-02-17 08:55:39

質問

似たような問題をいろいろと調べてみましたが、私の問題を解決できませんでした。AWS Cognitoの認証を使用したWebアプリケーションを開発しています。サインアップの部分は問題ないのですが、サインインしようとすると、"not authorized"という例外が発生します。IAM Roleにカスタムポリシーをアタッチしようとしましたが(sts:AssumeRoleWithWebIdentityを認可する)、うまくいきませんでした。以下は、今現在のコードの書き方です。

        var cognitoUser = new AWSCognito.CognitoIdentityServiceProvider.CognitoUser(userData);
cognitoUser.authenticateUser(authenticationDetails, {
    onSuccess: function (result) {
        var sts = new AWS.STS({apiVersion: '2011-06-15'});

        var params = {
            RoleArn: 'arn:aws:iam::981601120657:role/Cognito_AliceAuth_Role', /* required */
            RoleSessionName: 'AliceUserSession', 
            WebIdentityToken: result.getIdToken().getJwtToken(), 
            Policy: '{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": "sts:AssumeRoleWithWebIdentity", "Resource": "*" } ] }'
        };

        sts.assumeRoleWithWebIdentity(params, function (err, data) {
            if (err)
                console.log(err, err.stack); // ** <-- ERROR HERE
            else
                console.log(data);           // successful response
        });

        //document.getElementById('authForm').submit();
    },
    onFailure: function (err) {
        alert(err);
    }

});

ご覧の通り、コード内でもポリシーを指定したのですが、やはり "AccessDenied.が表示されます。Not authorized to perform sts:AssumeRoleWithWebIdentity" というエラーが表示されます。助けてください:/。

EDIT

Cognito_AliceAuth_Role"の中に、ロールポリシーを作成しました。 AssumeRoleWithWebIdentityPolicyを作成しました。

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

とします。GetFederationTokenPolicy(フェデレーション・トークンポリシー)。

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

信頼関係のことです。

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Principal": {
        "Federated": "cognito-identity.amazonaws.com"
      },
      "Action": "sts:AssumeRoleWithWebIdentity",
      "Condition": {
        "StringEquals": {
          "cognito-identity.amazonaws.com:aud": "us-east-1:e4c1833d-a62b-402a-b995-1b2513b04c02"
        },
        "ForAnyValue:StringLike": {
          "cognito-identity.amazonaws.com:amr": "authenticated"
        }
      }
    }
  ]
}

解決方法は?

Cognito ユーザー・プールによって提供された ID トークンを使用して assumeRoleWithWebIdentity を呼び出しているように思われます。

まず、このトークンを Cognito ID とフェデレートする必要があり、Cognito ID が提供する Open Id Connect トークンを使用して assumeRoleWithWebIdentity を呼び出すことができます。 を使用して、直接 getCredentialsForIdentity を呼び出すこともできます。 強化されたフロー .

参照 これ を使用して、ユーザープールトークンと Cognito ID を連携させる方法を学びます。