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