Amplify метод completeNewPassword, выбрасывающий TypeError для пользовательских данных - PullRequest
0 голосов
/ 11 марта 2019

Я пытаюсь использовать пользовательский интерфейс с aws Amplify, но у меня проблемы с Auth.completeNewPassword. Любая попытка использования этого метода приводит к ошибке Error in v-on handler: "TypeError: Cannot read property 'username' of null.

Использовав данный интерфейс перед этим, я знаю, что когда пользователь Cognito создается администратором, они отправляются в форму «новый пароль» при первом входе в систему. Однако в примере из документов Amplify есть метод signIn, который немедленно вызывает метод completeNewPassword, когда он обнаруживает, что пользователю нужен новый пароль.

Следующий фрагмент кода взят из документов Амазонки:

import { Auth } from 'aws-amplify';

Auth.signIn(username, password)
.then(user => {
    if (user.challengeName === 'NEW_PASSWORD_REQUIRED') {
        const { requiredAttributes } = user.challengeParam; // the array of required attributes, e.g ['email', 'phone_number']
        Auth.completeNewPassword(
            user,               // the Cognito User Object
            newPassword,       // the new password
            // OPTIONAL, the required attributes
            {
              email: 'xxxx@example.com',
              phone_number: '1234567890'
            }
        ).then(user => {
            // at this time the user is logged in if no MFA required
            console.log(user);
        }).catch(e => {
          console.log(e);
        });
    } else {
        // other situations
    }
}).catch(e => {
    console.log(e);
});

Я пытался сделать это несколькими разными способами с тем же результатом TypeError. Неважно, если я вызываю метод completeNewPassword отдельно, сохраняю пользователя как переменную и передаю его, пытаюсь повторно войти в систему и передать этого пользователя в completeNewPassword и т. Д. И т. Д. Одинаковая ошибка TypeError каждый раз.

Следующий метод, например, правильно регистрирует объект «пользователь» при первом нажатии кнопки входа в систему, но завершается ошибкой до этой строки при нажатии той же кнопки при попытке ввести новый пароль.

signIn () {
    Auth.signIn(this.user_name, this.password)
    .then(user => {
        if (user.challengeName === 'NEW_PASSWORD_REQUIRED') {
        console.log(user)
        const { requiredAttributes } = user.challengeParam;
        this.$parent.$parent.pageStatus.passwordSetPanel = true;
        Auth.completeNewPassword(
            user,
            this.newPassword
        )
        }
    })
},

Дополнительная информация:

  1. Каркас Vue
  2. Был в состоянии подтвердить новые пароли для новых пользователей с данным пользовательским интерфейсом
  3. ошибка 'username' TypeError не приходит от моего js, но ссылается на параметр username в обещании пользователя (я проверил и не пытаюсь передать user_name там, где ему нужно имя пользователя)

EDIT

Удалось найти полуработающее решение с помощью следующего кода:

signIn () {
    this.$parent.$parent.pageStatus.loginPanel = false;
    this.$parent.$parent.loading = true;
    Auth.signIn(this.user_name, this.password)
    .then(async user => {
        if (user.challengeName === 'NEW_PASSWORD_REQUIRED') {
        const loggedUser = await Auth.completeNewPassword(
            user,
            this.password,
        )
        this.$parent.$parent.pageStatus.passwordSetPanel = true
        }
    })
}

Это позволяет обновить пользователя, но мне пришлось установить пароль this.password (исходный, подлежащий изменению), чтобы он работал. Похоже, проблема в том, что Amplify хочет, чтобы я использовал одну и ту же функцию как для входа, так и для вызова completeNewPassword. Но пользовательский интерфейс для этого должен быть разделен между двумя различными панелями.

1 Ответ

0 голосов
/ 12 марта 2019

Это ужасный взлом, но я в итоге нашел обходной путь, сохранив обещание пользователя, имя и пароль в виде открытого текста во временной переменной js, чтобы сохранить их для панели completeNewPassword.Если кто-нибудь знает лучшее решение, не стесняйтесь опубликовать его.

...