passport-ldapauth
Passport authentication strategy against LDAP server. This module is a Passport strategy wrapper for ldapauth-fork
Node v0.12
dtrace-provider
issue
Currently the latest released version of ldapjs which this module depends on does not install succesfully on Node v0.12 on Mac (see issue #258) due to old dtrace-provider
dependency. To work around the issue, add dependency to ldapjs
master to your package.json
:
{
"dependencies": {
"ldapjs": "mcavage/node-ldapjs",
"passport-ldapauth": "0.3.0"
}
}
dtrace-provider
is an optional dependency, ie. if you don't need it there's no need to do anything.
SSL issue
This also comes form ldapjs
(see issue #258), and the same workaround solves it.
Microsoft AD LDAP protocol
Error 49 handles much more than just Invalid credentials, partial support for MS AD LDAP has been implemented (see issue #35). Any additional supported data/comments could be added in the future.
Install
npm install passport-ldapauth
Status
![Dependency Status](https://gemnasium.com/vesse/passport-ldapauth.png)
Usage
Configure strategy
var LdapStrategy = require('passport-ldapauth');
passport.use(new LdapStrategy({
server: {
url: 'ldap://localhost:389',
...
}
}));
-
server
: LDAP settings. These are passed directly to ldapauth-fork. See its documentation for all available options.
url
: e.g. ldap://localhost:389
bindDn
: e.g. cn='root'
bindCredentials
: Password for bindDnsearchBase
: e.g. o=users,o=example.com
searchFilter
: LDAP search filter, e.g. (uid={{username}})
. Use literal {{username}}
to have the given username used in the search.searchAttributes
: Optional array of attributes to fetch from LDAP server, e.g. ['displayName', 'mail']
. Defaults to undefined
, i.e. fetch all attributestlsOptions
: Optional object with options accepted by Node.js tls module.
-
usernameField
: Field name where the username is found, defaults to username
-
passwordField
: Field name where the password is found, defaults to password
-
passReqToCallback
: When true
, req
is the first argument to the verify callback (default: false
):
passport.use(new LdapStrategy(..., function(req, user, done) {
...
done(null, user);
}
));
Note: you can pass a function instead of an object as options
, see the example below
Authenticate requests
Use passport.authenticate()
, specifying the 'ldapauth'
strategy, to authenticate requests.
authenticate()
options
In addition to default authentication options the following flash message options are available for passport.authenticate()
:
badRequestMessage
: missing username/password (default: 'Missing credentials')invalidCredentials
: InvalidCredentialsError
, NoSuchObjectError
, and /no such user/i
LDAP errors (default: 'Invalid username/password')userNotFound
: LDAP returns no error but also no user (default: 'Invalid username/password')constraintViolation
: user account is locked (default: 'Exceeded password retry limit, account locked')
And for Microsoft AD messages, these flash message options can also be used (used instead of invalidCredentials
if matching error code is found):
invalidLogonHours
: not being allowed to login at this current time (default: 'Not Permitted to login at this time')invalidWorkstation
: not being allowed to login from this current location (default: 'Not permited to logon at this workstation')passwordExpired
: expired password (default: 'Password expired')accountDisabled
: disabled account (default: 'Account disabled')accountExpired
: expired account (default: 'Account expired')passwordMustChange
: password change (default: 'User must reset password')accountLockedOut
: locked out account (default: 'User account locked')
Express example
var express = require('express'),
passport = require('passport'),
bodyParser = require('body-parser'),
LdapStrategy = require('passport-ldapauth');
var OPTS = {
server: {
url: 'ldap://localhost:389',
bindDn: 'cn=root',
bindCredentials: 'secret',
searchBase: 'ou=passport-ldapauth',
searchFilter: '(uid={{username}})'
}
};
var app = express();
passport.use(new LdapStrategy(OPTS));
app.use(bodyParser.json());
app.use(bodyParser.urlencoded({extended: false}));
app.use(passport.initialize());
app.post('/login', passport.authenticate('ldapauth', {session: false}), function(req, res) {
res.send({status: 'ok'});
});
app.listen(8080);
Active Directory over SSL example
Simple example config for connecting over ldaps://
to a server requiring some internal CA certificate (often the case in corporations using Windows AD).
var fs = require('fs');
var opts = {
server: {
url: 'ldaps://ad.corporate.com:636',
bindDn: 'cn=non-person,ou=system,dc=corp,dc=corporate,dc=com',
bindCredentials: 'secret',
searchBase: 'dc=corp,dc=corporate,dc=com',
searchFilter: '(&(objectcategory=person)(objectclass=user)(|(samaccountname={{username}})(mail={{username}})))',
searchAttributes: ['displayName', 'mail'],
tlsOptions: {
ca: [
fs.readFileSync('/path/to/root_ca_cert.crt')
]
}
}
};
...
Asynchronous configuration retrieval
Instead of providing a static configuration object, you can pass a function as options
that will take care of fetching the configuration. It will be called with the req
object and a callback function having the standard (err, result)
signature. Notice that the provided function will be called on every authenticate request.
var getLDAPConfiguration = function(req, callback) {
process.nextTick(function() {
var opts = {
server: {
url: 'ldap://localhost:389',
bindDn: 'cn=root',
bindCredentials: 'secret',
searchBase: 'ou=passport-ldapauth',
searchFilter: '(uid={{username}})'
}
};
callback(null, opts);
});
};
var LdapStrategy = require('passport-ldapauth');
passport.use(new LdapStrategy(getLDAPConfiguration,
function(user, done) {
...
return done(null, user);
}
));
License
MIT