Passport js serializeUser& deserializeUser

时间:2017-10-18 09:52:39

标签: node.js session authentication ldap passport.js

我已阅读论证的所有内容,但仍无法理解。 Passport Js网站上的文档非常模糊。

我正在使用Passport JS和passport-ldapauth策略。 我没有数据库我显然不想在每次请求时点击LDAP服务器。我想首次使用带有LDAP的护照策略在POST /login路由上对用户进行身份验证,将用户存储在会话中以及每个后续请求中我只想检查用户是否已登录。

我正在尝试使用会话,但我无法理解如何使用序列化/反序列化流程的Passport +会话。 我检查的每个示例都在deserializeUser函数中使用User.findOne。

截至目前,我禁用了Passport会话的使用,我正在使用自定义中间件检查是否req.session.user != null。如果是这种情况,则用户已经登录并点击了next()。否则重定向登录。

这是一些代码(为简单起见,我删除了与问题无关的代码):

Passport配置

var express = require('express'),
    session = require('express-session'),
    passport = require('passport'),
    LdapStrategy = require('passport-ldapauth');

var app = express();

var LdapStrategyOptions = {
  server: {
    url: '<url>',
    bindDN: '<dn>',
    bindCredentials: "<pwd>",
    searchBase: '<searchBase>',
    searchFilter: '<filter>'
  }
};
passport.use(new LdapStrategy(LdapStrategyOptions));

app.use(cookieParser());
app.use(session({
  store: new LokiStore({autosave: false}),
  resave: false,
  saveUninitialized: false
  secret: env.get("SESSION_SECRET")
}));

app.use(bodyParser.json());
app.use(bodyParser.urlencoded({ extended: false }));

app.use(passport.initialize());

路线

// LOGIN ROUTE
app.get('/login',
  function(req, res) {
    res.render('login');
});

// LOGIN HANDLER ROUTE
app.post('/login',
  passport.authenticate('ldapauth', { session: false }),
  function(req, res) {
    req.session.userId = req.user.cn;
    req.session.user = {
      "userId": req.user.cn,
      "displayName": req.user.displayName
    };
  res.redirect('/');
});

// LOGOUT ROUTE
app.get('/logout',
  function(req, res) {
    req.session.destroy(function(err) {
      req.logout();
      res.redirect('/');
    });
});

// HOME ROUTE
app.get('/', isLoggedIn, function(req, res) {
   res.render('home');
});

IsLoggedIn Middleware

var isLoggedIn = function(req, res, next) {
  if (req.session.user != null){
    console.log("is auth ok '" + req.session.user.userId +"'");
    return next();
  }

  console.log("redirect to auth/login");
  res.redirect('/auth/login');
}

我错过了什么?我的设置有安全问题吗? 任何帮助表示赞赏。

2 个答案:

答案 0 :(得分:1)

如果您只需要一个ID和一个显示名称,那么将它们保持在会话状态就完全没问题了。您只应在需要更多字段时加载完整的用户配置文件。

答案 1 :(得分:0)

来自passportjs docs:

  

在典型的Web应用程序中,用于验证用户的凭据只会在登录请求期间传输。如果验证成功,将通过用户浏览器中设置的cookie建立和维护会话。

     

每个后续请求都不包含凭据,而是包含标识会话的唯一cookie。为了支持登录会话,Passport将对会话进行序列化和反序列化用户实例。

基本上serializeUser应该返回一个唯一的用户标识符,以便稍后{@ 1}}重新进入JSON。

因此,对于您的实现,您应该按照以下方式执行某些操作:

免责声明:我没有使用LDAP的经验。

deserializeUser