/ nodejs

nodejs ldap 모듈

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;