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

如何使Firebase sendSignInLinkToEmail生成的链接仅单次有效?

问题:Firebase sendSignInLinkToEmail 链接无法单次使用?

我在React应用里用Firebase的sendSignInLinkToEmail给新用户发邀请邮件,用户能收到邮件,但链接在使用后不会失效。已经在actionCodeSettings里设置了singleUse: true和oneTimeCode: true,但完全没效果,想要实现链接仅可首次使用。

我的实现代码:

const sendLoginLink = (email) => {
  const actionCodeSettings = {
    url:
      "http://localhost:3000/auth/sign-up?email=" + encodeURIComponent(email),
    handleCodeInApp: true,
    // Expire the link after first use
    // This is achieved by setting the singleUse and oneTimeCode options to true
    singleUse: true,
    oneTimeCode: true,
    dynamicLinkDomain: "my email",
    // Set the email subject
    // This is optional
    emailSubject: "invitation from my app",
    // Set the email body
    // This is optional
    emailBody: "please click the this link to sign up into the account",
  };

  firebase
    .auth()
    .sendSignInLinkToEmail(email, actionCodeSettings)
    .then(() => {
      // The link was successfully sent
      console.log("link send successfully");
    })
    .catch((error) => {
      // Handle the error
      console.log(`link send unsuccessfully ${error}`);
    });
};

可行解决方案

  • 修正dynamicLinkDomain配置:你当前填的"my email"是错误的,这个字段需要填写Firebase控制台中已配置的动态链接域名(格式类似xxx.page.link)。域名配置错误会导致Firebase的单次使用规则无法生效。
  • 确保链接处理逻辑正确:前端打开链接后,必须调用firebase.auth().signInWithEmailLink(email, window.location.href)完成身份验证流程。只有完成这个调用,Firebase才会标记该链接为已使用;若仅打开页面不执行验证,链接不会失效。
  • 移除冗余参数:singleUse和oneTimeCode是同一功能的新旧命名,同时设置可能引发冲突,只需保留singleUse: true即可。
  • 升级Firebase SDK版本:旧版本SDK可能存在singleUse参数兼容性问题,建议升级firebase/auth到最新稳定版。

修正后的示例代码

const sendLoginLink = (email) => {
  const actionCodeSettings = {
    url: `http://localhost:3000/auth/sign-up?email=${encodeURIComponent(email)}`,
    handleCodeInApp: true,
    singleUse: true,
    dynamicLinkDomain: "xxx.page.link", // 替换为你的Firebase动态链接域名
    emailSubject: "invitation from my app",
    emailBody: "please click the link to sign up into the account",
  };

  firebase
    .auth()
    .sendSignInLinkToEmail(email, actionCodeSettings)
    .then(() => {
      console.log("link sent successfully");
    })
    .catch((error) => {
      console.log(`link send unsuccessfully ${error}`);
    });
};

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.26 21:17:05