iT邦幫忙

2025 iThome 鐵人賽

DAY 23
0
Modern Web

不只是登入畫面!一起打造現代化登入系統系列 第 23

寄送 Firebase Email 驗證信(Email Verification)

  • 分享至 

  • xImage
  •  

Firebase 提供了現成的 Email 驗證機制,能在使用者註冊後寄出一封驗證信,使用者點擊信中的連結後,就能正式啟用帳號。這能有效防止假帳號與垃圾註冊。


一、為什麼要做 Email 驗證?

Email 驗證的好處:

  • 確保帳號屬於真實使用者
  • 防止機器人註冊(bot spam)
  • 可作為「找回密碼」或「安全通知」的基礎
  • 提升專案的專業性與安全感

二、在 Firebase 啟用 Email 驗證

登入 Firebase Console
→ Authentication → Templates
你會看到「Email verification」範本。
這裡可以自訂信件內容、標題、logo、語系等。

Firebase 寄信使用內建的 mail server,不需額外設定 SMTP!


三、寄送驗證信 (sendEmailVerification)

Firebase SDK 提供了 sendEmailVerification(user) 函式,
可以在使用者註冊成功(sign up)後立即寄信。

import { getAuth, createUserWithEmailAndPassword, sendEmailVerification } from "firebase/auth";

export const signUpAndSendEmail = async (email, password) => {
  const auth = getAuth();

  try {
    // 建立使用者帳號
    const userCredential = await createUserWithEmailAndPassword(auth, email, password);
    const user = userCredential.user;

    // 寄送驗證信
    await sendEmailVerification(user, {
      url: "https://your-app-domain.com/verify", // 驗證後導向頁
      handleCodeInApp: true, // 可選:在 App 內處理驗證
    });

    console.log("✅ 驗證信已寄出,請至信箱確認!");
    return user;
  } catch (error) {
    console.error("❌ 註冊或寄信失敗:", error.message);
    throw error;
  }
};

React 實際使用範例

假設我們在註冊頁(SignUpPage.jsx)呼叫:

import React, { useState } from "react";
import { signUpAndSendEmail } from "../firebase/authService";

export default function SignUpPage() {
  const [email, setEmail] = useState("");
  const [password, setPassword] = useState("");
  const [message, setMessage] = useState("");

  const handleSubmit = async (e) => {
    e.preventDefault();
    try {
      await signUpAndSendEmail(email, password);
      setMessage("註冊成功!驗證信已寄出,請至信箱確認。");
    } catch (err) {
      setMessage(`錯誤:${err.message}`);
    }
  };

  return (
    <div className="p-4 max-w-md mx-auto">
      <h2 className="text-xl font-bold mb-2">建立帳號</h2>
      <form onSubmit={handleSubmit} className="space-y-3">
        <input
          type="email"
          value={email}
          onChange={(e) => setEmail(e.target.value)}
          placeholder="Email"
          className="w-full p-2 border rounded"
        />
        <input
          type="password"
          value={password}
          onChange={(e) => setPassword(e.target.value)}
          placeholder="Password"
          className="w-full p-2 border rounded"
        />
        <button
          type="submit"
          className="w-full bg-blue-500 text-white py-2 rounded"
        >
          註冊並寄送驗證信
        </button>
      </form>

      {message && <p className="mt-3 text-sm text-gray-600">{message}</p>}
    </div>
  );
}

五、驗證結果檢查

Firebase 會在 user.emailVerified 欄位顯示驗證狀態。
可在登入後檢查:

import { getAuth } from "firebase/auth";

const auth = getAuth();
const user = auth.currentUser;

if (user?.emailVerified) {
  console.log("✅ 已通過 Email 驗證");
} else {
  console.log("⚠️ 尚未驗證 Email");
}

若你想強制未驗證者無法登入,可在後端(或 Redux)中檢查 emailVerified 狀態再允許進入系統。


上一篇
安全再進化[1 / 5 ]:客製化 Firebase 驗證信內容
系列文
不只是登入畫面!一起打造現代化登入系統23
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言