Обновить токен доступа Cognito после добавления пользователя в Cognito - PullRequest
0 голосов
/ 29 июня 2018

Yello, у меня есть следующий сценарий.

После первого входа в систему пользователи должны выбрать свой тип, я получил это, вызвав лямбду, которая добавляет пользователя в соответствующую группу Cognito.

После успешного вызова я хочу обновить сеанс пользователя в своем приложении React, которое я вызываю с помощью следующего кода:

refreshSession = () => {
  return new Promise((resolve, reject) => {     
    this.props.authenticatedUser.refreshSession(this.props.authenticatedUser.signInUserSession.refreshToken, () => {
      Auth.currentAuthenticatedUser()
        .then(updatedAuthUser => {
          this.props.onUserAuthenticated(updatedAuthUser); // update redux state
          resolve();
        })
        .catch(err => {
            console.log(err);
            reject();
        });
    });
  });
};

Он выполняет свою работу, когда дело доходит до обновления значений idToken - полезная нагрузка idToken имеет обновленные группы пользователей и роли.

Проблема, с которой я столкнулся, заключается в вызове API, который я выполняю после вызова моей функции refreshSession, определенной выше. Лямбда-вызов ведет себя так, как будто пользователь не принадлежит к группе Cognito, в которую он был добавлен, и я получаю ответ 403. Если я выйду из системы и войду снова, я смогу успешно вызвать API.

Так эффективно я делаю что-то вроде (псевдокод):

addUserToCognitoGroup()
  .then(() => {
    // user is added to Cognito Group
    refreshIdToken().then(() => {
      // my idToken seems to be refreshed
      doSomethingThatRequiresMembershipInTheGroup() // this API call returns 403 
  })

Я предполагаю, что это может быть связано с тем, что мой код не обновляет токен доступа, но я изо всех сил пытаюсь найти способ правильно обновить весь сеанс пользователя.

Мои зависимости package.json

"dependencies": {
  "amazon-cognito-identity-js": "^2.0.11",
  "aws-amplify": "^0.4.6",
  "aws-api-gateway-client": "^0.2.13",
  "aws-sdk": "^2.263.1",
  "aws-serverless-express": "^3.2.0",
  "aws4": "^1.6.0",
  "axios": "^0.18.0",
  "express": "^4.15.2",
  "graphql": "^0.13.2",
  "lodash": "^4.17.10",
  "moment": "^2.22.2",
  "react": "^16.4.1",
  "react-bootstrap": "^0.32.1",
  "react-dom": "^16.4.1",
  "react-intl": "^2.4.0",
  "react-redux": "^5.0.7",
  "react-router": "^4.3.1",
  "react-router-bootstrap": "^0.24.4",
  "react-router-dom": "^4.3.1",
  "react-scripts": "^1.1.4",
  "react-table": "^6.8.6",
  "redux": "^4.0.0"
}

Любые указатели будут высоко оценены:)

1 Ответ

0 голосов
/ 02 июля 2018

После повторной попытки сегодня я заметил, что могу избежать получения 403, если перезагружу страницу после добавления пользователя в Cognito Group.

Это заставило меня пойти и отладить Auth API Amplify, и я заметил, что он вызвал функцию с именем _setCredentialsFromSession в какой-то момент. Итак, я пошел и изменил свой код для этого (currentUserCredentials делает вызов _setCredentialsFromSession):

refreshSession() {
  return new Promise((resolve, reject) => {
  this.props.authenticatedUser.refreshSession(this.props.authenticatedUser.signInUserSession.refreshToken, () => {
    Auth.currentUserCredentials().then(() => {
      Auth.currentAuthenticatedUser().then(updatedAuthUser => {    
        this.props.onUserAuthenticated(updatedAuthUser);
        resolve();
      })
      .catch(err => {
          console.log(err);
          reject();
      });
    });
  });
});

Чувствуется немного грязно, но теперь это работает. Если кто-то найдет лучшее решение, дайте мне знать.

...