Просмотр исходного кода

devide login/logout route and service for passport

Yuki Takei 8 лет назад
Родитель
Сommit
56ee6c939b
6 измененных файлов с 153 добавлено и 67 удалено
  1. 4 29
      lib/crowi/index.js
  2. 2 1
      lib/routes/index.js
  3. 78 0
      lib/routes/login-passport.js
  4. 0 37
      lib/routes/login.js
  5. 8 0
      lib/routes/logout-passport.js
  6. 61 0
      lib/service/passport.js

+ 4 - 29
lib/crowi/index.js

@@ -252,36 +252,11 @@ Crowi.prototype.getInterceptorManager = function() {
 }
 
 Crowi.prototype.setupPassport = function() {
-  var self = this;
-  var passport = require('passport')
-    , LocalStrategy = require('passport-local').Strategy
-    , User = this.model('User');
-
-  passport.use(new LocalStrategy(
-    {
-      usernameField: 'loginForm[username]',
-      passwordField: 'loginForm[password]'
-    },
-    function(username, password, done) {
-      User.findUserByUsernameOrEmail(username, password, function(err, user) {
-        if (err) { return done(err); }
-        if (!user || !user.isPasswordValid(password)) {
-          return done(null, false, { message: 'Incorrect credentials.' });
-        }
-        return done(null, user);
-      });
-    }
-  ));
+  const PassportService = require('../service/passport');
 
-  passport.serializeUser(function(user, done) {
-    done(null, user.id);
-  });
-
-  passport.deserializeUser(function(id, done) {
-    User.findById(id, function(err, user) {
-      done(err, user);
-    });
-  });
+  const passportService = new PassportService(this);
+  passportService.setupLocalStrategy();
+  passportService.setupSerializer();
 
   return Promise.resolve();
 }

+ 2 - 1
lib/routes/index.js

@@ -5,6 +5,7 @@ module.exports = function(crowi, app) {
     , form      = require('../form')
     , page      = require('./page')(crowi, app)
     , login     = require('./login')(crowi, app)
+    , loginPassport = require('./login-passport')(crowi, app)
     , logout    = require('./logout')(crowi, app)
     , me        = require('./me')(crowi, app)
     , admin     = require('./admin')(crowi, app)
@@ -30,7 +31,7 @@ module.exports = function(crowi, app) {
   app.get('/login'                   , middleware.applicationInstalled()    , login.login);
   app.get('/login/invited'           , login.invited);
   app.post('/login/activateInvited'  , form.invited                         , csrf, login.invited);
-  app.post('/login'                  , form.login                           , csrf, login.loginWithPassport);
+  app.post('/login'                  , form.login                           , csrf, loginPassport.loginWithLocal);
   app.post('/register'               , form.register                        , csrf, login.register);
   app.get('/register'                , middleware.applicationInstalled()    , login.register);
   app.post('/register/google'        , login.registerGoogle);

+ 78 - 0
lib/routes/login-passport.js

@@ -0,0 +1,78 @@
+module.exports = function(crowi, app) {
+  'use strict';
+
+  var debug = require('debug')('crowi:routes:login-passport')
+    , passport = require('passport')
+    , config = crowi.getConfig()
+    , Config = crowi.model('Config');
+
+  /**
+   * success handler
+   * @param {*} req
+   * @param {*} res
+   */
+  const loginSuccess = (req, res, userData) => {
+    req.session.user = userData;
+
+    var jumpTo = req.session.jumpTo;
+    if (jumpTo) {
+      req.session.jumpTo = null;
+      return res.redirect(jumpTo);
+    } else {
+      return res.redirect('/');
+    }
+  };
+
+  /**
+   * failure handler
+   * @param {*} req
+   * @param {*} res
+   */
+  const loginFailure = (req, res) => {
+    return res.redirect('/login');
+  };
+
+
+  const loginWithLdap = (req, res, next) => {
+    // TODO impl with vesse/passport-ldapauth
+    return next({});
+  }
+
+  /**
+   * login with LocalStrategy action
+   * @param {*} req
+   * @param {*} res
+   * @param {*} next
+   */
+  const loginWithLocal = (req, res, next) => {
+    const loginForm = req.body.loginForm;
+
+    if (!req.form.isValid) {
+      return res.render('login', {
+      });
+    }
+
+    passport.authenticate('local', (err, user, info) => {
+      debug('---authentication with passport start---');
+      debug('user', user);
+      debug('info', info);
+
+      if (err) { return loginFailure(req, res); }
+      if (!user) { return loginFailure(req, res); }
+      req.logIn(user, (err) => {
+        if (err != null) {
+          debug(err);
+          return loginFailure(req, res);
+        }
+        return loginSuccess(req, res, user);
+      });
+
+      debug('---authentication with passport end---');
+    })(req, res, next);
+  }
+
+  return {
+    loginWithLdap,
+    loginWithLocal,
+  };
+};

+ 0 - 37
lib/routes/login.js

@@ -39,16 +39,6 @@ module.exports = function(crowi, app) {
     }
   };
 
-  var loginSuccessForPassport = function(req, res, userData) {
-    var jumpTo = req.session.jumpTo;
-    if (jumpTo) {
-      req.session.jumpTo = null;
-      return res.redirect(jumpTo);
-    } else {
-      return res.redirect('/');
-    }
-  };
-
   var loginFailure = function(req, res) {
     req.flash('warningMessage', 'Sign in failure.');
     return res.redirect('/login');
@@ -111,33 +101,6 @@ module.exports = function(crowi, app) {
     }
   };
 
-  actions.loginWithPassport = function(req, res, next) {
-    var loginForm = req.body.loginForm;
-
-    if (!req.form.isValid) {
-      return res.render('login', {
-      });
-    }
-
-    passport.authenticate('local', function(err, user, info) {
-      debug('---authentication with passport start---');
-      debug('user', user);
-      debug('info', info);
-
-      if (err) { return loginFailure(req, res); }
-      if (!user) { return loginFailure(req, res); }
-      req.logIn(user, function(err) {
-        if (err != null) {
-          debug(err);
-          return loginFailure(req, res);
-        }
-        return loginSuccess(req, res, user);
-      });
-
-      debug('---authentication with passport end---');
-    })(req, res, next);
-  }
-
   actions.loginGoogle = function(req, res) {
     var googleAuth = require('../util/googleAuth')(config);
     var code = req.session.googleAuthCode || null;

+ 8 - 0
lib/routes/logout-passport.js

@@ -0,0 +1,8 @@
+module.exports = function(crowi, app) {
+  return {
+    logout: (req, res) => {
+      req.logout();
+      return res.redirect('/');
+    }
+  };
+};

+ 61 - 0
lib/service/passport.js

@@ -0,0 +1,61 @@
+const debug = require('debug')('crowi:PassportService');
+const passport = require('passport');
+const LocalStrategy = require('passport-local').Strategy;
+
+/**
+ * the service class of Passport
+ */
+class PassportService {
+
+  constructor(crowi) {
+    this.crowi = crowi;
+  }
+
+  /**
+   * setup LocalStrategy
+   *
+   * @memberof PassportService
+   */
+  setupLocalStrategy() {
+    const User = this.crowi.model('User');
+
+    passport.use(new LocalStrategy(
+      {
+        // see '/lib/form/login.js'
+        usernameField: 'loginForm[username]',
+        passwordField: 'loginForm[password]'
+      },
+      (username, password, done) => {
+        // find user
+        User.findUserByUsernameOrEmail(username, password, (err, user) => {
+          if (err) { return done(err); }
+          // check existence and password
+          if (!user || !user.isPasswordValid(password)) {
+            return done(null, false, { message: 'Incorrect credentials.' });
+          }
+          return done(null, user);
+        });
+      }
+    ));
+  }
+
+  /**
+   * setup serializer and deserializer
+   *
+   * @memberof PassportService
+   */
+  setupSerializer() {
+    const User = this.crowi.model('User');
+
+    passport.serializeUser(function(user, done) {
+      done(null, user.id);
+    });
+    passport.deserializeUser(function(id, done) {
+      User.findById(id, function(err, user) {
+        done(err, user);
+      });
+    });
+  }
+}
+
+module.exports = PassportService;