npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2024 – Pkg Stats / Ryan Hefner

express-passport-ldap-mongoose

v3.1.1

Published

A library to use ldap-authentication and passport to authenticate users

Downloads

45

Readme

express-passport-ldap-mongoose

Build Status Known Vulnerabilities

A turn key library that uses ldap-authentication with Passport and local database (MongoDB) to authenticate and save users

When an application needs to authenticate a user against an LDAP server, it normally also needs to save the user into local MongoDB for further references. express-passport-ldap-mongoose is designed to handle this requirement with a simple wrapper layer on top of expressjs, passportjs, ldap-authentication, and MongoDB.

Requirements

  • node Express
  • Mongoose (optional)
  • Passport
  • ldap-authentication
  • The login submit field names should be username for username, and password for password

Installation

Using npm: npm install --save express-passport-ldap-mongoose

or using yarn: yarn add express-passport-ldap-mongoose

Usage

express-passport-ldap-mongoose configures passportjs and adds the login and logout route to your express app or router. All you need to do is call the initialize function of the library and everything else is taken care of.

const LdapAuth = require('express-passport-ldap-mongoose')
app.use(express.json())
app.use(sessionMiddleWare)
LdapAuth.initialize(options, app, findUserFunc, upsertUserFunc, loginPath, logoutPath)

Since version 3.1.0, you can still use init() but it is deprecated. Use initialize() instead which is simpler.

MongoDB model

When search for a user by its username in LDAP, a usernameAttribute is needed. The User model in local MongoDB must have the same key as the value of usernameAttribute that maps to the LDAP attribute. In some cases, and in the example we are using uid. it is used to uniquely identify a user and equals to the user's login username.

Parameters

  • options: If the first parameter is an object, it is the options object to pass to ldap-authentication's authenticate() function. If is a string (deprecated), is the ldap search base (for backward compatible) If options is an object, literal {{username}} in the userDn will be replaced with the value in req.body.username which will be the user input username. See ldap-authentication for detail explanation on each options.

    String Example (deprecated): dc=example.com,dc=com

    Options object Example:

    let options = {
         ldapOpts: {
           url: 'ldap://localhost'
         },
         // note in this example it only use the user to directly
         // bind to the LDAP server. You can also use an admin
         // here. See the document of ldap-authentication.
         userDn: `uid=${req.body.username},${ldapBaseDn}`,
         userPassword: req.body.password,
         userSearchBase: ldapBaseDn,
         usernameAttribute: 'uid',
         username: req.body.username
       }
  • app: Express app or router

  • findUserFunc: function(id). A function takes a string id and return a promise that resolves to a user or null. This function is called everytime passport do deserialization. It is normally a FindOne or FindById call against local mongo database. Example: (id) => {return User.findOne({ uid: id }).exec()}. However, it does not have to be any database related. It is just a functin that can return a user from a user id.

  • upsertUserFunc: function(user). A function take a user object (obtained from ldap server and saved in express req) and upsert into local database; returns a promise that resolves to a local db user object. Again, it does not have to be any database related. It is essentially a function that update some internal record of a user. Example: (user) => {return User.findOneAndUpdate({ uid: user.uid }, user, { upsert: true, new: true }).exec()}

  • loginPath: (optional, default /login) The login path for express to parse the login posted json data. The posted data must be in json format, and with username and password as the key names. An app.post(loginPath, loginHandler) will be automatically added and handled by the library.

  • logoutPath: (optional, default /logout) The logout path for express to parse the logout request. An app.get(logoutPath, logoutHandler) will be automatically added and handled by the library.

Example

Complete example is in the example folder.

Another example on how to use Passport and ldap-authentication can be found in passport-ldap-example.

const mongoose = require('mongoose')
mongoose.Promise = Promise
mongoose.connect('mongodb://localhost/ldaptest')
const session = require('express-session')
const MongoStore = require('connect-mongo')(session)

const express = require('express')
const app = express()

const User = require('./model').User

const LdapAuth = require('express-passport-ldap-mongoose')

var sessionMiddleWare = session({
  secret: 'top session secret',
  store: new MongoStore({ mongooseConnection: mongoose.connection }),
  resave: true,
  saveUninitialized: true,
  unset: 'destroy',
  cookie: {
    httpOnly: false,
    maxAge: 1000 * 3600 * 24,
    secure: false, // this need to be false if https is not used. Otherwise, cookie will not be sent.
  }
})

// The order of the following middleware is very important!!
app.use(express.json())
app.use(sessionMiddleWare)
// use the library express-passport-ldap-mongoose
let usernameAttributeName = 'uid'
LdapAuth.initialize({
    ldapOpts: {
      url: 'ldap://localhost'
    },
    // note in this example it only use the user to directly
    // bind to the LDAP server. You can also use an admin
    // here. See the document of ldap-authentication.
    userDn: `uid={{username}},${ldapBaseDn}`,
    userSearchBase: ldapBaseDn,
    usernameAttribute: usernameAttributeName
  }, 
  app, 
  async (id) => {
    let user = await User.findOne({ usernameAttributeName: id }).exec()
    return user
  }, 
  async (user) => {
    let foundUser = await User.findOneAndUpdate({ username: user[usernameAttributeName] }, user, { upsert: true, new: true }).exec()
    return foundUser
  })

// serve static pages (where login.html resides)
app.use(express.static('public'))

// Start server
app.listen(4000, '127.0.0.1')