QuickSightUserNotFoundException При получении URL-адреса для встраивания AWS Quicksight с пользователем cognito - PullRequest
0 голосов
/ 08 апреля 2020

Я пытаюсь получить URL-адрес для встраивания Quicksight в лямбда-функцию,

Лямбда-функция получает jwtToken от внешнего интерфейса, созданного в приложении реагирования, с использованием aws ampify, все настройки cognito работают хорошо (пул пользователей и пул удостоверений), пользователь получает роль «arn: aws: iam :: xx: role / Cognito_qa1_Admin» при входе в систему,

Роль имеет разрешения для quicksight: registerUser и quicksight: getDashboardEmbedUrl

var cognitoIdentity = new AWS.CognitoIdentity();
  var params = {
    IdentityPoolId: "eu-west-2:xxx-291d-xx-b9a7-8b27c73c796c", // your identity pool id here
    Logins: {
      // your logins here
      "cognito-idp.eu-west-2.amazonaws.com/eu-west-2_xxx": event.jwtToken,
    },
  };
  // Get cognito identity from jwtToken
  cognitoIdentity.getId(params, function (err, data) {
    if (err) {
      return callback(err);
    }
    var roleArn = "arn:aws:iam::xx:role/Cognito_qa1_Admin"; // your cognito authenticated role arn here

    data.Logins = params.Logins;
    // Get credentials for the identity (it also does the AssumeRoleWithWebIdentity)
    cognitoIdentity.getCredentialsForIdentity(data, function (err, data) {
      console.log(data);
      if (err) {
        return callback(err);
      }
      // update credentials with web identity ones
      AWS.config.update({
        region: "eu-west-2",
        accessKeyId: data.Credentials.AccessKeyId,
        secretAccessKey: data.Credentials.SecretKey,
        sessionToken: data.Credentials.SessionToken,
        expiration: data.Credentials.Expiration,
      });

      const quicksight = new AWS.QuickSight();

      var getDashboardParams = {
        AwsAccountId: "xx",
        DashboardId: "a048efb6-3d3c-xx-8920-xxx",
        IdentityType: "IAM",
        ResetDisabled: false,
        SessionLifetimeInMinutes: 100,
        UndoRedoDisabled: false,
      };

      var registerUserParams = {
        AwsAccountId: "xxx",
        Email: event.userEmail,
        IdentityType: "IAM",
        Namespace: "default",
        UserRole: "READER",
        IamArn: roleArn,
        SessionName: event.payloadSub,
      };

      // register user, this one works well
      quicksight.registerUser(registerUserParams, function (err, data) {
        if (err) {
          if (err.code !== "ResourceExistsException") {
            console.log("error registering user");
            return callback(err);
          }
          console.log("user already exists");
        }
        console.log("User registration data", data);
        // Get dashboard url, this is the one failing with QuickSightUserNotFoundException
        quicksight.getDashboardEmbedUrl(getDashboardParams, function (
          err,
          data
        ) {
          if (err) {
            console.log("getDashboardEmbedUrl error", err);
            return callback(err);
          }
          callback(null, data);
        });
      });
    });
  });

Все идет гладко, учетные данные для веб-удостоверения извлекаются и устанавливаются в конфигурацию, вызов registerUser регистрирует пользователя (или возвращает ошибку пользователя, которая уже существует)

Но getDashboardEmbedUrl терпит неудачу с QuickSightUserNotFoundException: Не удалось найти информацию о пользователе в QuickSight

Если я позвоню sts.getCallerIdentity после установки учетных данных, я получу это

{
  ResponseMetadata: { RequestId: 'd5cb26f1-f2f5-4148-87e5-74d6c998fb91' },
  UserId: 'AROAU63RLM5WIRTFDRETQ:CognitoIdentityCredentials',
  Account: 'xxx',
  Arn: 'arn:aws:sts::xxx:assumed-role/Cognito_qa1_Admin/CognitoIdentityCredentials'
}

Есть идеи? Большое спасибо заранее

1 Ответ

0 голосов
/ 13 апреля 2020

При регистрации пользователя IdentityType должно быть IAM, но для getDashboardEmbedUrl это должно быть типа QUICKSIGHT, и вам нужно передать UserArn, который вы можете найти в ответе от registerUser

...