簡體   English   中英

firebase 雲函數中生成undo email 更改鏈接

[英]Generate undo email change link in firebase cloud functions

如何生成鏈接以撤消 firebase 雲功能中的 email 更改?

因此,當用戶更改其 email 地址時,我想生成一個鏈接以包含在自動 email 中,以便他們單擊以撤消此 email 更改。 Firebase 在 email 更改時發送 email,但我希望能夠使用我自己的代碼自己執行此操作。

目前,我發現有一些方法可以生成更改用戶密碼的鏈接,驗證 email 等。但是,我找不到可用於生成鏈接以在用戶更改其 email 時撤消 email 更改的方法.

為 Firebase 編寫 Cloud Functions 時,使用 Admin Node.js SDK。

據我所知,使用此管理員 SDK 生成 email 操作鏈接以撤消 email 更改是不可能的,我們可以這樣做,例如,使用generateEmailVerificationLink()方法進行 email 驗證。

您將需要自己構建自己的機制。 您可能必須將之前的 email 保存在某處(例如在 Firestore 中)並公開一個 HTTP 端點以觸發操作(HTTPS Cloud Function?調用 Firestore REST API?)。 在任何情況下,您都必須檢查調用用戶的身份(通過在 HTTP 請求的授權 header 中檢查 Firebase ID 令牌作為 Bearer 令牌,或通過專用的 Firestore 安全規則)。

您的問題中沒有足夠的細節來理解您的完整用例的確切流程(即從更改 email 的請求到撤消有效更改的操作)並提出明智的方法。

當用戶更改 email 時,您可以在 Firestore 中存儲一個文檔,其中包含他們的舊 email、令牌和一些元數據(如果需要)。 話雖如此,您應該僅使用管理員 SDK 從雲 function 或您的服務器更新用戶的 email,因為電子郵件更改沒有觸發器。

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 email 頁面,調用另一個驗證此令牌的 function。

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 令牌無法重復使用。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM