为啥除了 passport.js 还要使用 cookie-session?

Posted

技术标签:

【中文标题】为啥除了 passport.js 还要使用 cookie-session?【英文标题】:Why use cookie-session in addition to passport.js?为什么除了 passport.js 还要使用 cookie-session? 【发布时间】:2020-11-03 18:36:06 【问题描述】:

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

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

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

【问题讨论】:

【参考方案1】:

“我使用的是 cookie-session,而不是 express-session,因为我是初学者。”

使用 cookie 会话不会使任何人成为初学者。如果要存储大数据,请使用 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

【讨论】:

【参考方案2】:

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

express-session在服务器上存储会话数据;它只将会话标识符保存在 cookie 中,而不是会话数据。 其中cookie-session 基本上用于轻量级会话应用程序。它允许您将会话数据存储在 cookie 中,但在客户端 [浏览器] 中。仅在会话数据相对较小且易于编码为原始值时使用它See this question for more understanding

const express = require('express');
const  Router  = express;
const router = new Router();
router
  .get('/', passport.authenticate('google',  session: false ))

【讨论】:

1.我想使用会话。 2、cookie-session不需要使用passport.js。 Passport.js 发送它自己的 cookie。我认为这不能回答问题。

以上是关于为啥除了 passport.js 还要使用 cookie-session?的主要内容,如果未能解决你的问题,请参考以下文章

无法使用 Passport.js 和 Express 4 访问 req.user

Hello.js 与 Passport.js?

passport.js 使用sails.js 验证弹出窗口

为啥JS中数值类型已经可以使用Number方法,还要引入Number对象概念?

如何正确使用 Passport.js?

如何在 passport-facebook / Passport.js 中捕获 FacebookAuthorizationError?