AWS Amplify 'currentUserCredentials ()' возвращает неожиданное аутентифицированное значение, ошибка?

При вызове Auth.currentUserCredentials () после Auth.signIn () я получаю действительные учетные данные, но почему для неаутентифицированного пользователя?

Код:

   async signIn({ dispatch, state }, { email, password }) {

  try {
    const user = await Auth.signIn(email, password);
    console.log("User state after login")
    const userCredentialsAfterLogin = await Auth.currentUserCredentials();
    console.log(userCredentialsAfterLogin)

  } catch (error) {
    console.log("error")
    console.log(error)
    return
  }
  await dispatch('fetchUser')
},

Ожидаемое поведение:

После входа в систему с действующим пользователем Auth.currentUserCredentials () должен вернуть проверенный набор учетных данных.

Фактическое поведение:

Auth.currentUserCredentials () возвращает неаутентифицированного пользователя со свойством аутентификации, установленным на false, и ошибкой 400, ResourceNotFoundException: IdentityPool 'eu-west-1: 62dab5ed-5a84-4064-a7a2-87d1d0df511b '

Система:

  • authenticationFlowType: USER_SRP_AUTH
  • Версии: aws-ampify: ^ 3.3.14, aws-amp-ampify-vue: ^ 2.1.4, ampify версия 4.42.0

config

{
  "authSelections": "userPoolOnly",
  "resourceName": "testapp89e81d50",
  "serviceType": "imported",
  "region": "eu-west-1"
}

person MarkK    schedule 14.02.2021    source источник


Ответы (1)


Я понимаю, откуда вы, и, честно говоря, я не могу показать вам четкую документацию, в которой точно указано, почему это не сработает. Документацию AWS по Cognito и Amplify сложно собрать воедино, потому что фреймворк Amplify по-прежнему использует старую библиотеку под капотом ('amazon-cognito-identity-js'), а Cognito - это название как для подключения-входа-с- IAM и предложения по подписке / входу как услуге. Cognito - супер мощный и надежный с точки зрения безопасности, если все сделано правильно, но настройка немного затруднительна.

Там немного документации, например документы API Amplify Auth здесь. Вы можете видеть, что currentCredentials / currentUserCredentials предоставляет вам некий объект, который, помимо прочего, содержит "идентификатор". Учетные данные в платформе Amplify Auth относятся к учетным данным AWS IAM, которые относятся к Cognito Identity.

Похоже, вы используете Amplify для входа в пул пользователей Cognito, используя адрес электронной почты / пароль. Пул пользователей Cognito можно подключить к пулу Cognito Identify для «обмена» токена Cognito JWT на некоторые учетные данные, которые можно использовать для использования ресурсов AWS (учетные данные IAM). Однако это не требуется для нормальной работы процесса входа / регистрации.

Итак, вопрос: чего вы хотите?

  1. Вы хотите знать о текущем вошедшем в систему пользователя пуле пользователей Cognito, например его адрес электронной почты, токен JWT и другие поля, хранящиеся в токене JWT? Используйте currentUserInfo или currentUserSession

  2. Вы действительно хотите иметь учетные данные IAM для вызова ресурсов AWS? Обязательно создайте и подключите свой пул пользователей Cognito к пулу идентификаторов Cognito и настройте идентификатор пула идентификаторов в настройках внешнего интерфейса. Если вы это сделали, вы сможете использовать currentCredentials.

person Bram    schedule 14.02.2021
comment
Привет, Брэм, спасибо за подробный ответ. Возможно, мне придется перечитать его еще раз, чтобы полностью усвоить. Возможно, я неправильно понял некоторые основы. Что касается того, что я хочу делать. У меня есть 2 вещи. Первый - определить, вошел ли пользователь в систему, второй - получить JWT для взаимодействия с сервером или API. т.е. может быть Auth.currentAuthenticatedUser ()? - person MarkK; 14.02.2021
comment
Я протестировал следующую const user = await Auth.currentAuthenticatedUser (), и у меня все еще есть пустой сеанс. Я импортировал свой UserPool, возможно, настройки неверны. - person MarkK; 14.02.2021
comment
Я только что обновил OP с помощью AWS Config. Глядя на значение userPoolOnly и пытаясь понять вашу точку зрения 2. - person MarkK; 14.02.2021
comment
Каков результат Auth.signIn? - person Bram; 14.02.2021
comment
Auth.signIn возвращает мне объект пользователя и успешно, userID, dcb1ebe3-32d1-46a8-93ed-c0c1ed31dc1d, включая такие атрибуты, как электронная почта и подписка. Сессия пуста. - person MarkK; 14.02.2021
comment
Кажется странным поведение, может что-то в конфиге не работает. Возможно, проверьте локальное хранилище, если вы можете найти токен JWT, он должен храниться и отображаться там. - person Bram; 14.02.2021
comment
Я просто использовал Auth.currentSession () и декодировал JWT, который дает мне правильного пользователя, но Auth.currentAuthenticatedUser () дает мне неаутентифицированного пользователя - person MarkK; 14.02.2021
comment
Я получаю это и ошибку 400, затем вызываю Auth.currentAuthenticatedUser (): {__type: "ResourceNotFoundException",…} message: "IdentityPool 'eu-west-1:62dab5ed-5a84-4064-a7a2-87d1d0df511b' not found." __type: ResourceNotFoundException - person MarkK; 14.02.2021
comment
Думаю, я обнаружил здесь ту же проблему github.com/aws-amplify/amplify -js / issues / 2702 без исправления. - person MarkK; 14.02.2021
comment
У меня нет федеративного пула пользователей, только пул пользователей когнитивного типа, проблема в этом? - person MarkK; 14.02.2021
comment
Похоже, он настроен так, как будто есть пул идентификаторов, но на самом деле его нет. Дважды проверьте свою конфигурацию, чтобы увидеть, не установили ли вы какое-либо свойство, которое должно быть пулом идентификаторов. Если у вас нет пула идентификаторов, это свойство должно быть пустым / не заданным. - person Bram; 14.02.2021