oauth2.0 即使用户尚未注销,firebase也会返回空用户

jhkqcmku  于 2023-03-17  发布在  其他
关注(0)|答案(1)|浏览(161)

我使用的是“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。
我不知道为什么它只工作了几天。

rwqw0loc

rwqw0loc1#

Firebase Authentication自动缓存ID令牌,然后在其过期前约5分钟在后台刷新。
这看起来很像你在这里尝试做的事情。据我所知,你的令牌10到期前的强制刷新应该永远不会触发,也不会完成任何事情。
您应该能够在需要令牌的代码中调用getIdToken()(或getIdToken(false)),而不是实现自己的过期/刷新机制。

相关问题