我该如何正确地使用带有password_ldapauth的会话?

时间:2018-09-04 18:52:00

标签: node.js express passport.js ldapauth

我已经阅读了文档,并拥有一个expressjs应用程序,该应用程序使用passport_ldapauth和会话来处理登录和注销端点。使用sequelize将会话存储到数据库,将仅包含sessionID,过期,路径和域的cookie存储到浏览器。

我现在正在尝试保护其他端点。在控制台中,我可以看到首先按下了反序列化程序,然后将正确的查询发送到数据库的会话表,并通过正确的会话ID查找我的用户并找到了它。

但是随后-调用了password_ldapauth,并且由于没有密码,所以我收到了“缺少凭据”的简短消息,并返回了400。

我认为这是kav在他的第二条评论(https://github.com/vesse/passport-ldapauth/issues/53)中所指的,但没有得到答案。

也许我正在使这个复杂化吗?一旦用户登录其他路由,是否应该仅切换到“会话”策略(如果存在)而不是“ ldapauth”?还是应该起作用,不是吗?还是我只是做错了什么?

这是有问题的路线:

    f.writelines([l.decode for l in text.split('\n')])
TypeError: a bytes-like object is required, not 'str'

我还需要什么才能提供帮助?

也许我的序列化器或反序列化器不好?它们似乎适用于登录/注销端点。参见下文:

api.post('/role/add', passport.authenticate(
    'ldapauth', {session: true, failureFlash: true}
  ), (req, res, next) => {
    Roles.create(req.body).then(
      role => res.json(role)
    ).catch(err => {
      if (err) {
        console.log(err);
        next(err);
      }
    });
  });

请注意,从Active Directory返回的用户对象是ENORMOUS,这就是为什么我要用最少的用户名和sessionID重写整个内容。我不确定,但是我认为findOne返回的用户可能是数据库的“数据”列中包含的“护照”对象,也可能不是。嗯我需要确保它吗?用户可能是数据库中的整个行。

1 个答案:

答案 0 :(得分:0)

这很简单,但是在正式文档中我找不到任何地方。因此,对于那些难以获得护照的人,这就是我的发现。

req.isAuthenticated()

只需在路由上方或在单独的文件中编写您自己的中间件功能,如下所示:

const unAuthMsg = 'You are not authorized for this endpoint.';

export const ensureAuthenticated = (req, res, next) => {
  if (req.isAuthenticated()) {
    next();
  } else {
    res.status(401).json({"message": unAuthMsg});
  }
};

然后按如下所示在您的路线中使用它:

api.post('/role/add', ensureAuthenticated, (req, res, next) => {
Roles.create(req.body).then(role => {
  return res.json(role)
}).catch(err => {
  if (err) {
    console.log(err);
    next(err);
  }
});
  });

就是这样。