2017-08-04 47 views
0

想知道如何將這些快速路線分隔到自己的文件中。我已經嘗試了幾種方法,我開始覺得我在猜測。我不想猜測,我想深刻理解Express如何通過路由傳遞護照。想知道如何將這些快速路線分隔到自己的文件中

//const loginRoute = require('./modelroutes/') 
module.exports = function(app, passport) { 

// normal routes =============================================================== 

    // show the home page (will also have our login links) 
    app.get('/', function(req, res) { 
     res.render('../public/views/index.ejs'); 
    }); 

    // PROFILE SECTION ========================= 
    app.get('/profile', isLoggedIn, function(req, res) { 
     res.render('../public/views/profile.ejs', { 
      user : req.user 
     }); 
    }); 

    // LOGOUT ============================== 
    app.get('/logout', function(req, res) { 
     req.logout(); 
     res.redirect('/'); 
    }); 

// ============================================================================= 
// AUTHENTICATE (FIRST LOGIN) ================================================== 
// ============================================================================= 

    // locally -------------------------------- 
     // LOGIN =============================== 
     // show the login form 
     app.get('/login', function(req, res) { 
      res.render('../public/views/login.ejs', { message: req.flash('loginMessage') }); 
     }); 

     // process the login form 
     app.post('/login', passport.authenticate('local-login', { 
      successRedirect : '/profile', // redirect to the secure profile section 
      failureRedirect : '/login', // redirect back to the signup page if there is an error 
      failureFlash : true // allow flash messages 
     })); 

     // SIGNUP ================================= 
     // show the signup form 
     app.get('/signup', function(req, res) { 
      res.render('../public/views/signup.ejs', { message: req.flash('loginMessage') }); 
     }); 

     // process the signup form 
     app.post('/signup', passport.authenticate('local-signup', { 
      successRedirect : '/profile', // redirect to the secure profile section 
      failureRedirect : '/signup', // redirect back to the signup page if there is an error 
      failureFlash : true // allow flash messages 
     })); 

    // facebook ------------------------------- 

     // send to facebook to do the authentication 
     app.get('/auth/facebook', passport.authenticate('facebook', { scope : 'email' })); 

     // handle the callback after facebook has authenticated the user 
     app.get('/auth/facebook/callback', 
      passport.authenticate('facebook', { 
       successRedirect : '/profile', 
       failureRedirect : '/' 
      })); 

    // twitter -------------------------------- 

     // send to twitter to do the authentication 
     app.get('/auth/twitter', passport.authenticate('twitter', { scope : 'email' })); 

     // handle the callback after twitter has authenticated the user 
     app.get('/auth/twitter/callback', 
      passport.authenticate('twitter', { 
       successRedirect : '/profile', 
       failureRedirect : '/' 
      })); 


    // google --------------------------------- 

     // send to google to do the authentication 
     app.get('/auth/google', passport.authenticate('google', { scope : ['profile', 'email'] })); 

     // the callback after google has authenticated the user 
     app.get('/auth/google/callback', 
      passport.authenticate('google', { 
       successRedirect : '/profile', 
       failureRedirect : '/' 
      })); 

// ============================================================================= 
// AUTHORIZE (ALREADY LOGGED IN/CONNECTING OTHER SOCIAL ACCOUNT) ============= 
// ============================================================================= 

    // locally -------------------------------- 
     app.get('/connect/local', function(req, res) { 
      res.render('../public/views/connect-local.ejs', { message: req.flash('loginMessage') }); 
     }); 
     app.post('/connect/local', passport.authenticate('local-signup', { 
      successRedirect : '/profile', // redirect to the secure profile section 
      failureRedirect : '/connect/local', // redirect back to the signup page if there is an error 
      failureFlash : true // allow flash messages 
     })); 

    // facebook ------------------------------- 

     // send to facebook to do the authentication 
     app.get('/connect/facebook', passport.authorize('facebook', { scope : 'email' })); 

     // handle the callback after facebook has authorized the user 
     app.get('/connect/facebook/callback', 
      passport.authorize('facebook', { 
       successRedirect : '/profile', 
       failureRedirect : '/' 
      })); 

    // twitter -------------------------------- 

     // send to twitter to do the authentication 
     app.get('/connect/twitter', passport.authorize('twitter', { scope : 'email' })); 

     // handle the callback after twitter has authorized the user 
     app.get('/connect/twitter/callback', 
      passport.authorize('twitter', { 
       successRedirect : '/profile', 
       failureRedirect : '/' 
      })); 


    // google --------------------------------- 

     // send to google to do the authentication 
     app.get('/connect/google', passport.authorize('google', { scope : ['profile', 'email'] })); 

     // the callback after google has authorized the user 
     app.get('/connect/google/callback', 
      passport.authorize('google', { 
       successRedirect : '/profile', 
       failureRedirect : '/' 
      })); 

// ============================================================================= 
// UNLINK ACCOUNTS ============================================================= 
// ============================================================================= 
// used to unlink accounts. for social accounts, just remove the token 
// for local account, remove email and password 
// user account will stay active in case they want to reconnect in the future 

    // local ----------------------------------- 
    app.get('/unlink/local', function(req, res) { 
     var user   = req.user; 
     user.local.email = undefined; 
     user.local.password = undefined; 
     user.save(function(err) { 
      res.redirect('/profile'); 
     }); 
    }); 

    // facebook ------------------------------- 
    app.get('/unlink/facebook', function(req, res) { 
     var user   = req.user; 
     user.facebook.token = undefined; 
     user.save(function(err) { 
      res.redirect('/profile'); 
     }); 
    }); 

    // twitter -------------------------------- 
    app.get('/unlink/twitter', function(req, res) { 
     var user   = req.user; 
     user.twitter.token = undefined; 
     user.save(function(err) { 
      res.redirect('/profile'); 
     }); 
    }); 

    // google --------------------------------- 
    app.get('/unlink/google', function(req, res) { 
     var user   = req.user; 
     user.google.token = undefined; 
     user.save(function(err) { 
      res.redirect('/profile'); 
     }); 
    }); 


}; 

// route middleware to ensure user is logged in 
function isLoggedIn(req, res, next) { 
    if (req.isAuthenticated()) 
     return next(); 

    res.redirect('/'); 
} 

如果任何人可以幫助解釋我的express是如何路由通過單獨目錄的路由護照。

回答

0

Express中的路由是通過從左到右的一系列中間件功能處理的。因此,passport.authenticate()passport.authorize()只是返回一個合適的中間件功能,它執行其業務邏輯並負責重定向。

如果你想在多個文件(說一個谷歌,一個爲Facebook,一個用於本地註冊)有一兩件事你可以做的是這樣的事情你的路由分配:

/* 
* google.js. 
*/ 

// return a function which given passport returns a function 
// which will actually install the relevant routes on a Express app 
// 
// the reason for the indirection is that 
// you might end up wanting to inject other middleware 
// so keeping the deps separate makes it easier/safer 
// for callers to assume a uniform interface. 
const installMyGoogleMiddleWare = passport => app => { 
}; 

module.exports = installMyGoogleMiddleWare; 

然後使用它像此:

/* 
* app.js 
*/ 
const passport = ... 
const app = ... 

const allRoutes = [ 
    require('google.js'), 
    require('facebook.js') /* ... */ 
].map(factory => factory(passport)); 

allRoutes.forEach(route => route(app)); 
相關問題