如何验证邮箱所属账户是否设置密码,以正确调用sendPasswordResetEmail
实现方案
核心逻辑:调用sendPasswordResetEmail前先校验目标邮箱对应的账户是否设置过独立密码,校验可通过Auth SDK提供的fetchSignInMethodsForEmail接口完成,该接口无需用户登录即可调用,适配未登录场景的要求。
具体操作步骤
- 先对用户输入的待重置邮箱做基础格式校验
- 调用
fetchSignInMethodsForEmail接口传入目标邮箱,获取该邮箱关联的所有登录方式列表 - 校验返回的登录方式列表:
- 列表包含
password值:说明用户已设置独立密码,正常调用sendPasswordResetEmail发送重置邮件 - 列表仅包含
google.com等第三方登录标识:说明用户无独立密码,直接返回对应业务提示即可
- 列表包含
代码示例(Web端JavaScript)
import { getAuth, fetchSignInMethodsForEmail, sendPasswordResetEmail } from "firebase/auth"; const auth = getAuth(); async function handlePasswordReset(targetEmail) { try { const methodList = await fetchSignInMethodsForEmail(auth, targetEmail); if (methodList.includes('password')) { await sendPasswordResetEmail(auth, targetEmail); // 此处添加发信成功的业务提示 } else { // 此处添加仅支持第三方登录、无需重置密码的业务提示 } } catch (err) { // 处理邮箱未注册、请求频繁等异常情况 } }
补充说明:如果你的项目开启了邮箱枚举保护,
fetchSignInMethodsForEmail不会返回真实的登录方式列表,此时可以改用云函数实现校验:在云函数中调用Admin SDK的getUserByEmail接口查询用户的登录凭证列表,判断是否存在providerId为password的凭证即可,该方案不需要关闭邮箱枚举保护,安全性更高。
内容的提问来源于stack exchange,提问作者bruce lee
相关产品推荐
相关产品推荐

