我使用的是“firebase”:“^8.2.0”在我的react项目中。
当用户登录时,我将令牌存储在本地存储中,在对后端进行任何API调用之前,我检查用户的到期时间,并根据该时间返回令牌。如果令牌过期,我将调用firebase.auth().onAuthStateChanged((userAuth) => {}))
获取新用户,并再次将令牌存储在本地存储中。
下面是我的代码:
import firebase from "firebase/app";
import "firebase/auth";
import "firebase/firestore";
import jwt_decode from "jwt-decode";
import {firebaseConfig} from "./config.js"
// Initialize Firebase
firebase.initializeApp(firebaseConfig);
export const auth = firebase.auth();
export const getToken = (cb, val) =>
new Promise((reslove, reject) => {
const token = localStorage.getItem("token");
if (token) {
const decoded = jwt_decode(token);
const expiration_time = decoded.exp * 1000;
var currentTime = new Date().getTime();
//checking if token is expiring in 10s
if (expiration_time - currentTime > 10000) {
reslove(token)
return;
}
}
firebase.auth().onAuthStateChanged((userAuth) => {
console.log("userAuth",userAuth);
console.log("refresh token ", userAuth?.refreshToken);
if (userAuth)
userAuth
.getIdToken(/* forceRefresh */ true)
.then(function (idToken) {
localStorage.setItem("token", idToken);
reslove(idToken);
})
.catch(function (error) {
reject()
});
});
})
export default firebase;
此流的一切工作正常,但几天后,如果用户尝试登录,则userAuth将变为null,因为令牌为null。
我不知道为什么它只工作了几天。
1条答案
按热度按时间rwqw0loc1#
Firebase Authentication自动缓存ID令牌,然后在其过期前约5分钟在后台刷新。
这看起来很像你在这里尝试做的事情。据我所知,你的令牌10到期前的强制刷新应该永远不会触发,也不会完成任何事情。
您应该能够在需要令牌的代码中调用
getIdToken()
(或getIdToken(false)
),而不是实现自己的过期/刷新机制。