Express:使用Passport使用会话进行身份验证

时间:2015-03-16 06:41:17

标签: express passport.js

我正在使用带有Node.js的Express 4 - 我已成功实施Passport以使用用户名/密码进行身份验证。但是如何通过会话信息让Passport进行身份验证呢?

如何创建自定义Passport策略以获取会话信息并将其与特定用户的信息进行比较?

我正在寻找:

passport.use(new SessionStrategy(function(req,res,done){
  if(req.session blah blah blah){
???
   }
});
);

我真的不知道最好的办法是什么。也许我将用户的最新会话信息存储在后端数据库中。因此,我没有找到具有用户名的用户,而是找到了具有sessionid的用户?

一个答案似乎如下:

这是将session-id放入cookie并在用户返回时检索数据的代码。无需策略。

passport.serializeUser(function(user, done) {
  done(null, user.id);
});

passport.deserializeUser(function(id, done) {
  User.findById(id, function (err, user) {
    done(err, user);
  });
});

2 个答案:

答案 0 :(得分:1)

您有两种选择:

  1. 使用持久会话商店
  2. JSON Web令牌
  3. 为了实现持久会话,您可以使用MongoDB会话存储或Redis会话存储。

    如果您想使用redis,请使用connect-redis npm包。如果您想将MongoDb用作会话存储,请使用connect-mongo npm包

    您需要在app.js / server.js中进行一些设置。在我的一个演示中,我使用带有PassportJS的Redis会话存储,如果您正在寻找示例,请随意查看here

    如果您想使用JSON Web令牌,可以使用许多不同的实现。我正在使用jsonwebtoken。我在前端使用PassportJS,ExpressJS和AngularJS实现了这一点。例如,查看here。使用密钥对令牌进行编码并存储在浏览器的本地存储器中。

    我建议您使用JSON网络令牌,详细阅读,因为这是大多数主要网络应用程序的开发方式。

    我的两个例子都是工作原型。如果您需要更多帮助,请告诉我。

答案 1 :(得分:1)

执行此操作的理想方法是在会话中存储用户ID(或者提及@NarendraSoni的JWT)。主要的想法是在会话中存储尽可能少的有用信息,因为您应该像对待每个人一样公开对待它。

例如,如果您只存储用户ID,那么每次收到请求(例如req.session.userId)时,您都可以简单地执行数据库查询以按ID检索该用户。

这很快(特别是如果你使用像memcached或redis这样的服务器端缓存),并且导致很少的延迟。它也是安全的,并防止将用户信息泄露给浏览器。

如果您正在寻找一种更简单的方法来处理应用中的这些内容,您可能需要查看我的身份验证库:express-stormpath。它完成所有这些开箱即用,非常安全,并提供了许多帮助实用程序,以帮助您加快速度:您可以将自定义数据存储在帐户(如mongo)中,您可以根据权限限制用户,您可以做API身份验证等