首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何使用Firebase函数在用户创建后发送电子邮件验证?

如何使用Firebase函数在用户创建后发送电子邮件验证?
EN

Stack Overflow用户
提问于 2017-03-18 09:25:20
回答 5查看 13.4K关注 0票数 13

我试图在用户创建后发送验证电子邮件。由于Firebase本身无法实现,所以我正在使用云功能进行尝试。

我真的找不到很多关于它的文件。到目前为止,我试图做的是:

代码语言:javascript
运行
复制
exports.sendEmailVerification = functions.auth.user().onCreate(event => {
    return user.sendEmailVerification()
});

但是我得到了用户未定义的错误。

如何创建此函数?

谢谢!

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2017-03-18 14:52:24

向用户发送“电子邮件验证”邮件有两种可能性:

  1. 登录用户请求发送验证电子邮件。为此,您可以从前端调用来自适当客户端SDK的sendEmailVerification()方法。
  2. 通过其中一个Admin,您可以通过相应的方法(例如,用于生成用于电子邮件验证的链接 Admin的auth.generateEmailVerificationLink() )通过通过您自己的机制发送的电子邮件发送这个链接。所有这些都是在后端完成的,并且可以在云函数中完成。

请注意,Admin SDK的第二个选项与客户端SDK的第一个选项并不完全类似:在第二个选项中,您需要通过自己的机制发送电子邮件,而在第一个选项中,电子邮件由Firebase平台自动发送。

如果您希望将这种功能添加到Admin中,我建议您使用提交功能请求

票数 17
EN

Stack Overflow用户

发布于 2018-12-17 00:31:57

这就是我如何使用Firebase云函数和一个小型的express后端服务器成功地实现了它。

创建每个新用户时触发的Firebase函数(背景)

  • 此函数向api端点发送一个"user“对象。

代码语言:javascript
运行
复制
const functions = require('firebase-functions');
const fetch = require('node-fetch');

// Send email verification through express server
exports.sendVerificationEmail = functions.auth.user().onCreate((user) => {
  // Example of API ENPOINT URL 'https://mybackendapi.com/api/verifyemail/'
  return fetch( < API ENDPOINT URL > , {
      method: 'POST',
      body: JSON.stringify({
        user: user
      }),
      headers: {
        "Content-Type": "application/json"
      }
    }).then(res => console.log(res))
    .catch(err => console.log(err));
});

服务器中间件代码

  • 这里使用verifyEmail作为中间件。

代码语言:javascript
运行
复制
// File name 'middleware.js'
import firebase from 'firebase';
import admin from 'firebase-admin';

// Get Service account file from firebase console
// Store it locally - make sure not to commit it to GIT
const serviceAccount = require('<PATH TO serviceAccount.json FILE>');
// Get if from Firebase console and either use environment variables or copy and paste them directly
// review security issues for the second approach
const config = {
  apiKey: process.env.APIKEY,
  authDomain: process.env.AUTHDOMAIN,
  projectId: process.env.PROJECT_ID,
};
// Initialize Firebase Admin
admin.initializeApp({
  credential: admin.credential.cert(serviceAccount),
});

// Initialize firebase Client
firebase.initializeApp(config);

export const verifyEmail = async(req, res, next) => {
  const sentUser = req.body.user;
  try {
    const customToken = await admin.auth().createCustomToken(sentUser.uid);
    await firebase.auth().signInWithCustomToken(customToken);
    const mycurrentUser = firebase.auth().currentUser;
    await mycurrentUser.sendEmailVerification();
    res.locals.data = mycurrentUser;
    next();
  } catch (err) {
    next(err);
  }
};

服务器代码

代码语言:javascript
运行
复制
// Filename 'app.js'
import express from 'express';
import bodyParser from 'body-parser';
// If you don't use cors, the api will reject request if u call it from Cloud functions
import cors from 'cors';
import {
  verifyEmail
} from './middleware'

app.use(cors());
app.use(bodyParser.urlencoded({
  extended: true,
}));
app.use(bodyParser.json());

const app = express();
// If you use the above example for endpoint then here will be
// '/api/verifyemail/'
app.post('<PATH TO ENDPOINT>', verifyEmail, (req, res, next) => {
  res.json({
    status: 'success',
    data: res.locals.data
  });
  next()
})

此端点将返回完整的用户对象,并将验证电子邮件发送给用户。

我希望这能帮到你。

票数 5
EN

Stack Overflow用户

发布于 2017-03-18 09:38:15

首先通过Firebase 这里查看文档。

当注册阶段完成并获得成功时,异步触发以下函数:

代码语言:javascript
运行
复制
 private void sendVerification() {
             FirebaseUser user = FirebaseAuth.getInstance().getCurrentUser();
             user.sendEmailVerification().addOnCompleteListener(new OnCompleteListener<Void>() {
                @Override
                public void onComplete(@NonNull Task<Void> task) {
                    if (task.isSuccessful()) {
                         system.print.out("Verification Email sent Champion")
                          }
                         }
                });
}

用户现在将获得一封验证电子邮件。单击超链接后,您的项目服务器将使用Firebase对用户进行验证。

如何确定用户是否验证了他们的电子邮件?

代码语言:javascript
运行
复制
 private void checkEmail() {

    FirebaseUser user = FirebaseAuth.getInstance().getCurrentUser();

    if (user.isEmailVerified()) {
           // email verified ...
    } else {
       // error : email not verified ...
    }
}

遗憾的是,您可能无法自定义您的验证电子邮件的内容/正文(我一直与Firebase大量通信,以提供另一种不那么可怕的模板)。您可以更改标题或消息发送者ID,但仅此而已。

除非您将应用程序与您自己支持的Web重新链接,否则不会。这里

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/42872594

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档