在 firebase 云函数中生成撤消电子邮件更改 link
Generate undo email change link in firebase cloud functions
如何生成 link 以撤消 firebase 云函数中的电子邮件更改?
因此,当用户更改他们的电子邮件地址时,我想生成一个 link 以包含在自动电子邮件中,以便他们单击以撤消此电子邮件更改。当电子邮件更改时,Firebase 会发送一封电子邮件,但我希望能够使用自己的代码自己执行此操作。
目前,我发现有一些方法可以生成 link 来更改用户密码、验证电子邮件等。但是,我找不到可以用来生成 link 在用户更改电子邮件时撤消电子邮件更改。
编写 Cloud Functions for Firebase 时,使用 Admin Node.js SDK。
据我所知,使用此 Admin SDK 无法生成电子邮件操作 link 来撤消电子邮件更改,但我们可以这样做,例如,使用 [=11 进行电子邮件验证=]方法。
您需要自己构建自己的机制。您可能必须将以前的电子邮件保存在某处(例如在 Firestore 中)并公开一个 HTTP 端点以触发操作(HTTPS 云功能?调用 Firestore REST API?)。在任何情况下,您都必须检查调用用户的身份(通过 checking the Firebase ID token 作为 HTTP 请求授权 header 中的 Bearer 令牌,或通过专用的 Firestore 安全规则)。
你的问题中没有足够的细节来理解你的完整用例的确切流程(即从请求更改电子邮件到撤消有效更改的操作)并提出一个明智的方法。
当用户更改电子邮件时,如果需要,您可以在 Firestore 中存储一个文档,其中包含他们的旧电子邮件、令牌和一些元数据。话虽如此,您应该仅使用 Admin SDK 从云功能或您的服务器更新用户的电子邮件,因为电子邮件更改没有触发器。
import jwt from "jsonwebtoken"
import {v4} from "uuid"
exports.changeEmail = functions.https.onCall(async (data, context) => {
const {newEmail} = data;
const {uid} = context.auth;
// change user's email
// send an email to verify new email is required
// generate a JWT
const token = jwt.sign({ uid, eventId: v4() }, 'jwt_signing_secret', { expiresIn: '24h' });
// add a document in Firestore containing details about this event
await admin.firestore().collection("emailChanges").doc(eventId).set({
uid, changedAt: Date.now()
})
const undoURL = `https://[YOUR_DOMAIN]/revert-email-change?token=${token}`
// E-Mail this URL to user
// Terminate this function
})
替换 [YOUR_DOMAIN]
将您网站的 URL。用户访问您网站的 /revert-change-email
电子邮件页面后,调用另一个函数来验证此令牌。
exports.revertEmailChange = functions.https.onCall((data, context) => {
// pass the token from frontend by checking URL params
const {token} = data
// Verify the token
const decoded = jwt.verify(token, 'jwt_signing_secret');
console.log(decoded)
const {uid, eventId} = decoded
// token is valid
// read the Firestore document using stateId and check old email
const snap = await admin.firestore().collection("emailChanges").doc(eventId).get()
if (!snap.exists) return {error: "Invalid Token"}
const {email} = snap.data()
// use updateUser() method to change email back
// delete that document from Firestore
return {data: "Email changed back successfully"}
});
您可以更改 JWT 令牌的生命周期,即 URL 的有效期。您可以在 jwt.io 阅读更多关于 JWT 的信息。额外的 eventId
令牌只是为了防止 JWT 令牌无法重复使用。
如何生成 link 以撤消 firebase 云函数中的电子邮件更改?
因此,当用户更改他们的电子邮件地址时,我想生成一个 link 以包含在自动电子邮件中,以便他们单击以撤消此电子邮件更改。当电子邮件更改时,Firebase 会发送一封电子邮件,但我希望能够使用自己的代码自己执行此操作。
目前,我发现有一些方法可以生成 link 来更改用户密码、验证电子邮件等。但是,我找不到可以用来生成 link 在用户更改电子邮件时撤消电子邮件更改。
编写 Cloud Functions for Firebase 时,使用 Admin Node.js SDK。
据我所知,使用此 Admin SDK 无法生成电子邮件操作 link 来撤消电子邮件更改,但我们可以这样做,例如,使用 [=11 进行电子邮件验证=]方法。
您需要自己构建自己的机制。您可能必须将以前的电子邮件保存在某处(例如在 Firestore 中)并公开一个 HTTP 端点以触发操作(HTTPS 云功能?调用 Firestore REST API?)。在任何情况下,您都必须检查调用用户的身份(通过 checking the Firebase ID token 作为 HTTP 请求授权 header 中的 Bearer 令牌,或通过专用的 Firestore 安全规则)。
你的问题中没有足够的细节来理解你的完整用例的确切流程(即从请求更改电子邮件到撤消有效更改的操作)并提出一个明智的方法。
当用户更改电子邮件时,如果需要,您可以在 Firestore 中存储一个文档,其中包含他们的旧电子邮件、令牌和一些元数据。话虽如此,您应该仅使用 Admin SDK 从云功能或您的服务器更新用户的电子邮件,因为电子邮件更改没有触发器。
import jwt from "jsonwebtoken"
import {v4} from "uuid"
exports.changeEmail = functions.https.onCall(async (data, context) => {
const {newEmail} = data;
const {uid} = context.auth;
// change user's email
// send an email to verify new email is required
// generate a JWT
const token = jwt.sign({ uid, eventId: v4() }, 'jwt_signing_secret', { expiresIn: '24h' });
// add a document in Firestore containing details about this event
await admin.firestore().collection("emailChanges").doc(eventId).set({
uid, changedAt: Date.now()
})
const undoURL = `https://[YOUR_DOMAIN]/revert-email-change?token=${token}`
// E-Mail this URL to user
// Terminate this function
})
替换 [YOUR_DOMAIN]
将您网站的 URL。用户访问您网站的 /revert-change-email
电子邮件页面后,调用另一个函数来验证此令牌。
exports.revertEmailChange = functions.https.onCall((data, context) => {
// pass the token from frontend by checking URL params
const {token} = data
// Verify the token
const decoded = jwt.verify(token, 'jwt_signing_secret');
console.log(decoded)
const {uid, eventId} = decoded
// token is valid
// read the Firestore document using stateId and check old email
const snap = await admin.firestore().collection("emailChanges").doc(eventId).get()
if (!snap.exists) return {error: "Invalid Token"}
const {email} = snap.data()
// use updateUser() method to change email back
// delete that document from Firestore
return {data: "Email changed back successfully"}
});
您可以更改 JWT 令牌的生命周期,即 URL 的有效期。您可以在 jwt.io 阅读更多关于 JWT 的信息。额外的 eventId
令牌只是为了防止 JWT 令牌无法重复使用。