【问题标题】:Why is 'currentUser' and 'onAuthStateChanged' in firebase always null?为什么firebase中的'currentUser'和'onAuthStateChanged'总是为空?
【发布时间】:2021-08-19 22:59:16
【问题描述】:

我想要实现的目标

已登录或注册的用户一小时后不应重新登录。一小时的限制来自firebase身份验证,如果没有阻止(我试图完成的事情)。

问题

在用户通过 firebase 身份验证 (signInWithEmailAndPassword) 登录后,我总是会得到 null for currentUseronAuthStateChanged

我尝试了什么

我正在通过“创建 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 尝试了一种方法(希望它应该是这样),但它没有奏效。如果我实现以下代码,currentUseronAuthStateChanged 仍然会得到 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


【解决方案1】:

正如我在 SO 上的 similar question 发现的那样,我犯了一个严重的错误。显然,在服务器端执行 signIn 或 createUser 功能并不是一个好主意。这应该在客户端完成。在上面提到的问题中,有一些很好的理由在服务器端这样做,但在我的情况下,在客户端运行它是完全可以的。

感谢 Frank van Puffelen 带路(请参阅上述问题中的一位 cmets)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-06-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-02-26
    • 2020-07-20
    • 2020-07-11
    • 1970-01-01
    相关资源
    最近更新 更多