在Firebase云函数中生成撤销电子邮件更改链接

2hh7jdfx  于 2023-11-21  发布在  其他
关注(0)|答案(2)|浏览(117)

如何生成链接来撤销firebase云函数中的电子邮件更改?
因此,当用户更改其电子邮件地址时,我希望生成一个链接,以包含在自动电子邮件中,供他们单击以撤消此电子邮件更改。Firebase在电子邮件更改时发送电子邮件,但我希望能够使用自己的代码自己完成此操作。
目前,我可以找到一些方法可以生成一个链接来更改用户密码,验证电子邮件等,但是,我找不到一个方法,我可以用来生成一个链接来撤销电子邮件更改时,用户更改他们的电子邮件。

kuuvgm7e

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电子邮件页面,请调用另一个验证此令牌的函数。

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令牌无法重用。

ttp71kqs

ttp71kqs2#

在为Firebase编写Cloud Functions时,使用Admin Node.js SDK。
AFAIK这是不可能的,与此管理SDK,生成一个电子邮件操作链接来撤销电子邮件更改,因为我们可以做的,例如,电子邮件验证与generateEmailVerificationLink()方法.
你需要自己建立一个机制。你可能需要在某个地方保存(例如,在Firestore中)之前的电子邮件并暴露HTTP端点以触发操作(HTTPS云函数?调用Firestore REST API?)。在任何情况下,您都必须检查主叫用户的身份(通过checking the Firebase ID token作为HTTP请求的授权标头中的承载令牌或通过专用的Firestore安全规则)。
你的问题中没有足够的细节来理解你完整用例的确切流程(即从请求更改电子邮件到撤销有效更改的操作)并提出合理的方法。

相关问题