在Firebase中创建会话后,为什么要注销?

时间:2020-04-27 18:20:11

标签: javascript firebase firebase-authentication firebase-admin

我正在查看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认为该用户已注销,但是您的服务器为该用户建立了活动会话。

有人可以对此有任何见识吗?

1 个答案:

答案 0 :(得分: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一样保存),并在将来的请求中发送到服务器,并且可以verified with the Firebase Admin SDK。如果这不是您要尝试的操作,则此文档页面与您无关。

稍后发生的签出仅是仪式性的。如上面的评论所述:

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

登出将向代码的读者明确说明,其想法是使用存储在cookie中的令牌,而不是Firebase Auth自己的持久性(再次在上面被禁用)。