Firebase admin SDK создать пользователя и отправить письмо с подтверждением

Как я могу отправить электронное письмо с подтверждением после того, как я создам пользователя с помощью firebase admin SDK? Я пытаюсь объединить createUser function и _ 2_ может кто-нибудь указать намек или ответ? Благодарность

Обновить:

создание пользователя выполняется пользователем-администратором, который уже вошел в приложение, поэтому пользователь-администратор просто создает пользователей на панели управления. Это полностью отличается от методов регистрации.

обновление 2:

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

вот мой код внутри приложения после получения пользовательского токена:

$http.post('/.custom-token', {uid: $scope.data.data.uid})
        .then(function (response) {
            console.log("custom token here:", response.data.token);
            firebase.auth().signInWithCustomToken(response.data.token)
                .then(function (firebaseUser) {
                    firebaseUser.sendEmailVerification();
                    firebase.auth().signOut().then(function() {
                        // Sign-out successful.
                        console.log("signed out success");
                    }, function(error) {
                        // An error happened.
                    });
                })

                .catch(function(error) {
                    // Handle Errors here.
                    var errorCode = error.code;
                    var errorMessage = error.message;
                    // ...
                });

        });

Итак, я получаю токен, вхожу в систему для нового пользователя, отправляю ссылку для подтверждения по электронной почте, а затем выхожу из системы для нового пользователя. Но мой пользователь-администратор, который делает все это, также выходит из системы. что мне здесь не хватает?


person passion    schedule 26.01.2017    source источник
comment
Привет! Я ищу нечто подобное. Как вы преодолели проблему выхода администратора из системы?   -  person user165242    schedule 28.09.2017
comment
вы должны вызвать функцию signOut в функции then sendEmailVerification (). Поскольку sendEmailVerification является асинхронным, вам следует дождаться завершения выполнения и затем вызвать функцию signOut.   -  person DerFaizio    schedule 19.02.2018


Ответы (4)


Хорошо, это то, что вы можете сделать, но вы можете столкнуться с ограничениями квоты:

  • Включите модуль firebase-admin.
  • Включите клиентский модуль firebase.
  • используя admin sdk, создайте нового пользователя через createUser
  • когда это обещание разрешится, получите uid созданного пользователя.
  • используя admin sdk, создайте собственный токен для этого uid.
  • используя клиентский sdk, маркер signInWithCustom с использованием этого настраиваемого маркера.
  • Пользователь возвращается в процессе, вызовите user.sendEmailVerification ()
  • выйти из этого пользователя из клиентского SDK.
person bojeil    schedule 27.01.2017
comment
хммм, но вход в систему с токеном пользователя будет конфликтовать с моим текущим сеансом входа в систему с правами администратора? - person passion; 27.01.2017
comment
Вход пользователя в систему не будет конфликтовать с вашим сеансом администратора. В этом случае вы не можете полагаться на currentUser и запускать sendEmailVerification на возвращенном экземпляре пользователя при входе в систему. - person bojeil; 27.01.2017
comment
спасибо за подсказки, я попытался последовать за вашим объяснением, но у меня все еще есть проблема, пожалуйста, посмотрите мой обновленный вопрос. Благодарю. - person passion; 28.01.2017
comment
Я не думаю, что понимаю, что вы имеете в виду под администратором? Вот одна вещь, которую вы можете сделать: вы можете создать копию firebaseApp, в которой вы выполняете следующие операции временного входа: var tempApp = firebase.initializeApp (clientConfig, 'temp'); Затем вы используете tempApp.auth (). SignInWithCustomToken ... Это не будет конфликтовать с вашим другим экземпляром. - person bojeil; 29.01.2017
comment
Я потратил несколько дней на эту проблему и нашел ответ. Спасибо за ответ. Вы сделали мой день :) - person Pankaj Parkar; 11.10.2018
comment
Как выйти из клиентского SDK этого пользователя, не выполнив также выход пользователя с правами администратора? Как администратор, я создаю нового пользователя, но затем эта последняя строка выводит нового пользователя и меня (пользователя-администратора). - person Barryman9000; 17.12.2020

Для этого вам даже не нужно использовать Firebase Admin SDK. Вы можете просто использовать обычный клиентский SDK Firebase:

firebase.auth().createUserWithEmailAndPassword(email, password)
  .then(function(user) {
     console.log("User successfully created:", user.uid);
     return user.sendEmailVerification();
  })
  .then(function() {
    console.log("Email verification email successfully sent!");
  })
  .catch(function(error) {
    console.log("Error:", error);
  });
person jwngr    schedule 26.01.2017
comment
Я думаю, вы упускаете суть: If the new account was created, the user is signed in automatically. Have a look at the Next steps section below to get the signed in user details. он автоматически входит в систему. Пользователь, который создает другого пользователя X, уже вошел в систему, если этот новый пользователь X также войдет в систему, возникнет конфликт в токенах сеанса. - person passion; 27.01.2017
comment
К сожалению, я не понимаю, о чем вы просите. - person jwngr; 27.01.2017
comment
Это сработало для меня. Пришлось немного скорректировать первый обратный вызов (user) = ›user.user.sendEmailVerification () - person Lonelydatum; 26.03.2019

Согласно firebase, admin-sdk в настоящее время не поддерживает эту функцию. См. Их ответ здесь: https://stackoverflow.com/a/44557980/8177355

Всякий раз, когда пользователь с аутентификацией по электронной почте / паролю входит в систему и пытается использовать функцию, требующую аутентификации, я вызываю onAuthStateChanged (), а затем проверяю запись пользователя для проверки электронной почты.

Если электронное письмо не подтверждено, и я не отправлял письмо с подтверждением раньше, я отправлю его автоматически. Я возвращаю сообщение об ошибке с просьбой подтвердить адрес электронной почты. (Я сохраняю переменную в настройках профиля для пользователя в firestore, чтобы указать, была ли она отправлена ​​ранее).

При будущих попытках использовать приложение, если электронное письмо все еще не проверено, я возвращаю ту же ошибку, а также включаю в ошибку кнопку с надписью «повторно отправить проверочное электронное письмо», которая при нажатии запускает отправку проверочного электронного письма. (Таким образом, я не отправляю автоматически тонны проверочных писем каждый раз, когда пользователь пытается что-то сделать.)

person Matthew Rideout    schedule 27.02.2018

Достаточно чистым решением было бы фактически использовать REST API.

curl 'https://www.googleapis.com/identitytoolkit/v3/relyingparty/getOobConfirmationCode?key=[API_KEY]' \
-H 'Content-Type: application/json' \
--data-binary '{"requestType":"PASSWORD_RESET","email":"[[email protected]]"}'

[КЛЮЧ API] - это ключ API веб-клиента, который можно получить в разделе «Настройки проекта»> «Добавить приложение»> «нажмите на Интернет», и вы получите конфигурацию с помощью JSON, внутри JSON есть API-ключ, который вам нужен. использовать.

person N Jay    schedule 04.10.2018