Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/413.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/shell/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 签出页面签出用户_Javascript_Firebase_Firebase Authentication - Fatal编程技术网

Javascript 签出页面签出用户

Javascript 签出页面签出用户,javascript,firebase,firebase-authentication,Javascript,Firebase,Firebase Authentication,我检查用户是否登录到我的web应用的唯一方法是在前端使用以下内容 firebase.auth().onAuthStateChanged(function(user) { if (user) { // User is signed in. } else { // No user is signed in. } }); 然而,我有一个云函数,我使用它来处理付款,它看起来如下 app.post("/payment", function (req, re

我检查用户是否登录到我的web应用的唯一方法是在前端使用以下内容

firebase.auth().onAuthStateChanged(function(user) {
  if (user) {
    // User is signed in.
  } else {
    // No user is signed in.
  }
});
然而,我有一个云函数,我使用它来处理付款,它看起来如下

app.post("/payment", function (req, res) {
  const orderId = new Date().getTime();
  mollieClient.payments
    .create({
      amount: {
        value: req.body.amount.amount,
        currency: req.body.amount.currency,
      },
      description: req.body.description,
      //redirectUrl: `http://localhost:5500/project/order.html?id=${orderId}`,
      redirectUrl: `https://......web.app/order.html?id=${orderId}`, 
      webhookUrl: .....
    })
    .then((payment) => {
      res.send({
        redirectUrl: payment.getCheckoutUrl(),
      });
      return payment.getCheckoutUrl();
    })
我的问题是关于重定向URL,重定向到订单页面应该显示有关该订单的信息,但它不显示任何内容,因为我设置只有登录用户才能看到它。我的问题是为什么它会注销用户。我尝试重定向到“localhost”和“部署的firebase应用程序的URL”,在这两种情况下,它都会注销用户。我凭直觉认为Firebase会将身份验证信息存储到本地存储中,因为我可以进入我想要的任何页面,而无需登录。但我认为这里的情况并非如此。我没有使用任何
let token=result.credential.accessToken
token来跟踪身份验证状态。这里的问题是什么?我应该如何继续

这是订购页

function getOrderDetails() {
  const url = new URL(window.location.href);
  let orderId = url.searchParams.get("id");
  firebase.auth().onAuthStateChanged(function (user) {
    if (user) {
      console.log("User logged in " + user);
      firebase
      .firestore()
      .doc(`orders/${orderId}`)
      .get()
      .then((doc) => {
        let orderSelected = {
          category: doc.data().category,
          delivery: doc.data().delivery,
          description: doc.data().description,
          price: doc.data().price,
          title: doc.data().title,
          quantity: doc.data().quantity,
        };
     // set textContent of divs
     } else {
       console.log("User not logged in " + user);
     }
  });
}

getOrderDetails();

在新页面上,恢复用户凭据需要时间,因为可能需要调用服务器。因此,使用
null
调用您的
onAuthStateChanged()
侦听器是正常的,并且仅在调用之后才使用实际用户调用。因此,您必须以处理初始
null
的方式处理流,例如,在假定用户会话未恢复之前等待几秒钟


或者,您可以自己在本地存储中存储一个标记值,以指示最近已登录,然后在下一页上使用该标记值来假设还原将成功。

Firebase身份验证默认情况下将用户的身份验证凭据保留到本地存储,并在新页上还原这些凭据。你能展示你的新页面的代码,以及它如何使用当前用户的重定向代码吗?@FrankvanPuffelen我的重定向代码很大,但它都是从调用
firebase.auth().onAuthStateChanged()
如果(用户)
然后从Firestore检索数据并显示信息开始的,但是在那里执行
else
,不显示任何内容。如果只有
console.log(“用户未登录”+用户)打印,而另一个日志从未打印,则Firebase无法恢复用户身份验证状态。您是如何登录用户的?您是在什么平台上运行此代码的?我不太了解此问题的替代解决方案,您在下一页中所说的
标记值
还原
是什么意思?关于第一个建议,我使用了
设置超时()
等待几秒钟,以便正确恢复用户,但没有任何成功。请你详细说明一下答案好吗?让我们把重点放在第一个解决方案上,而不是另一个。您能否显示您的
onAuthStateChanged
侦听器,例如记录它所获得的状态,以及您所做的
setTimeout
?我已经更新了问题,我只是尝试调用
getOrderDetails()
两次,间隔几秒钟,但两次之间都会为用户显示
null
。您不应调用
firebase.auth().onAuthStateChanged(函数(用户){
多次。调用它一次就足以附加一个侦听器,当身份验证状态更改时,该侦听器将被重新调用。如果只调用一次,则应获得两个日志输出。第一次应为
控制台.log(“用户未登录”+用户);
,第二次应为
控制台.log(“用户登录”+“用户”;
。如果没有出现这种情况,请更新您的问题以包含您确实获得的输出。