Javascript 签出页面签出用户
我检查用户是否登录到我的web应用的唯一方法是在前端使用以下内容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
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(“用户登录”+“用户”;
。如果没有出现这种情况,请更新您的问题以包含您确实获得的输出。