使用passport-ldapauth npm进行LDAP身份验证

use*_*324 5 ldap openldap node.js passport.js

我正在尝试使用passport-ldapauth npm验证openLDAP用户名和密码.执行以下代码时,我总是收到错误 { message: 'Missing credentials' }.请帮助我解决我的代码有什么问题.

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);
Run Code Online (Sandbox Code Playgroud)

有关更多详细信息,请参阅此badRequestMessage flash消息以查找缺少的用户名/密码(默认值:'缺少凭据')

G C*_*hen 7

这是我的配置:

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);
});
Run Code Online (Sandbox Code Playgroud)

usernameFieldpasswordFieldOPTS是可选的.我的程序使用默认值usernamepassword.如果usernameField已设置,则需要修改searchFilter(sAMAccountName={{<usernameField value>}})(uid={{<usernameField value>}}).

此外,为了在会话中存储登录状态,express-session需要模块.会话配置如下:

var session = require('express-session');
app.use(session({
  secret: 'ldap secret',
  resave: false,
  saveUninitialized: true,
  cookie : { httpOnly: true, maxAge: 2419200000 } /// maxAge in milliseconds
}));
Run Code Online (Sandbox Code Playgroud)

然后,您可以将LDAP身份验证用作:

app.post('/login', passport.authenticate('ldapauth', {
  successRedirect: '/users/profile', failureRedirect: '/login'
})); 
Run Code Online (Sandbox Code Playgroud)