Node.js 使用passport ldapauth npm的LDAP身份验证
我正在尝试使用passport ldapauth npm验证openLDAP用户名和密码。当执行下面的代码时,我总是得到如下错误:Node.js 使用passport ldapauth npm的LDAP身份验证,node.js,ldap,passport.js,openldap,Node.js,Ldap,Passport.js,Openldap,我正在尝试使用passport ldapauth npm验证openLDAP用户名和密码。当执行下面的代码时,我总是得到如下错误: {消息:“缺少凭据”}。请帮助我我的代码有什么问题 var connect = require('connect'), app = connect(), passport = require('passport'), LdapStrategy = require('passport-ldapauth'); // Credentials fr
{消息:“缺少凭据”}
。请帮助我我的代码有什么问题
var connect = require('connect'),
app = connect(),
passport = require('passport'),
LdapStrategy = require('passport-ldapauth');
// Credentials from the free LDAP test server by forumsys
// More info at: http://www.forumsys.com/tutorials/integration-how-to/ldap/online-ldap-test-server/
var OPTS = {
server: {
url: 'ldap://<ip>',
bindDn: '<admin username>',
bindCredentials: '<admin password>',
usernameField: "<passing actual username>",
passwordField: "<password>"
}
};
passport.use(new LdapStrategy(OPTS));
app.use(passport.initialize());
app.use(connectRoute(function (router) {
router.post('/login', function (req, res, next) {
passport.authenticate('ldapauth', {session: false}, function (err, user, info) {
console.log(info);
if (err) {
return next(err); // will generate a 500 error
}
// Generate a JSON response reflecting authentication status
if (!user) {
return res.send({success: false, message: 'authentication failed'});
}
return res.send({success: true, message: 'authentication succeeded'});
})(req, res, next);
});
}))
app.listen(8080);
var connect=require('connect'),
app=connect(),
passport=require('passport'),
LdapStrategy=require('passport-ldapauth');
//forumsys提供的来自免费LDAP测试服务器的凭据
//更多信息,请访问:http://www.forumsys.com/tutorials/integration-how-to/ldap/online-ldap-test-server/
变量选项={
服务器:{
url:'ldap://',
bindDn:“这是我的配置:
var passport = require('passport');
var LdapStrategy = require('passport-ldapauth').Strategy;
var OPTS = {
server: {
url: '<ldap server>',
bindDn: '<admin username>',
bindCredentials: '<admin password>',
searchBase: '<base dn>',
searchFilter: '(sAMAccountName={{username}})'
}
};
passport.use(new LdapStrategy(OPTS));
app.use(passport.initialize());
app.use(passport.session());
passport.serializeUser(function(user, done) {
done(null, user);
});
passport.deserializeUser(function(user, done) {
done(null, user);
});
然后,您可以将LDAP身份验证用作:
app.post('/login', passport.authenticate('ldapauth', {
successRedirect: '/users/profile', failureRedirect: '/login'
}));
根据提供的文档,作为服务器值的对象不包含用户名字段和密码字段。您的策略应如下所示:
var OPTS = {
server: {
url: 'ldap://<ip>',
bindDn: '<admin username>',
bindCredentials: '<admin password>'
},
usernameField: "<field containing username>",
passwordField: "<field containing password>"
};
var选项={
服务器:{
url:'ldap://',
bindDn:“”,
绑定凭据:“”
},
用户名字段:“”,
密码字段:“
};
但是正如G Chen在他的回答中提到的,用户名字段和密码字段是可选的。可能问题不是由passport ldapauth
引起的。您的post请求可能有一些问题。检查是否有[usernameField]
,[passwordField]
在您的请求中,然后再使用passport。身份验证
请检查以下代码,其中必须执行用户的基本身份验证。当必须验证用户登录凭据时,此代码有效
我们需要使用3个字段,即usernameField、passwordField和credentialsLookup
`var basicAuth = require('basic-auth');
var OPTS = {
server: {
url: Constants.LDAP_SERVER_URL_STRING,
bindDn: Constants.LDAP_ADMIN_STRING,
bindCredentials: Constants.LDAP_PASSWORD_STRING,
// searchBase: Constants.LDAP_SEARCHBASE_STRING,
// searchFilter: Constants.LDAP_SEARCHFILTER_STRING
// reconnect: true
},
usernameField: username,
passwordField: password,
credentialsLookup: basicAuth
};
像Userbooster light这样的LDAP管理工具对于理解身份验证过程是如何发生的非常有用
searchBase、searchFilter等字段没有任何用处。但免责声明是,您需要进行测试,以确定其是否正确请使用“LDAP身份验证”检查NPM
您将遇到一个名为ldapauth fork的包。该包似乎工作正常
请检查以下链接请勿在DN中使用管理员用户名或密码。如果要验证用户身份,只需用户自己的用户名和密码即可
dn
是LDAP中的绑定dn。根据LDAP服务器配置的不同,它会有所不同。请使用ldapsearch
进行实验,以确定应该使用哪一个
我基于passport ldapauth编写了一个npm模块,以简化ldap身份验证登录。请访问:
简单用法:
LdapAuth.init(CONFIG.ldap.dn, CONFIG.ldap.url, app,
(id) => User.findOne({ uid: id }).exec(),
(user) => User.findOneAndUpdate({ uid: user.uid }, user, { upsert: true, new: true }).exec()
)
将ldapauth fork/lib/ldapauth.js bindProperty从dn更改为upn:
this.opts.bindProperty | |(this.opts.bindProperty='userPrincipalName')
导致用户名身份验证。
不需要完整的dn。在浪费了很多时间之后,我终于能够修复它。我的一些发现
{{username}}
替换只在searchFilter上发生。我是在searchBase上进行的
确保您的请求正文已存档用户名
和密码
,并且您使用了正确的正文解析器
,否则将无法提取passport
由于passport没有显示任何错误,所以它会以静默方式失败,请在库的两个位置添加调试器
在ldapauth.js
搜索ldapauth.prototype.authenticate
中,您可以看到ldapauth能够提取密码/用户名
在strategy.js
搜索ldap.authenticate
中,您可以看到实际错误是什么
您的OPTS对象中的值是否与上面显示的值相同,或者您是否为此帖子删除了这些值?@HeadCode我已经删除了此帖子的实际值我也在查看passport ldapauth,但我认为只有在您真正了解如何使用它的情况下,文档才是好的。您可以查看此帖子:。首先,看起来您提供的是用户名和密码,而您应该只提供这些内容的表单字段名。@HeadCode根据中给出的文档,我尝试了Express示例,该示例给出了错误“缺少凭据”我没有时间深入研究这个问题,但我真的很想知道你是否找到了解决方案。如果找到了,请发布它!“我的程序使用默认值username和password。如果设置了username字段
,你需要将searchFilter修改为(sAMAccountName={}})
或(uid={}})
你能举个例子吗?例如,如果我搜索用户“test”,那么username字段
应该是“test”吗?@Heathcliff No、usernameField
和passwordField
是登录表单字段的名称。如果您的登录页面HTML包含例如
,您将usernameField
设置为weirdusernamefield
。用户输入用户名(例如test
)该策略知道如何查找weirdusernamefield
值,然后将该值用于LDAP搜索和绑定
var basicAuth = require('basic-auth');
var LdapAuth = require('ldapauth-fork');
var username: string = req.body.username;
var password: string = req.body.password;
var ldap = new LdapAuth({
url: Constants.LDAP_SERVER_URL_STRING,
bindDN: Constants.LDAP_BIND_DN_STRING,
bindCredentials: Constants.LDAP_PASSWORD_STRING,
searchBase: 'uid=' + username + ',' + Constants.LDAP_SEARCHBASE_STRING,
searchFilter: Constants.LDAP_SEARCHFILTER_STRING
// reconnect: true
});
ldap.authenticate(username, password, function(err, user) {
if (err) {
console.log("login Error");
res.send({ success : false, message : 'authentication failed' });
} else if(!user.uid) {
console.log("user not found Error");
res.send({ success : false, message : 'authentication failed' });
} else if(user.uid) {
console.log("success : user "+ user.uid +" found ");
}
});
LdapAuth.init(CONFIG.ldap.dn, CONFIG.ldap.url, app,
(id) => User.findOne({ uid: id }).exec(),
(user) => User.findOneAndUpdate({ uid: user.uid }, user, { upsert: true, new: true }).exec()
)