Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/37.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Node.js 使用passport ldapauth npm的LDAP身份验证_Node.js_Ldap_Passport.js_Openldap - Fatal编程技术网

Node.js 使用passport ldapauth npm的LDAP身份验证

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

我正在尝试使用passport ldapauth npm验证openLDAP用户名和密码。当执行下面的代码时,我总是得到如下错误:
{消息:“缺少凭据”}
。请帮助我我的代码有什么问题

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()
    )