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

WIP: login success with passport-local

Yuki Takei 8 лет назад
Родитель
Сommit
813eb8d786
6 измененных файлов с 87 добавлено и 2 удалено
  1. 5 0
      lib/crowi/express-init.js
  2. 28 0
      lib/crowi/index.js
  3. 2 2
      lib/routes/index.js
  4. 29 0
      lib/routes/login.js
  5. 2 0
      package.json
  6. 21 0
      yarn.lock

+ 5 - 0
lib/crowi/express-init.js

@@ -7,6 +7,7 @@ module.exports = function(crowi, app) {
     , bodyParser     = require('body-parser')
     , cookieParser   = require('cookie-parser')
     , methodOverride = require('method-override')
+    , passport       = require('passport')
     , session        = require('express-session')
     , basicAuth      = require('basic-auth-connect')
     , flash          = require('connect-flash')
@@ -111,6 +112,10 @@ module.exports = function(crowi, app) {
     }
   });
 
+  // passport
+  app.use(passport.initialize());
+  app.use(passport.session());
+
   app.use(flash());
 
   app.use(middleware.swigFilters(app, swig));

+ 28 - 0
lib/crowi/index.js

@@ -85,6 +85,8 @@ Crowi.prototype.init = function() {
     });
   }).then(function() {
     return self.scanRuntimeVersions();
+  }).then(function() {
+    return self.setupPassport();
   }).then(function() {
     return self.setupSearcher();
   }).then(function() {
@@ -249,6 +251,32 @@ Crowi.prototype.getInterceptorManager = function() {
   return this.interceptorManager;
 }
 
+Crowi.prototype.setupPassport = function() {
+  var self = this;
+  var passport = require('passport')
+    , LocalStrategy = require('passport-local').Strategy
+    , User = this.model('User');
+
+  return new Promise(function(resolve, reject) {
+    passport.use(new LocalStrategy(
+      {
+        usernameField: 'loginForm[email]',
+        passwordField: 'loginForm[password]'
+      },
+      function(username, password, done) {
+        User.findUserByEmailAndPassword(username, password, function(err, user) {
+          if (err) { return done(err); }
+          if (!user) {
+            return done(null, false, { message: 'Incorrect username.' });
+          }
+          return done(null, user);
+        });
+      }
+    ));
+    resolve();
+  });
+}
+
 Crowi.prototype.setupSearcher = function() {
   var self = this;
   var searcherUri = this.env.ELASTICSEARCH_URI

+ 2 - 2
lib/routes/index.js

@@ -27,10 +27,10 @@ module.exports = function(crowi, app) {
   //app.post('/installer/user'         , middleware.applicationNotInstalled() , installer.createFirstUser);
 
   app.get('/login/error/:reason'     , login.error);
-  app.get('/login'                   , middleware.applicationInstalled()    , login.login);
+  app.get('/login'                   , middleware.applicationInstalled()    , login.loginWithPassport);
   app.get('/login/invited'           , login.invited);
   app.post('/login/activateInvited'  , form.invited                         , csrf, login.invited);
-  app.post('/login'                  , form.login                           , csrf, login.login);
+  app.post('/login'                  , form.login                           , csrf, login.loginWithPassport);
   app.post('/register'               , form.register                        , csrf, login.register);
   app.get('/register'                , middleware.applicationInstalled()    , login.register);
   app.post('/register/google'        , login.registerGoogle);

+ 29 - 0
lib/routes/login.js

@@ -4,6 +4,7 @@ module.exports = function(crowi, app) {
   var googleapis = require('googleapis')
     , debug = require('debug')('crowi:routes:login')
     , async    = require('async')
+    , passport = require('passport')
     , config = crowi.getConfig()
     , mailer = crowi.getMailer()
     , Page = crowi.model('Page')
@@ -100,6 +101,34 @@ module.exports = function(crowi, app) {
     }
   };
 
+  actions.loginWithPassport = function(req, res, next) {
+    var loginForm = req.body.loginForm;
+
+    if (req.method == 'POST' && req.form.isValid) {
+
+      passport.authenticate('local', function(err, user, info) {
+        console.log('---passport start---');
+        console.log(user);
+        console.log(info);
+        console.log('---passport end ---');
+
+        if (err) { return loginFailure(req, res); }
+        if (!user) { return loginFailure(req, res); }
+        req.logIn(user, function(err) {
+          if (err) { loginFailure(req, res); }
+          return loginSuccess(req, res, user);
+        });
+      })(req, res, next);
+
+    } else { // method GET
+      if (req.form) {
+        debug(req.form.errors);
+      }
+      return res.render('login', {
+      });
+    }
+  }
+
   actions.loginGoogle = function(req, res) {
     var googleAuth = require('../util/googleAuth')(config);
     var code = req.session.googleAuthCode || null;

+ 2 - 0
package.json

@@ -98,6 +98,8 @@
     "nodemailer-ses-transport": "~1.5.0",
     "normalize-path": "^2.1.1",
     "optimize-js-plugin": "0.0.4",
+    "passport": "^0.4.0",
+    "passport-local": "^1.0.0",
     "pino-clf": "^1.0.2",
     "plantuml-encoder": "^1.2.4",
     "react": "^15.5.0",

+ 21 - 0
yarn.lock

@@ -4684,6 +4684,23 @@ parseurl@~1.3.1:
   version "1.3.1"
   resolved "https://registry.yarnpkg.com/parseurl/-/parseurl-1.3.1.tgz#c8ab8c9223ba34888aa64a297b28853bec18da56"
 
+passport-local@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/passport-local/-/passport-local-1.0.0.tgz#1fe63268c92e75606626437e3b906662c15ba6ee"
+  dependencies:
+    passport-strategy "1.x.x"
+
+passport-strategy@1.x.x:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/passport-strategy/-/passport-strategy-1.0.0.tgz#b5539aa8fc225a3d1ad179476ddf236b440f52e4"
+
+passport@^0.4.0:
+  version "0.4.0"
+  resolved "https://registry.yarnpkg.com/passport/-/passport-0.4.0.tgz#c5095691347bd5ad3b5e180238c3914d16f05811"
+  dependencies:
+    passport-strategy "1.x.x"
+    pause "0.0.1"
+
 path-browserify@0.0.0:
   version "0.0.0"
   resolved "https://registry.yarnpkg.com/path-browserify/-/path-browserify-0.0.0.tgz#a0b870729aae214005b7d5032ec2cbbb0fb4451a"
@@ -4738,6 +4755,10 @@ pathval@^1.0.0:
   version "1.1.0"
   resolved "https://registry.yarnpkg.com/pathval/-/pathval-1.1.0.tgz#b942e6d4bde653005ef6b71361def8727d0645e0"
 
+pause@0.0.1:
+  version "0.0.1"
+  resolved "https://registry.yarnpkg.com/pause/-/pause-0.0.1.tgz#1d408b3fdb76923b9543d96fb4c9dfd535d9cb5d"
+
 pbkdf2@^3.0.3:
   version "3.0.13"
   resolved "https://registry.yarnpkg.com/pbkdf2/-/pbkdf2-3.0.13.tgz#c37d295531e786b1da3e3eadc840426accb0ae25"