Облачные функции для Firebase - действие по проверке подлинности электронной почты

Я пытаюсь создать триггер Cloud Function, который будет выполняться после того, как будет проверена электронная почта.

В образцах облачных функций я мог только найти примеры для триггеров для onCreate и onDelete.

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

У кого-нибудь есть опыт с этим, и это даже возможно? Или мой единственный вариант для создания моей пользовательской веб-страницы проверки/диалога?

Ответ 1

вы по-прежнему можете проверить статус проверки (по крайней мере) на Android с интерфейсом. Метод UserInfo isEmailVerified(); например. чтобы отправить еще одно подтверждение по электронной почте после успешного входа в систему, если текущий пользователь еще не подтвердил адрес электронной почты - и снова отобразите экран входа в систему. можно также HTTP запускать функцию облака или обновлять значения в Firebase непосредственно через клиентскую библиотеку. это может также относиться к другим клиентам платформы, где можно проверить статус проверки.

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

Ответ 2

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

1 → Я создал функцию, которая была запущена с помощью onCreate() для нового пользователя

exports.sendConfirmationEmail = functions.auth.user()
                    .onCreate((user) => {
                        const actionCodeSettings = {
                            url: 'https://appNextURL.com/',
                            handleCodeInApp: false//ensure that the link will open into browser
                        };
                        return admin.auth().generateEmailVerificationLink(user.email, actionCodeSettings)
                            .then(async (link) => {
                                await db.collection('users').doc(user.uid).set({
                                    verificationLink: link,
                                    emailVerified: false
                                }, {merge: true});
                                return sendCustomVerificationEmail(user.email, user.displayName, link);
                            })
                            .catch((err) => {
                                console.error("Error:", err);
                                return Promise.reject(err);
                            });
                    });
  • GenerateEmailVErificationLink() сгенерирует ссылку на основе ссылки, которую мы сохраним на шаге 3.

  • Функция sendCustomVerificationEmail() - это просто внутренняя функция, которая преодолевает стандартную отправку по электронной почте через firebase.

2 → Затем я создал функцию, которая получит ручной http-триггер с данными, которые будут автоматически генерироваться firebase при отправке автоматической электронной почты.

exports.verifyEmail = functions.https.onRequest((req, res) => {
                        const {mode, oobCode, apiKey, continueUrl, lang} = req.query;
                        const link = "https://us-central1-projectId.cloudfunctions.net/verifyEmail/?mode=" + encodeURIComponent(mode) + "&oobCode=" + encodeURIComponent(oobCode) + "&apiKey=" + encodeURIComponent(apiKey) + "&continueUrl=" + encodeURIComponent(continueUrl) + "&lang=" + encodeURIComponent(lang);
                        return db.collection("users")
                            .where("verificationLink", "==", link)
                            .get()
                            .then(function (querySnapshot) {
                                querySnapshot.forEach(function (user) {
                                    const userData: UserData = user.data();
                                    console.log("email verified: ", userData.userId);
                                    return admin.auth().updateUser(userData.userId, {
                                        emailVerified: true
                                    }).then(function (userRecord) {
                                        return db.collection('users').doc(userData.userId).set({emailVerified: true}, {merge: true});
                                    });
                                });
                                return res.sendStatus(200).end();
                            }).catch(function (err) {
                                console.log("error:", err);
                                return res.sendStatus(403).end();
                            });
                    });
  • Поскольку я сохранил ссылку в onCreate(), теперь я могу запросить эту ссылку, чтобы узнать, кто является пользователем, которого я аутентифицирую

3 → третий шаг - изменить ссылку на шаблон аутентификации Firebase на ссылку, сгенерированную на 2-м шаге:

Перейдите к Аутентификации> Шаблоны:

  • Нажмите на иконку редактирования> Нажмите на ссылку настроить действие:

  • навигация

  • Вставьте ссылку, созданную в шаге 2, и сохраните:

  • Сохранить ссылку

Теперь каждая сгенерированная автоматически ссылка будет связана с той функцией, которую вы создали на шаге 2, и вы сможете обрабатывать действия, которые вы хотите выполнить.

Я надеюсь, что я мог быть ясным.