ExpressJS / PassportJS:身份验证与会话

时间:2014-03-05 01:29:31

标签: node.js session cookies express passport.js

我开始使用NodeJS(和网络编程),并且无法理解身份验证和会话。我阅读了很多教程,当我认为我有它时,我感到困惑。我的问题是处理身份验证(注册/登录)和持久会话。

我正在使用PassportJS,经过多次教程之后,我想我终于找到了一个很棒的教程:https://scotch.io/tutorials/easy-node-authentication-setup-and-local

但现在我很困惑如何通过serializeUser和deserializeUser处理会话。请耐心等待我这个新手问题,但我的理解是用户ID用于跟踪会话。

所以我的问题是:

  1. 用户ID是由Passport自动生成的吗?
  2. 序列化只是将用户ID添加到会话cookie?
  3. 最后,如何更改会话参数,例如maxAge?我应该在哪里设置它们?我对Express会话和Passport会话感到困惑。
  4. 如果有人可以提供指向赞赏的好教程的链接。

    谢谢。

2 个答案:

答案 0 :(得分:7)

Passport不直接管理您的会话,它只是使用您的会话。因此,您将根据您使用的中间件配置会话的生命周期。使用express自己的cookie中间件,例如:

  app.use(express.session({ cookie: { maxAge: 60000 }}));

就Passport而言,它不会生成任何内容。它调用您的身份验证,序列化和反序列化函数来查找,加载和重新加载用户数据。流程是这样的:

 passport.use(<new Strategy>(function(username,password,done) { }))

这接受登录表单提交,其中包含用户名和密码值,并将其传递到您的实现中。通常,数据库查找会生成传递给done(err,user)函数的用户对象(基于您的模型/实现)。

现在您已经找到了一个User对象,它将被设置到请求对象上,但这只适用于该请求。会话用于序列化用户(通常是用户对象的ID),以便可以再次传入它以重新构建用户。

 my.serializeUser = function(user,done)

这是Passport传递您找到的User对象的函数。这是你构造该用户的String表示并将其传递给done(err,string)的地方,无论你传递什么,因为第二个参数与会话一起存储。

 my.deserializeUser = function(string,request,done)

这是您的函数,其中密钥(由serializeUser创建)传递给您。然后,您的代码使用它来检索完整的User对象(可能是该用户ID的数据库查询),并将完整的用户对象传回done(err,user)。这再次设置为处理程序的请求。

所以由您决定如何序列化,反序列化和验证。 Passport提供了钩子,因此您可以使用相同的方法在路径上设置身份验证要求。

答案 1 :(得分:2)

我可以给你一些链接来更好地理解它。关键是要编写更好的代码,你必须看到更好的代码。 这个link from AirPair CEO带来了急需的清晰度,尤其是最后一部分,因为我们现在都使用Express 4 第二个是这个toon.io。这个真的打开了我很多。我仍然不清楚许多事情,一旦我得到更多的清晰度将添加它。 人们在他们的教程中没有提到的一件事是,在生产环境中你不能使用Express的传统数据存储。显然表达还需要维护一个表,它使用一个名为Memory Store的东西。要使用您自己的会话商店,请参阅here

希望它有所帮助。

相关问题