Cognito paswordless auth через ссылку - PullRequest
0 голосов
/ 13 октября 2018

Я пытаюсь реализовать аутентификацию по ссылке без пароля.Например, пользователь вводит свой адрес электронной почты -> Cognito отправить электронное письмо со ссылкой, по которой пользователь может нажать и войти в систему.Это

Это поддерживается Cognito через пользовательский вызов.Например, https://aws -amplify.github.io / ampify-js / media / authentication_guide # using-a-custom-challenge

Я создал DefineAuthChallenge, CreateAuthChallenge, VerifyAuthChallenge лямбда-функция, которая связана с моим пулом Cognito.CreateAuthChallenge генерирует код, который отправляется на электронную почту пользователя со ссылкой на сайт.

Далее я планировал получить этот код с URL-адреса на сайте и войти в систему через него, как в документации

Auth.signIn(username)
    .then(user => {
        if (user.challengeName === 'CUSTOM_CHALLENGE') {
            Auth.sendCustomChallengeAnswer(user, challengeResponse)
                .then(user => console.log(user))
                .catch(err => console.log(err));
        } else {
            console.log(user);
        }
    })
    .catch(err => console.log(err));

Но здесь есть проблема.Auth.sendCustomChallengeAnswer требуется пользовательский объект, который передается из Auth.signIn.Но если пользователь просто щелкнет ссылку из электронного письма, то никакого пользовательского объекта вообще не будет.И усиление lib не сохраняет этот объект пользователя среднего сеанса, поэтому при перезагрузке страницы он теряется.Он сохраняется только в том случае, если авторизация завершена в его хранилище https://github.com/aws-amplify/amplify-js/blob/master/packages/amazon-cognito-identity-js/src/CognitoUser.js#L175

Поэтому вопрос заключается в том, как сохранить и восстановить пользовательский объект из функции Auth.signIn при перезагрузке страницы.Или если есть лучший подход для входа через ссылку без пароля?

1 Ответ

0 голосов
/ 18 октября 2018

Чтобы решить эту проблему сначала, вам нужно сохранить имя пользователя и сессию в локальном хранилище или куки.Затем, когда пользователь перейдет по ссылке, можно использовать этот код:

 const userPoolData = {
    UserPoolId: process.env.COGNITO_POOL_ID,
    ClientId: process.env.COGNITO_POOL_WEB_CLIENT_ID,
    Storage: customStorageClass // default is localstorage
  }

  const userPool = new CognitoUserPool(userPoolData)

  const userData = {
    Username: getUsernameFromCookiesOrLocalstorage,
    Pool: userPool,
    Storage: customStorageClass // default is localstorage
  }
  const user = new CognitoUser(userData)
  user.Session = getSessionFromCookiesOrLocalstorage
  Auth.sendCustomChallengeAnswer(user, code)
...