除了 Passport.js 之外,为什么还要使用 cookie-session?

vai*_*avS 5 node.js express passport.js express-session cookie-session

到目前为止我对passport.js的理解是passport.js序列化用户对象并每次向客户端发送一个ID。我才刚刚开始,如果这是一个愚蠢的问题,我很抱歉:

我之所以express-session使用 ,是cookie-session因为我是初学者。我对cookie-session的理解是每次都会发送一个session ID,需要的时候可以用这个ID去查数据库。

现在,我不明白为什么我们不能只使用passport.js ID?为什么我们还需要使用cookie-session呢?另外,(这可能有点不相关,但是)基于会话的身份验证和基于令牌的身份验证之间的区别是共享的 ID 是动态的,还是每次都在变化?2020 年这仍然是标准且现代的做法吗?

Yil*_*maz 6

“因为我是初学者,所以我没有使用 Express-Session,而是使用 Cookie-Session。”

使用 cookie session 并不会让任何人成为初学者。如果要存储大数据,请使用express-session,因为它将数据存储在数据库或redis中,保留该数据的数据库id,因此当它收到请求时,使用该id获取数据库并比较请求证书。另一方面,cookie-session 在用户浏览器的 cookie 中存储最多 4kb 的数据,并且由于护照.js 仅将 user-id 存储在 cookie 中,因此通常使用 cookie session。

passport.serializeUser(
  (user, done ) => {
    done(null, user.id); // stores the id<4kb
  }
);
Run Code Online (Sandbox Code Playgroud)

当客户端授权您的应用程序时,谷歌会将响应发送到您的回调网址。

app.get("/auth/google/callback", passport.authenticate("google"))
Run Code Online (Sandbox Code Playgroud)

Passport.authenticate() 将调用 req.login() 这是passport.user生成的地方。req.login() 将启动serializeUser(),它确定用户的哪些数据应存储在会话中。

 passport:{user:userId}
Run Code Online (Sandbox Code Playgroud)

现在这个对象将被分配给req.session. 所以我们会有req.session.passport.user

每次当您向服务器发出请求时,浏览器都会自动检查是否有与该服务器相关的 cookie 设置,如果有,它会自动将 cookie 附加到请求中。如果您使用基于令牌的身份验证,则每次发出请求时都必须手动附加 cookie 来请求。Cookie只是传输媒介,你可以存储数据并移动数据,你甚至可以将令牌存储在cookie中。Cookie 不仅仅与身份验证相关。如果你有服务器端项目,你必须设置cookie。(这只是一个侧面节点)。

“我对cookie-session的理解是,它每次都会发送一个会话ID,需要的时候可以用这个ID来查找数据库。”

到目前为止,我解释了会话是如何创建的。现在,当用户发出请求时会发生什么?在 app.js 文件中,您应该有两个中间件。

app.use(passport.initialize());
app.use(passport.session());
Run Code Online (Sandbox Code Playgroud)

app.use(passport.initialize())该函数检查是否req.session.passport.user存在,如果存在则调用passport.session()。如果它在会话中找到序列化的用户对象,它将认为该请求已通过身份验证。然后 deserializeUser() 将被调用。它将检索用户并将其附加到 req.user


mab*_*224 2

您不需要使用会话。这完全取决于你。只需放入{session: false}路线即可。你不需要写passport.serializeUserpassport.deserializeUsercookie-session将cookie放在客户端系统上,每次请求时都会发送它。Passportjs 搜索该 cookie 并运行 deserializeUser 将其转换为对象并将其附加到请求对象。

express-session在服务器上存储会话数据;它只在 cookie 中保存会话标识符,而不是会话数据。其中 ascookie-session基本上用于轻量级会话应用程序。它允许您将会话数据存储在 cookie 中,但位于客户端 [浏览器] 内。仅当会话数据相对较小且易于编码为原始值时才使用它请参阅此问题以获取更多理解

const express = require('express');
const { Router } = express;
const router = new Router();
router
  .get('/', passport.authenticate('google', { session: false }))
Run Code Online (Sandbox Code Playgroud)