Невозможно настроить AWS -усилитель MFA - проблема с функцией Auth.confirmSignIn - PullRequest
0 голосов
/ 26 марта 2020

У меня проблема с добавлением 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, чтобы позволить пользователю войти в систему - я, кажется, делаю все правильно, согласно документам.

Есть идеи?

...