web-dev-qa-db-ja.com

Cloud Functions for Firebase-確認済みのメールに対するアクション

メールの確認後に実行されるCloud Functionトリガーを作成しようとしています。

Cloud Functionsのサンプル では、onCreateおよびonDeleteのトリガーの例しか見つかりませんでした。

ドキュメント カスタムアクションハンドラーの作成について何かを見つけましたが、デフォルトである標準の電子メール検証ダイアログを実際に置き換えたくありません。後で「ユーザー」のプロパティを変更したいだけです。メールが確認されます。

誰もがこれで何か経験がありますか?これは可能ですか?または、カスタム検証ビュー/ダイアログWebページを作成する唯一のオプションですか?

30
deloki

(少なくとも)Android with interface UserInfo method isEmailVerified())で確認ステータスを引き続き確認できます(例:別の確認メールを送信するため)現在のユーザーがまだメールアドレスを確認していない場合にログインに成功し、ログイン画面を再度表示します。HTTPでCloud関数をトリガーしたり、クライアントライブラリを介してFirebaseの値を直接更新したりすることもできます。これは、他のプラットフォームクライアント。検証ステータスを確認できます。

これは、電子メールが検証された直後のイベントではありませんが、ログインを1回試行するたびに検証ステータスがわかり、この値はクライアント側にのみ関連している可能性があります。

1
Martin Zeitler

私はこの問題に直面し、解決方法を理解するのに長い時間を費やしましたので、これがこれに行き詰まる可能性がある人にも役立つことを願っています:

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()は、標準のメールのファイアベース送信を克服する単なる内部関数です

2->次に、自動メールを送信するときにfirebaseによって自動的に生成されるデータを含む手動のhttpトリガーを受け取る関数を作成しました

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-> 3番目のステップは、Firebase Authenticationテンプレートへのリンクを2番目のステップで生成されたリンクに変更することです。

Authentication> Templatesに移動します。

  • 編集アイコンをクリック>カスタマイズアクションURLをクリック:

  • ナビゲーション

  • 生成されたリンクをステップ2に貼り付けて保存します。

  • リンクを保存

これで、自動的に生成されたすべてのリンクが、ステップ2で作成した関数を処理し、実行したいアクションを処理できるようになります。

はっきりさせていただければ幸いです。

0
Rodrigo S