https://github.com/jeremycx/node-LDAP
ldap version 3를 지원하는 nodejs 모듈이 없어서 인증을 우회 했었는데 다행이 지원되는 모듈을 발견해서 nodejs로만 인증 완료했다.
일단 passport 용 스트래티지가 없어서 Local 스트래티지를 활용해서 인증을 완료했다.
var express = require('express');
var passport = require('passport');
var LocalStrategy = require('passport-local').Strategy;
var LDAP = require('LDAP');
var router = express.Router();
var ldap = new LDAP({
uri: 'ldap://ldap주소',
version: 3,
starttls: false,
connecttimeout: 1,
reconnect: true
});
passport.use(new LocalStrategy({
usernameField: 'user_id',
passwordField: 'password'
}, function(username, password, done) {
var bind_options = {
binddn: username,
password: password
};
ldap.open(function(){
ldap.simplebind(bind_options, function(err) {
if(err) {
console.log("LDAP auth error: %s", err);
done(null, false, {message: 'incorrect'})
}
done(err, username)
});
})
}
));
passport.serializeUser(function(user, done) {
done(null, user);
});
passport.deserializeUser(function(id, done) {
done(null, id);
});
router.post('/', function(req, res, next) {
passport.authenticate('local', function(err, user, info) {
if(err) {
return next(err);
}
if(!user) {
return res.json(500, {message: 'incorrect'});
}
req.login(user, function(err) {
if(err) {
return next(err);
}
return res.json({success: true});
});
})(req, res, next);
});
router.get('/ping', function(req, res) {
if(req.user) {
res.json({success: true, user_id: req.user});
} else {
res.json(401, {});
}
});
router.get('/logout', function(req, res) {
req.logout();
res.json({success: true});
});
module.exports = router;