我正在使用带有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);
});
});
答案 0 :(得分:1)
您有两种选择:
为了实现持久会话,您可以使用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身份验证等