如何生成链接来撤销firebase云函数中的电子邮件更改?因此,当用户更改其电子邮件地址时,我希望生成一个链接,以包含在自动电子邮件中,供他们单击以撤消此电子邮件更改。Firebase在电子邮件更改时发送电子邮件,但我希望能够使用自己的代码自己完成此操作。目前,我可以找到一些方法可以生成一个链接来更改用户密码,验证电子邮件等,但是,我找不到一个方法,我可以用来生成一个链接来撤销电子邮件更改时,用户更改他们的电子邮件。
kuuvgm7e1#
当用户更改电子邮件时,您可以在Firestore中存储一个文档,其中包含他们的旧电子邮件,令牌和一些元数据(如果需要)。也就是说,您应该仅使用Admin SDK从Cloud功能或您的服务器更新用户的电子邮件,因为电子邮件更改没有触发器。
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电子邮件页面,请调用另一个验证此令牌的函数。
[YOUR_DOMAIN]
/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令牌无法重用。
eventId
ttp71kqs2#
在为Firebase编写Cloud Functions时,使用Admin Node.js SDK。AFAIK这是不可能的,与此管理SDK,生成一个电子邮件操作链接来撤销电子邮件更改,因为我们可以做的,例如,电子邮件验证与generateEmailVerificationLink()方法.你需要自己建立一个机制。你可能需要在某个地方保存(例如,在Firestore中)之前的电子邮件并暴露HTTP端点以触发操作(HTTPS云函数?调用Firestore REST API?)。在任何情况下,您都必须检查主叫用户的身份(通过checking the Firebase ID token作为HTTP请求的授权标头中的承载令牌或通过专用的Firestore安全规则)。你的问题中没有足够的细节来理解你完整用例的确切流程(即从请求更改电子邮件到撤销有效更改的操作)并提出合理的方法。
generateEmailVerificationLink()
2条答案
按热度按时间kuuvgm7e1#
当用户更改电子邮件时,您可以在Firestore中存储一个文档,其中包含他们的旧电子邮件,令牌和一些元数据(如果需要)。也就是说,您应该仅使用Admin SDK从Cloud功能或您的服务器更新用户的电子邮件,因为电子邮件更改没有触发器。
字符串
将
[YOUR_DOMAIN]
替换为您网站的URL。一旦用户访问您网站的/revert-change-email
电子邮件页面,请调用另一个验证此令牌的函数。型
您可以更改JWT令牌的寿命,即URL的有效期。您可以在jwt.io上阅读更多关于JWT的信息。额外的
eventId
令牌只是为了防止JWT令牌无法重用。ttp71kqs2#
在为Firebase编写Cloud Functions时,使用Admin Node.js SDK。
AFAIK这是不可能的,与此管理SDK,生成一个电子邮件操作链接来撤销电子邮件更改,因为我们可以做的,例如,电子邮件验证与
generateEmailVerificationLink()
方法.你需要自己建立一个机制。你可能需要在某个地方保存(例如,在Firestore中)之前的电子邮件并暴露HTTP端点以触发操作(HTTPS云函数?调用Firestore REST API?)。在任何情况下,您都必须检查主叫用户的身份(通过checking the Firebase ID token作为HTTP请求的授权标头中的承载令牌或通过专用的Firestore安全规则)。
你的问题中没有足够的细节来理解你完整用例的确切流程(即从请求更改电子邮件到撤销有效更改的操作)并提出合理的方法。