我正在查看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认为该用户已注销,但是您的服务器为该用户建立了活动会话。
有人可以对此有任何见识吗?
答案 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自己的持久性(再次在上面被禁用)。