【问题标题】:Firebase redirect user to a page after clicking verification link点击验证链接后,Firebase 将用户重定向到页面
【发布时间】:2018-04-29 23:05:14
【问题描述】:

我在 Ionic 的网络应用程序中使用 firebase,我想在用户单击验证电子邮件中的链接后将用户重定向到特定页面(在我的情况下为登录页面)。
目前,当用户点击验证链接时,他会被重定向到另一个浏览器页面,上面显示他已经确认了电子邮件。

我想将他直接重定向到我的网络应用程序的页面,而无需通过该确认。
有可能吗?

【问题讨论】:

  • 你能解决这个问题吗?谢谢

标签: javascript firebase ionic-framework web-applications


【解决方案1】:

这是帮助我的代码。我只是为你提供你需要的必要代码你必须自己填写其余代码?。

Firebase v9 示例

import React from "react";
import {
  createUserWithEmailAndPassword,
  sendEmailVerification
} from "@firebase/auth";
import {useHistory} from "react-router-dom"

export default function SignUp() {
  const history = useHistory()
  async function submit(e) {
    e.preventDefault() // Prevent default.

    // Sign your user using createUserWithEmailAndPassword

    // Provide user's email and password
    await createUserWithEmailAndPassword(email, password);

    // Send verification email.
    await sendEmailVerification(userCredentials.user);

    let interval = setInterval(async() => {
      if (userCredentials.user.emailVerified) {
        clearInterval(interval);
        history.push("/desired-link");
      }
      await userCredentials.user.reload();
    }, 2000);
  }
  return < > { /* your sign up form */ } < />;
}

Firebase v8 代码:

import React from "react";
import firebase from "firebase"
import {useHistory} from "react-router-dom"

export default function SignUp() {
    const history = useHistory()
    async function submit(e) {
        e.preventDefault() // Prevent default.
        
        // Sign your user using createUserWithEmailAndPassword
        
        // Provide user's email and password
        let userCredentials = await firebase.auth.createUserWithEmailAndPassword(email, password);

        // Send verification email.
        await userCredentials.user.sendEmailVerification()

        let interval = setInterval(async () => {
            if (userCredentials.user.emailVerified) {
                clearInterval(interval);
                history.push("/desired-link");
            }
           await  userCredentials.user.reload();
        }, 2000);
    }
    return <>{/* your sign up form */}</>;
}

用户一点击验证链接,就会发现你的网页重定向到&lt;domain.name&gt;/desired-link

但是,给你一个额外的提示...... 不要操纵操作 url。 这是因为这样做,firebase.auth.currentUser.emailVerified 将始终返回 false。意思是,用户电子邮件永远不会被验证。这是因为此操作 URL 负责电子邮件验证。所以,不要这样做,而是按照我的例子。这适用于 localhost 和您的自定义域。快乐编码?

【讨论】:

  • 很好的解决方案!虽然我认为v9 reload 应该是reload(user)。也许你错过了await
【解决方案2】:

是的,这是可能的。在左侧的 firebase.console 中查找“身份验证”。 然后找到“模板”并寻找“电子邮件地址验证”。我认为它是默认打开的。在模板上你会看到一个小铅笔,点击它。之后,您可以根据需要更改模板。在底部,您会找到“自定义操作 URL”链接。打开此链接,将您的 URL 粘贴到模式窗口中并保存。就是这样。

【讨论】:

  • 您好,感谢您的回答。问题是我目前正在本地开发应用程序,因此我无法使用特定 URL 重定向到我的页面,因为所有页面都位于 localhost:8100。有解决办法吗?
  • 我认为一开始你不应该专注于电子邮件验证后重定向用户等细节,这只是插入一个 URL 并完成。但如果你真的想,你可以免费找到任何服务器和域名,上传你的项目并插入你正在使用的域或服务器的 URL。
  • @R.Rasco 在这种情况下我是否必须手动验证用户的电子邮件。似乎是这样。我认为人们正在寻找一种解决方案,让 firebase 自动验证电子邮件,然后重定向到他们的应用程序页面
  • @Swapnil 不,您不必这样做。当用户点击验证链接时,他就认可了他自己并且可以使用该应用程序,而无需您的任何交互。
【解决方案3】:

不幸的是,您不能让 Firebase 进行身份验证然后重定向。目前对此接受的答案是一半。通过进入“Firebase -> 身份验证 -> 模板 -> 电子邮件地址验证 -> 编辑(又名铅笔按钮)”。然后,您可以单击“自定义操作 URL”并在此处插入所需的任何 URL。

请注意您输入的此 URL 不会在执行电子邮件验证后将您重定向到该页面。它所做的只是不生成链接&lt;firebase email verification link&gt;?mode=verifyEmail&amp;oobCode=&lt;code&gt;,而是将您定向到&lt;link you put in&gt;?mode=verifyEmail&amp;oobCode=&lt;code&gt;。这意味着当用户登陆此页面时,您将必须自己处理电子邮件验证。这意味着解析查询参数,并将此信息发送到后端的 Firebase 以验证有问题的电子邮件。有关如何验证电子邮件地址的潜在信息,请参阅以下内容:https://firebase.google.com/docs/reference/rest/auth#section-confirm-email-verification

更多信息可以在这里找到:https://support.google.com/firebase/answer/7000714

【讨论】:

    【解决方案4】:

    我无法在这里找到任何解决方案。因此,在查找文档后,我发现您在电子邮件验证后添加了一个继续 URL,firebase 在确认后将重定向到该 URL。 https://firebase.google.com/docs/auth/web/passing-state-in-email-actions

    验证电子邮件后,如果您在 firebase 规则中使用 email_verified,您可能还必须强制刷新 firebase 令牌。

    你可以做我做的。

    1. 通过ActionCodeSettings 发送电子邮件验证。
      auth.createUserWithEmailAndPassword(email, password)
      .then((res) => {
        res.user.sendEmailVerification({
          url: "https://example.com/path?confirm_email=true",
        });
        return createUser({ email, uid: res.user.uid, name });
      })
    

    这将使 firebase 在电子邮件验证后重定向到 https://example.com/path?confirm_email=trueconfirm_email 是为了让我知道何时强制刷新 firebase 令牌。

    (可选)

    1. 一旦重定向到您想要的页面,您可以检查 confirm_email 参数并相应地强制刷新令牌。
    const urlParams = new URLSearchParams(window.location.search);
    const isConfirmingEmail = urlParams.get('confirm_email');
    
    
    auth.currentUser.getIdToken(!!isConfirmingEmail).then(() => {
      // Refreshed Token
    })
    

    【讨论】:

    • 有效!这正是我一直在等待的解决方案。谢谢!
    • 虽然发送 ActionCodeSettings 是提供“继续”URL 的解决方案。依靠查询参数(此处为确认电子邮件)来检查“确认电子邮件”状态是一个危险信号,因为任何人都可以在 URL 中发送该参数。而是在客户端使用“user.emailVerified”来检查电子邮件是否已通过验证。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-11-21
    • 1970-01-01
    • 1970-01-01
    • 2019-07-24
    • 2014-10-06
    相关资源
    最近更新 更多