NodeJS 如何使用Firebase发送验证电子邮件并阻止未经验证

jchrr9hc  于 2023-04-20  发布在  Node.js
关注(0)|答案(1)|浏览(100)

我正在使用Firebase身份验证和电子邮件和密码,所以没有外部ID提供程序。
我喜欢的行为:
1.只有具有特定电子邮件域的用户才能注册。我称之为“域”。
1.注册时,用户会收到一封验证电子邮件。
1.每当用户尝试使用未经验证的电子邮件登录时,他都会收到一封验证电子邮件。
1.应阻止访问,直到电子邮件得到验证。
这是我在注册时假设发生的情况:

  1. beforeCreate()只在创建用户之前触发一次,并且不会再次为该用户触发。如果域不是“@ www.example.com“,则抛出错误domain.com,否则福尔斯。此函数似乎工作正常。
  2. beforeSignIn()在beforeCreate()之后立即触发。由于此时电子邮件未经过验证,因此用户应该会收到一封验证电子邮件。问题是代码不会发送电子邮件。
    我从beforeSignIn()得到这个错误:“未处理的错误FirebaseAuthError:There is no user record corresponding to the provided identifier.”因为没有创建用户。如果我将“send email”代码段移动到beforeCreate(),用户将被创建,但我仍然从beforeCreate()得到相同的“no user record”错误。
    请指示。
const functions = require('firebase-functions');

exports.beforeCreate = functions.auth.user().beforeCreate((user, context) => {
  if (!user?.email?.includes('@domain.com')) {
    throw new functions.auth.HttpsError(
      'invalid-argument', 'Unauthorized email');
  }
});

const functions = require('firebase-functions');
const admin = require('firebase-admin');
admin.initializeApp();

exports.beforeSignIn = functions.auth.user().beforeSignIn((user, context) => {
  if (user.email && !user.emailVerified) {
    // Send custom email verification on sign-up.
    const locale = context.locale;
      return admin.auth().generateEmailVerificationLink(user.email).then((link) => {
        return sendCustomVerificationEmail(user.email, link, locale);
      });
  }
});
ilmyapht

ilmyapht1#

您需要使用beforeCreate阻止函数在创建帐户之前管理用户:

注册时需要电子邮件验证

以下示例显示如何要求用户在注册后验证其电子邮件:

exports.beforeCreate = authClient.functions().beforeCreateHandler((user, context) => {
  const locale = context.locale;
  if (user.email && !user.emailVerified) {
    // Send custom email verification on sign-up.
    return admin.auth().generateEmailVerificationLink(user.email).then((link) => {
      return sendCustomVerificationEmail(user.email, link, locale);
    });
  }
});

exports.beforeSignIn = authClient.functions().beforeSignInHandler((user, context) => {
 if (user.email && !user.emailVerified) {
   throw new gcipCloudFunctions.https.HttpsError(
     'invalid-argument', `"${user.email}" needs to be verified before access is granted.`);
  }
});

相关问题