You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何借助Firebase Auth自动发送密码重置邮件?

完整实现Firebase Auth密码重置流程(含「无法登录」组件)

一、添加「忘记密码」UI组件

在现有登录页面中增加重置密码入口,点击后显示邮箱输入表单:

<!-- 登录页的忘记密码触发链接 -->
<p><a href="#forgot-password" id="forgot-password-link">无法登录?重置密码</a></p>

<!-- 忘记密码表单(默认隐藏) -->
<div id="forgot-password-form" style="display:none;">
  <h3>重置密码</h3>
  <input type="email" id="reset-email" placeholder="输入注册邮箱">
  <button id="send-reset-btn">发送重置链接</button>
  <p id="reset-feedback"></p>
</div>

二、前端触发密码重置邮件(用Web SDK简化流程)

无需使用Admin SDK搭建SMTP,直接调用Firebase Web SDK的sendPasswordResetEmail方法,Firebase会自动发送重置邮件:

先确保已初始化Firebase(和登录页配置一致):

import { initializeApp } from "firebase/app";
import { getAuth, sendPasswordResetEmail } from "firebase/auth";

// 你的Firebase配置,从控制台复制
const firebaseConfig = {
  apiKey: "YOUR_API_KEY",
  authDomain: "YOUR_AUTH_DOMAIN",
  projectId: "YOUR_PROJECT_ID",
  // 其他配置项
};

const app = initializeApp(firebaseConfig);
const auth = getAuth(app);

绑定表单交互逻辑:

// 显示/隐藏忘记密码表单
document.getElementById('forgot-password-link').addEventListener('click', (e) => {
  e.preventDefault();
  document.getElementById('forgot-password-form').style.display = 'block';
});

// 发送重置链接按钮事件
document.getElementById('send-reset-btn').addEventListener('click', async () => {
  const email = document.getElementById('reset-email').value;
  const feedback = document.getElementById('reset-feedback');
  
  try {
    await sendPasswordResetEmail(auth, email);
    feedback.textContent = '重置链接已发送至你的邮箱,请查收';
    feedback.style.color = 'green';
  } catch (error) {
    // 处理错误(如邮箱未注册、格式错误等)
    feedback.textContent = error.message;
    feedback.style.color = 'red';
  }
});

三、实现密码重置页面(处理邮件链接)

创建reset-password.html页面,处理用户点击重置链接后的逻辑,补全文档中缺失的函数:

<!DOCTYPE html>
<html>
<head>
  <title>重置密码</title>
</head>
<body>
  <div id="reset-form">
    <h3>设置新密码</h3>
    <input type="password" id="new-password" placeholder="输入新密码">
    <button id="confirm-reset-btn">确认重置</button>
    <p id="status-text"></p>
  </div>

  <script type="module">
    import { initializeApp } from "firebase/app";
    import { getAuth, confirmPasswordReset } from "firebase/auth";

    // Firebase初始化
    const firebaseConfig = {
      apiKey: "YOUR_API_KEY",
      authDomain: "YOUR_AUTH_DOMAIN"
    };
    const app = initializeApp(firebaseConfig);
    const auth = getAuth(app);

    // 实现URL参数获取函数
    function getParameterByName(name, url = window.location.href) {
      name = name.replace(/[\[\]]/g, '\\$&');
      const regex = new RegExp(`[?&]${name}(=([^&#]*)|&|#|$)`);
      const results = regex.exec(url);
      if (!results) return null;
      if (!results[2]) return '';
      return decodeURIComponent(results[2].replace(/\+/g, ' '));
    }

    // 处理密码重置逻辑
    function handleResetPassword(auth, actionCode, continueUrl) {
      const passwordInput = document.getElementById('new-password');
      const confirmBtn = document.getElementById('confirm-reset-btn');
      const statusText = document.getElementById('status-text');

      confirmBtn.addEventListener('click', async () => {
        const newPassword = passwordInput.value;
        try {
          await confirmPasswordReset(auth, actionCode, newPassword);
          statusText.textContent = '密码重置成功!即将返回登录页...';
          statusText.style.color = 'green';
          // 跳转回登录页(或指定的continueUrl)
          setTimeout(() => {
            window.location.href = continueUrl || '/login.html';
          }, 2000);
        } catch (error) {
          statusText.textContent = error.message;
          statusText.style.color = 'red';
        }
      });
    }

    // 页面加载时解析URL参数
    document.addEventListener('DOMContentLoaded', () => {
      const mode = getParameterByName('mode');
      const actionCode = getParameterByName('oobCode');
      const continueUrl = getParameterByName('continueUrl');

      if (mode === 'resetPassword' && actionCode) {
        handleResetPassword(auth, actionCode, continueUrl);
      } else {
        document.getElementById('reset-form').innerHTML = '<p>无效的重置链接,请重新申请</p>';
      }
    });
  </script>
</body>
</html>

四、可选:自定义邮件模板

若需修改重置邮件的内容/样式,可直接在Firebase控制台「Authentication」→「模板」中编辑「密码重置」模板,无需自行搭建邮件服务。

内容的提问来源于stack exchange,提问作者Epimetheus14

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.18 12:07:52