Firebase JS SDK 中会话令牌的显式更新

IT技术 javascript reactjs firebase firebase-authentication
2021-04-27 22:06:52

我已经使用 Firebase Auth 为多个提供商实现了登录方法,如下所示:

firebase.auth().setPersistence(firebase.auth.Auth.Persistence.LOCAL).then(() => {
  let provider = new firebase.auth.GoogleAuthProvider(); // + facebook, gitHub
  provider.addScope('profile');
  provider.addScope('email');
  firebase.auth().signInWithPopup(provider).then(result => {
    // app logic here

然而,这段代码给了我 60 分钟的持续会话,我想学习如何自动更新当前用户会话而不必每小时登录一次。

我还使用此代码“收听”当前用户会话状态。

firebase.auth().onAuthStateChanged(user => if (!user) //goto LoginPage

但它本身并不“倾听”,它仅在我尝试导航或更新页面时才起作用。所以我不知道如何使用 Firebase 方法在确切的时间量(例如最多 15 分钟)内限制访问。

文档说有一种getIdToken方法,但我无法确定在哪里使用此代码。它应该在到期前每 60 分钟调用一次还是应该在登录时设置?请给出一些提示或任何涵盖这种情况的教程。

编辑:

此外,在一段时间不活动(我认为不到 1 小时)后,我在控制台中收到了此代码:

auth.esm.js:121 POST https://securetoken.googleapis.com/v1/token?key=AIza... 403
2个回答

Firebase 令牌设置为在 60 分钟后过期。然后它会自动为您刷新。没有办法配置过期时间,你不需要在你的前端代码中做任何特殊的事情。

唯一的技巧是,您需要授予您的应用程序 API 密钥使用令牌服务 API 的权限,以便能够在过期后为您创建新的 id 令牌。这是在 GCP 控制台、API 和服务(凭据)中完成的。

所以,代码应该简单如下

  1. 添加用户认证状态变化监听器

    
    fbAuth.onAuthStateChanged(user => {
      if (user) {
        // User is logged in
        // Proceed with your logged in user logic
      } else {
        // USer is not logged in
        // Redirect to the login page
      }
    })
    
  2. 实现登录逻辑

    
    fbAuth.setPersistence(firebase.auth.Auth.Persistence.LOCAL)
     .then(() => {
        return fbAuth.signInWithEmailAndPassword(email, password)
            .then(userCredential => {
                // Login success path
            })
            .catch(error => {
                // Login error path
            });
     })
     .catch(error => {
        // Persistence setting error path
     })
    

您可以在登录前设置身份验证状态持久性,具体取决于您的用例auth-state-persistence

  1. 确保您的应用程序 API 密钥可以访问 GCP 控制台中的令牌服务 API 这是在 GCP 控制台下 | API 和服务 | Credentials 然后编辑您部署环境的相应密钥以授予 API 密钥访问令牌服务 API 的权限。

祝你好运 ;)

你好,首先我要对我的英语不好说抱歉。我不太了解firebase,但我认为如果你写这样的东西它应该可以工作:

firebase.auth().setPersistence(firebase.auth.Auth.Persistence.SESSION).then(() => {
let provider = new firebase.auth.GoogleAuthProvider(); // + facebook, gitHub
provider.addScope('profile');
provider.addScope('email');
firebase.auth().signInWithPopup(provider).then(result => {
// app logic here

我的意思是你应该有 firebase.auth.Auth.Persistence.SESSION insted of LOCAL