我已经阅读了文档,并有一个 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 返回的用户可能是也可能不是数据库“数据”列中包含的“护照”对象。唔。我需要确保它是吗?用户可能是数据库中的整行。