【发布时间】:2021-08-19 22:59:16
【问题描述】:
我想要实现的目标
已登录或注册的用户一小时后不应重新登录。一小时的限制来自firebase身份验证,如果没有阻止(我试图完成的事情)。
问题
在用户通过 firebase 身份验证 (signInWithEmailAndPassword) 登录后,我总是会得到 null for currentUser 和 onAuthStateChanged。
我尝试了什么
我正在通过“创建 React 应用程序”使用 React (v17.0.2)。在服务器端,我使用的是 NodeJS (v12)。两者之间的通信是使用 axios (v0.21.1) 完成的
首先,我尝试将存储在 localStorage 中的令牌(来自 firebase(服务器端))发送回服务器。但是服务器告诉我,令牌不再有效。服务器端代码如下:
module.exports = (request, response, next) => {
let idToken;
if (request.headers.authorization && request.headers.authorization.startsWith('Bearer ')) {
idToken = request.headers.authorization.split('Bearer ')[1];
console.log("idToken:", idToken);
} else {
console.error('No token found');
return response.status(403).json({ error: 'Unauthorized' });
}
admin
.auth()
.verifyIdToken(idToken)
.then((decodedToken) => {
console.log('decodedToken', decodedToken);
request.user = decodedToken;
return db.collection('users').where('userId', '==', request.user.uid).limit(1).get();
})
.catch((err) => {
console.error('Error while verifying token', err);
return response.status(403).json(err);
});
};
之后我在客户端尝试了以下代码。
handleSubmit = () => {
const userData = {
email: this.state.email,
password: this.state.password
};
axios
.post(firestoreUrl() + '/login', userData)
.then((resp) => {
console.log("token:", resp.data); //here I get a valid token
localStorage.setItem('AuthToken', `Bearer ${resp.data.token}`);
console.log("firebase.auth().currentUser:", firebase.auth().currentUser); //but this is null
})
.then((data) => {
console.log(data);
console.log("firebase.auth().currentUser:", firebase.auth().currentUser); //still null
})
.catch((error) => {
console.log("Error:", error);
});
};
让我恼火的是,我从 firebase(服务器端)获得了一个令牌,然后将该令牌存储在 localStorage(客户端)中,但 firebase 然后告诉我 currentUser 为空。但大概它们并不相互依赖=/。
我可以访问我的应用程序中的所有安全网站。我可以注销并重新登录。但无论我做什么 currentUser 都是空的。
我还尝试在componentDidMount()-method 中运行上面的代码。但没有成功。
我从link 尝试了一种方法(希望它应该是这样),但它没有奏效。如果我实现以下代码,currentUser 和 onAuthStateChanged 仍然会得到 null。
firebase.auth().onAuthStateChanged(user => {
if (user) {
console.log("state = definitely signed in")
}
else {
console.log("state = definitely signed out")
}
})
我总是登录到控制台,用户“肯定已退出”。
在研究过程中,我注意到我应该尝试获取 currentUser-Status 的点有点棘手。所以我想一个解决方案是在另一个/正确的地方实现 currentUser-code。在这里我很挣扎=/。
【问题讨论】:
-
经过进一步调查,我发现如果我在服务器端运行
signInWithEmailAndPassword函数,我会坚持这个问题。但是如果我在客户端运行它,我会从onAuthStateChanged获得一个用户对象。现在,我想知道为什么。如果我希望登录功能保留在服务器端,我应该如何处理这种情况。 -
或者最好在客户端执行
signInWithEmailAndPassword?
标签: node.js reactjs firebase firebase-authentication