Как отправить электронное письмо для использования в Firebase «EmailAuthProvider.credentialWithLink ()»?

#angular #firebase-authentication

#angular #firebase-аутентификация

Вопрос:

Я использую Firebase в приложении Angular 7, чтобы разрешить пользователям входить в систему с помощью опции email / link.

Теперь мне нужно разрешить пользователям удалять свои собственные учетные записи, если они хотят.

Прежде чем разрешить пользователю удалить учетную запись, я должен повторно аутентифицировать ее, используя «учетные данные».

Чтобы получить эти учетные данные, мне нужно использовать

 firebase.auth.EmailAuthProvider.credentialWithLink(email, emailLink) 
  

Первый параметр «email» уже хранится в localStorage, но я не знаю, как получить второй параметр «emailLink».

 const user = firebase.auth().currentUser;
const credential = firebase.auth.EmailAuthProvider.credentialWithLink(
      'example@test.com',
      'HOW TO GET THIS PARAM???'
    );

user
.reauthenticateAndRetrieveDataWithCredential(credential)
.then(function() {
        // DELETE USER HERE.
      });
  

Мне нужно знать процесс получения параметра «emailLink».
Спасибо.

Ответ №1:

Вход по ссылке электронной почты состоит из 2 шагов:

Сначала вам нужно отправить ссылку на электронное письмо.

 const linkId = randomId();
const actionCodeSettings = {
  url: 'https://www.example.com/finishSignUp?linkId='   linkId,
  // This must be true.
  handleCodeInApp: true
};

firebase.auth().sendSignInLinkToEmail(email, actionCodeSettings)
  .then(function() {
    window.localStorage.setItem('emailForSignIn', email);
    window.localStorage.setItem('linkId', linkId);
  })
  .catch(function(error) {
    // Some error occurred, you can inspect the code: error.code
  });
  

Затем вам необходимо выполнить вход или повторную авторизацию по ссылке, которая содержит OTP на странице https://www.example.com/finishSignUp .

Вы должны подтвердить, что электронное письмо было открыто на том же устройстве и является ссылкой для входа по электронной почте:

 if (firebase.auth().currentUser amp;amp;
    firebase.auth().currentUser.email === window.localStorage.getItem('emailForSignIn') amp;amp;
    firebase.auth().isSignInWithEmailLink(window.location.href) amp;amp;
    window.localStorage.getItem('linkId') === getLinkIdFromUrl()) {
  // Complete sign-in and re-auth.
}
  

В случае повторной авторизации:

 const credential = firebase.auth.EmailAuthProvider.credentialWithLink(
  window.localStorage.getItem('emailForSignIn'),
  window.location.href
);

user.reauthenticateAndRetrieveDataWithCredential(credential)
  .then(function() {
    return user.delete();
  });