【问题标题】:Why would you want to sign out after creating a session in Firebase?为什么要在 Firebase 中创建会话后退出?
【发布时间】:2020-04-27 18:20:11
【问题描述】:

我正在查看 Firebase 身份验证文档 here,特别是此代码示例,用于创建会话的客户端代码:

firebase.auth().signInWithEmailAndPassword('user@example.com', 'password').then(user => {
  // Get the user's ID token as it is needed to exchange for a session cookie.
  return user.getIdToken().then(idToken = > {
    // Session login endpoint is queried and the session cookie is set.
    // CSRF protection should be taken into account.
    // ...
    const csrfToken = getCookie('csrfToken')
    return postIdTokenToSessionLogin('/sessionLogin', idToken, csrfToken);
  });
}).then(() => {
  // A page redirect would suffice as the persistence is set to NONE.
  return firebase.auth().signOut();
}).then(() => {
  window.location.assign('/profile');
});

这里的第一部分很有意义——登录并创建一个会话。但是中间的then 调用signOut——什么?你为什么想这么做?在文档中此代码之前有一条注释:

成功后,应从客户端存储中清除状态。

不清楚该评论是否指的是signOut 调用。不太确定为什么要这样做,无论哪种方式......然后firebase认为用户已退出,但您的服务器有该用户的活动会话。

有人能对此有所了解吗?

【问题讨论】:

    标签: javascript firebase firebase-authentication firebase-admin


    【解决方案1】:

    该示例中有一行代码对上下文很重要:

    // As httpOnly cookies are to be used, do not persist any state client side.
    firebase.auth().setPersistence(firebase.auth.Auth.Persistence.NONE);
    

    在禁用持久性的情况下,没有保存的登录状态。当页面重新加载、重定向或以某种方式离开时,用户实际上会被注销,因为他们的令牌不会被记住。整个示例的重点是展示如何将该令牌放入 cookie 中,该 cookie 将像通常的 cookie 一样被持久化,并且还会在将来的请求中发送到服务器,并且可以是 verified with the Firebase Admin SDK。如果这不是你想要做的,那么这个文档页面是不相关的。

    稍后发生的signOut只是仪式性的。正如上面的评论所说:

    页面重定向就足够了,因为持久性设置为 NONE。

    退出将是对代码读者的明确说明,即该想法是使用存储在 cookie 中的令牌,而不是在 Firebase Auth 自己的持久性中(同样,上面已禁用)。

    【讨论】:

    • 哦,我想我现在明白了。如果我没有手动实现会话,我没有意识到 Firebase 内置了对持久性的支持。我其实根本不需要这样做,Firebase 的持久性足以满足我的需求。所以这整件事实际上基本上是可选的,仅适用于项目需要对会话进行更多控制的情况,而那段代码是为了强调我们正在禁用 Firebase 的持久性。酷。
    猜你喜欢
    • 1970-01-01
    • 2015-03-11
    • 1970-01-01
    • 2023-04-05
    • 2021-07-06
    • 1970-01-01
    • 2015-01-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多