“而不是 express-session,我使用的是 cookie-session,因为我是初学者。”
使用 cookie session 不会让任何人成为初学者。如果要存储大数据,请使用 express-session,因为它将数据存储在数据库或 redis 中,保留该数据的数据库 id,因此当它收到请求时,获取具有该 id 的数据库并比较请求证书。另一方面,cookie-session 在用户浏览器的 cookie 中最多存储 4kb 的数据,并且由于使用 passport.js 的 cookie 中只存储了 user-id,因此通常使用 cookie session。
passport.serializeUser(
(user, done ) => {
done(null, user.id); // stores the id<4kb
}
);
当客户端授权您的应用程序时,谷歌将响应发送到您的回调 url。
app.get("/auth/google/callback", passport.authenticate("google"))
passport.authenticate() 将调用 req.login() 这是passport.user
生成的地方。req.login() 将启动 serializeUser() 确定用户的哪些数据应存储在会话中。
passport:{user:userId}
现在这个对象将被分配给req.session
。所以我们会有req.session.passport.user
每次向服务器发出请求时,浏览器都会自动检查是否有与该服务器相关的 cookie 集,如果有,它会自动将 cookie 附加到请求中。如果您使用基于令牌的身份验证,则必须在每次发出请求时手动附加 cookie 来请求。Cookie 只是一种传输媒介,你存储数据和移动数据,你甚至可以将令牌存储在 cookie 中。Cookie 不仅仅与身份验证有关。如果您有服务器端项目,则必须设置 cookie。(这只是一个侧节点)。
“我对cookie-session的理解是,它每次都会发送一个session ID,这个ID可以在需要的时候用来查找数据库。”
到目前为止,我解释了会话是如何创建的。现在当用户提出请求时会发生什么?在 app.js 文件中,您应该有两个中间件。
app.use(passport.initialize());
app.use(passport.session());
app.use(passport.initialize())
这个函数检查是否req.session.passport.user
存在,如果存在,它将调用passport.session()。如果它在会话中找到一个序列化的用户对象,它会认为这个 req 是经过身份验证的。然后将调用 deserializeUser()。它将检索用户并将其附加到 req.user