У меня проблема с добавлением MFA на мой сайт, который управляет аутентификацией с помощью AWS Amplify.
Я последовал примеру здесь и создал приведенный ниже код для работы как с пользователями, у которых включен MFA, так и с теми, кто этого не делает.
const Signin = props => {
const { classes, onStateChange, history } = props;
const [inputs, setInputs] = useState({
username: '',
password: '',
});
const [currentStep, setCurrentStep] = useState(1)
const [userObject, setUserObject] = useState({})
const [authCode, setauthCode] = useState({code: ''})
const onSignIn = async (e) => {
const username = inputs.username.toLowerCase()
await Auth.signIn({
username, // Required, the username
password: inputs.password, // Optional, the password
}).then(user => {
if (user.preferredMFA === 'SOFTWARE_TOKEN_MFA'){
setUserObject(user)
setCurrentStep(2)}
else{
onStateChange('signedIn', {})
history.push('/dashboard');
}
})
.catch(err => {
showAlert(err.message)
if (err.code === 'PasswordResetRequiredException') {
onStateChange('forgotPassword')
history.push('/forgotpassword');
}
})
}
const MfaSignIn = async (e) => {
const user=userObject
await Auth.confirmSignIn(
user,
authCode.code,
user.preferredMFA
).then(user => {
onStateChange('signedIn', {})
history.push('/dashboard');
})
.catch(err => {
showAlert(err.message)
if (err.code === 'PasswordResetRequiredException') {
onStateChange('forgotPassword')
history.push('/forgotpassword');
}
})
Если MFA не включен, страница входа будет вызывать функцию onSignIn, затем зарегистрировать их. Если MFA включен, объект пользователя, возвращенный из функции входа, вернет значение «SOFTWARE_TOKEN_MFA» для ключа предпочитаемого MFA. и будет загружена вторая страница, которая позволит пользователю ввести свой код MFA, который обрабатывается функцией MfaSignIn.
Нет, MFA работает нормально, однако при попытке использовать функцию MfaSignIn, как я получаю, «отсутствует» обязательный параметр Session "
ключ сеанса объекта пользователя, возвращаемого onSignIn, имеет значение null, и нет упоминаний о том, что его нужно добавлять из документов. Я попытался настроить эту функцию на
const MfaSignIn = async (e) => {
e.preventDefault(authCode.code);
const session= Auth.currentSession().then(data=> {return data})
const token = await session.then(data=>{return data.getAccessToken()})
const user=userObject
user.Session=token.jwtToken
await Auth.confirmSignIn(
user,
authCode.code,
user.preferredMFA
).then(user => {
onStateChange('signedIn', {})
history.push('/dashboard');
})
.catch(err => {
showAlert(err.message)
if (err.code === 'PasswordResetRequiredException') {
onStateChange('forgotPassword')
history.push('/upgrade');
}
})
}
Где я вызываю метод Auth.currentSession и добавляю данные оттуда к значению Session в пользовательском объекте. Добавление всего объекта возвращает ошибку -
«Начало структуры или карты найдено там, где не ожидается». - похоже, что нужна строка, а не объект карты
Я попытался добавить каждую из трех строк токена JWT, найденных в объекте currentSession, вместе с результатом getAccessToken, как в примере выше. Все возвращают ошибку «Неправильный сеанс предоставлен»
Я в растерянности из-за того, что мне нужно дать Auth.confirmSignIn, чтобы позволить пользователю войти в систему - я, кажется, делаю все правильно, согласно документам.
Есть идеи?