Я пытаюсь использовать пользовательский интерфейс с 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
)
}
})
},
Дополнительная информация:
- Каркас Vue
- Был в состоянии подтвердить новые пароли для новых пользователей с данным пользовательским интерфейсом
- ошибка '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. Но пользовательский интерфейс для этого должен быть разделен между двумя различными панелями.