0

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

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

但是随后 - passport_ldapauth 被调用,由于没有密码,我收到一条“缺少凭据”的闪烁消息和 400 返回。

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

也许我让这件事复杂化了?一旦我让用户登录我的其他路线,我是否应该简单地切换到“会话”策略(如果存在)而不是“ldapauth”?或者这应该有效而不是?还是我只是做错了什么?

这是有问题的路线:

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);
      }
    });
  });

为了帮助我,还需要我提供什么?

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

passport.serializeUser(function(user, done) {
    let sessionUser = {
      username: user.sAMAccountName,
      sessionID: user.sessionID
    };
    done(null, sessionUser);
  });
  
passport.deserializeUser(function(user, done) {
    Session.findOne({where: {sid: user.sessionID}}).then(user => {
      return done(null, user);
    });
  });

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

4

1 回答 1

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);
  }
});
  });

就是这样。

于 2018-09-05T18:14:03.850 回答