如何检测用户是否已登录Firebase?

时间:2016-06-17 05:16:30

标签: javascript web firebase firebase-authentication

我在我的javascript文件中使用firebase节点api进行Google登录。

firebase.initializeApp(config);
let provider = new firebase.auth.GoogleAuthProvider();
firebase.auth().signInWithPopup(provider);

此工作正常,用户可以使用他的Google凭据登录。当用户再次访问该页面时,弹出窗口再次打开,但由于他已经登录,弹出窗口关闭而不需要用户进行任何交互。有没有办法在提示弹出窗口之前检查是否已经有登录用户?

10 个答案:

答案 0 :(得分:64)

https://firebase.google.com/docs/auth/web/manage-users

您必须添加身份验证状态更改观察器。

firebase.auth().onAuthStateChanged(function(user) {
  if (user) {
    // User is signed in.
  } else {
    // No user is signed in.
  }
});

答案 1 :(得分:54)

您还可以检查是否有 currentUser

var user = firebase.auth().currentUser;

if (user) {
  // User is signed in.
} else {
  // No user is signed in.
}

答案 2 :(得分:12)

在这种情况下,无需使用onAuthStateChanged()函数。

您可以通过执行以下命令轻松检测用户是否已登录:

var user = firebase.auth().currentUser;

对于那些面临“返回null”问题的人来说,这只是因为你没有等待firebase调用完成。

假设您在页面A上执行登录操作,然后调用页面B,在页面B上,您可以调用以下JS代码来测试预期的行为:

  var config = {
    apiKey: "....",
    authDomain: "...",
    databaseURL: "...",
    projectId: "..",
    storageBucket: "..",
    messagingSenderId: ".."
  };
  firebase.initializeApp(config);

    $( document ).ready(function() {
        console.log( "testing.." );
        var user = firebase.auth().currentUser;
        console.log(user);
    });

如果用户已登录,那么“var user”将包含预期的JSON有效负载,否则,它将只是“null”

这就是你所需要的。

此致

答案 3 :(得分:7)

不可能告诉用户在页面开始加载时是否签名,但是可以解决。

  

您可以将上次身份验证状态存储到localStorage ,以在会话之间和选项卡之间持久保存该身份。

然后,当页面开始加载时,您可以乐观地假设用户将自动重新登录并推迟对话框直到确定(即在onAuthStateChanged触发之后)。否则,如果localStorage键为空,则可以立即显示对话框。

firebase onAuthStateChanged事件将在页面加载后大约 2秒触发。

// optimistically assume user will be logged in automatically
// e.g. if (!!localStorage.getItem('myPage.expectSignIn')) showDialog()

firebase.auth().onAuthStateChanged(user => {
  if (user) {
    localStorage.setItem('myPage.expectSignIn', '1')
  } else {
    localStorage.removeItem('myPage.expectSignIn')
    // Implement logic to trigger the login dialog here or redirect to sign-in page.
    // e.g. showDialog()
  }
})



我在反应反应路由器中使用它。我将上面的代码放入了我的App根组件的componentDidMount中。那里,在渲染中,我有一些PrivateRoutes

<Router>
  <Switch>
    <PrivateRoute
      exact path={routes.DASHBOARD}
      component={pages.Dashboard}
    />
...

这是我的PrivateRoute的实现方式:

export default function PrivateRoute(props) {
  return firebase.auth().currentUser != null
    ? <Route {...props}/>
    : localStorage.getItem('myPage.expectSignIn')
      // if user is expected to sign in automatically, display Spinner, otherwise redirect to login page.
      ? <Spinner centered size={400}/>
      : (
        <>
          Redirecting to sign in page.
          { location.replace(`/login?from=${props.path}`) }
        </>
      )
}

    // Using router Redirect instead of location.replace
    // <Redirect
    //   from={props.path}
    //   to={{pathname: routes.SIGN_IN, state: {from: props.path}}}
    // />

答案 4 :(得分:2)

另一种方法是使用与Firebase相同的东西。

例如,当用户登录时,firebase将以下详细信息存储在本地存储中。 当用户返回页面时,firebase使用相同的方法来确定是否应自动登录用户。

enter image description here

ATTN:因为Firebase既未列出也不建议这样做。您可以将此方法称为非正式方法。这意味着,如果firebase稍后更改其内部工作,则此方法可能不起作用。或总之。使用风险自负! :)

答案 5 :(得分:1)

这在 2019

中有效
async function IsLoggedIn(): Promise<boolean> {
  try {
    await new Promise((resolve, reject) =>
      app.auth().onAuthStateChanged(
        user => {
          if (user) {
            // User is signed in.
            resolve(user)
          } else {
            // No user is signed in.
            reject('no user logged in')
          }
        },
        // Prevent console error
        error => reject(error)
      )
    )
    return true
  } catch (error) {
    return false
  }
}

答案 6 :(得分:0)

如果您允许匿名用户以及使用电子邮件登录的用户,则可以使用firebase.auth().currentUser.isAnonymous,它将返回truefalse

答案 7 :(得分:0)

从技术上讲,Promise 有 3 种可能性:

// 1) best option, as it waits on user...

const isLoggedIn: any = await new Promise((resolve: any, reject: any) =>
this.afa.onAuthStateChanged((user: any) =>
  resolve(user), (e: any) => reject(e)));

console.log(isLoggedIn);

// 2) may experience logging out state problems...

const isLoggedIn2 = await this.afa.authState.pipe(first()).toPromise();

console.log(isLoggedIn2);

// 3) technically has a 3rd option 'unknown' before user is loaded...

const isLoggedIn3 = await this.afa.currentUser;

console.log(isLoggedIn3);


// then do something like (depending on your needs) with 1, 2, or 3:

if (!!isLoggedIn) {
  // logged in
}

另请注意,该示例是有角度的,但您可以将 this.afa 替换为 firebase.auth()

答案 8 :(得分:-2)

使用Firebase.getAuth()。它返回Firebase客户端的当前状态。否则返回值为null以下是文档:https://www.firebase.com/docs/web/api/firebase/getauth.html

答案 9 :(得分:-4)

首先导入以下内容

import Firebase
import FirebaseAuth

    // Check if logged in
    if Auth.auth().currentUser == nil {
      // Do smth if user is not logged in   
    }