刷新后,firebase Auth当前用户返回null

Posted

技术标签:

【中文标题】刷新后,firebase Auth当前用户返回null【英文标题】:After refresh, firebase Auth current user returns null 【发布时间】:2020-02-04 07:34:34 【问题描述】:

这是我在个人资料页面上的代码,当我从 AuthService 的登录方法重定向时,这第一次运行良好

const user = firebase.auth().currentUser;
  if (user != null) 
    this.name = user.displayName;
    this.uid = user.uid;
   else 
    this.name = "Unknown";
  

但是,如果我刷新页面或转到任何其他页面并返回此个人资料页面,currentUser 将变为 null。

这是我的身份验证服务代码。

import * as firebase from "firebase/app";
import  auth  from "firebase/app";

      async googleSignin() 
    firebase
      .auth()
      .setPersistence(firebase.auth.Auth.Persistence.LOCAL)
      .then(async () => 
        const provider = new auth.GoogleAuthProvider();
        const credential = await this.afAuth.auth.signInWithPopup(provider);
        this.updateUserData(credential.user);
        this.router.navigate(["/profile"]);
        return;
      );
  

为什么我失去了 currentUser?我什至还添加了 Persistence.LOCAL。

【问题讨论】:

【参考方案1】:

当您导航到新页面时,您正在重新加载 Firebase 身份验证 SDK。此时 Firebase 会自动刷新当前用户的身份验证状态,但这可能需要往返服务器。当你的`firebase.auth().currentUser 运行时,刷新显然还没有完成。

因此,您应该使用onAuthStateChange 来监听更改,如getting the currently signed in user 上的文档所示:

firebase.auth().onAuthStateChanged(function(user) 
  if (user != null) 
    this.name = user.displayName;
    this.uid = user.uid;
   else 
    this.name = "Unknown";
  
);

【讨论】:

谢谢弗兰克。问题是导航到站点的其他页面如何改变身份验证?这会在几秒钟内发生。我错过了什么? 我不确定我是否理解。你能改写一下吗? 我的应用中有三个页面,登录、个人资料和主页。登录页面,登录用户。登录后,我被重定向到个人资料页面。在个人资料页面 ''' const user = firebase.auth().currentUser;上面的代码有效!但是,如果我导航回主页甚至刷新个人资料页面,同一行代码给我的用户 null。我的问题是我们在哪里失去了用户? 加载新页面时,会重新加载 Firebase 身份验证。它会自动刷新当前用户的身份验证状态,但这可能需要往返服务器。当您的firebase.auth().currentUser 运行时,刷新尚未完成,而我的onAuthStateChanged 代码保证在用户令牌刷新后执行您的代码。【参考方案2】:

您还可以将用户数据保存到本地/会话存储中,以防服务/防护由于异步操作而无法及时接收。

【讨论】:

当然可以。但更大的问题是为什么 Auth 状态会发生变化?为什么页面刷新会丢失当前用户? 因为它是后台的服务器调用,它是异步操作,它返回一个承诺,所以你有 ti promise.then() 等待数据到达或使用异步/等待 我的应用中有三个页面,登录、个人资料和主页。登录页面,登录用户。登录后,我被重定向到个人资料页面。在个人资料页面 const user = firebase.auth().currentUser;上面的代码有效!但是,如果我导航回主页甚至刷新个人资料页面,同一行代码给我的用户 null。我的问题是我们在哪里失去了用户?

以上是关于刷新后,firebase Auth当前用户返回null的主要内容,如果未能解决你的问题,请参考以下文章

如何修复 Firebase Auth 仅在刷新后工作?

浏览器刷新后 Nuxt auth 用户重置

Flutter firebase 登录用户在登录后返回 NULL currentUser

Firebase Auth REST API - 使用电子邮件/密码登录不会返回刷新令牌

firebase onAuthStateChanged&Navigation Guards的模式 - Quasar应用程序

Firebase Auth 返回一个神秘的不正确的 uid