我尝试在创建用户后发送验证电子邮件。由于Firebase本身没有办法,我正在尝试使用云功能。
我真的找不到很多关于它的文档。到目前为止我尝试做的是:
exports.sendEmailVerification = functions.auth.user().onCreate(event => {
return user.sendEmailVerification()
});
但是我收到用户未定义的错误。
如何创建这个功能?
谢谢!
有两种方法可以向用户发送“电子邮件验证”电子邮件:
sendEmailVerification()
方法。auth.generateEmailVerificationLink()
)并且您通过您自己发送的电子邮件发送此链接机制。所有这些都在后端完成,并且可以在云函数中完成。请注意,管理 SDK 的第二个选项与客户端 SDK 的第一个选项并不完全相同:在第二个选项中,您需要通过自己的机制发送电子邮件,而在第一种情况下,电子邮件由Firebase 平台
如果您希望将这种功能添加到 Admin SDK 中,我建议您提交功能请求。
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));
});
// 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);
}
};
// 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()
})
此端点将返回完整的用户对象并将验证电子邮件发送给用户。
我希望这有帮助。
首先查看 Firebase 的文档此处。
当注册阶段完成并成功时,异步触发以下函数:
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 验证用户。
如何确定用户是否验证了他们的电子邮件?
private void checkEmail() {
FirebaseUser user = FirebaseAuth.getInstance().getCurrentUser();
if (user.isEmailVerified()) {
// email verified ...
} else {
// error : email not verified ...
}
}
遗憾的是,您可能无法自定义验证电子邮件的内容/正文(我一直在与 Firebase 进行大量通信,以提供替代的看起来不那么丑陋的模板)。您可以更改标题或消息发件人 ID,但仅此而已。
除非您将您的应用程序重新链接到您自己支持的 Web,否则不会。 这里。
自 2018 年 11 月 19 日发布 Node.js Admin SDK 6.2.0 版以来,可以在云函数中通过 auth.generateEmailVerificationLink()
云函数示例,该示例展示了如何从云函数发送电子邮件。
但是
export async function verifyEmail(apiKey : string, accessToken : string) {
// Create date for POST request
const options = {
method: 'POST',
url: 'https://www.googleapis.com/identitytoolkit/v3/relyingparty/getOobConfirmationCode',
params: {
key: apiKey
},
data: {
requestType : "VERIFY_EMAIL",
idToken : accessToken
}
};
return await processRequest(options); //This is just to fire the request
}
注册后,将访问令牌传递给此方法,它应该向注册用户发送一封邮件。
apiKey:是 Firebase 控制台项目设置的“常规”选项卡中列出的“Web API 密钥” 访问令牌:当前用户的访问令牌(我在内部使用注册休息API,因此可以选择请求令牌作为响应)