我正在尝试在用户创建后发送验证电子邮件。由于 Firebase 本身没有提供此功能,因此我正在尝试使用云函数来实现。
我真的找不到太多关于它的文档。目前我所尝试的是:
exports.sendEmailVerification = functions.auth.user().onCreate(event => {
return user.sendEmailVerification()
});
但是我收到了"user未定义"的错误提示。
我该如何创建这个函数呢?
谢谢!
我正在尝试在用户创建后发送验证电子邮件。由于 Firebase 本身没有提供此功能,因此我正在尝试使用云函数来实现。
我真的找不到太多关于它的文档。目前我所尝试的是:
exports.sendEmailVerification = functions.auth.user().onCreate(event => {
return user.sendEmailVerification()
});
但是我收到了"user未定义"的错误提示。
我该如何创建这个函数呢?
谢谢!
有两种方法向用户发送“电子邮件验证”电子邮件:
sendEmailVerification()
方法。auth.generateEmailVerificationLink()
)生成电子邮件验证链接 并且 通过您自己的机制发送此链接的电子邮件。所有这些都在后端完成,并且可以在Cloud Function中完成。请注意,使用Admin SDK的第二种选项与使用Client SDK的第一种选项不完全相同:在第二种选项中,您需要通过自己的机制发送电子邮件,而在第一种情况下,Firebase平台会自动发送电子邮件。
如果您希望将此功能添加到Admin SDK中,我建议您提交一个功能请求。sendVerificationEmailToUser(uid)
方法。我尝试着澄清一下,但如果您有更好的措辞,请编辑一下(因为现在还很早)。 - Frank van Puffelenconst 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()
})
此端点将返回完整的用户对象,并向用户发送验证电子邮件。
希望这可以帮到您。
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")
}
}
});
}
private void checkEmail() {
FirebaseUser user = FirebaseAuth.getInstance().getCurrentUser();
if (user.isEmailVerified()) {
// email verified ...
} else {
// error : email not verified ...
}
}
除非您使用自己支持的Web重新链接应用程序。在这里。
auth.generateEmailVerificationLink()
方法在Cloud Function中生成电子邮件验证链接。如果您想让Admin SDK来完成这个任务,目前除了生成电子邮件验证链接并使用自己的电子邮件传递系统发送之外,没有其他选项。
您可以编写一个云函数上的REST请求,并以此方式启动电子邮件验证邮件。
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
}