2017-08-04 9 views
0

これらのエクスプレスルートをそれぞれのファイルにどのように分けることができますか。私はこれをいくつかの方法で試してみましたが、私が推測しているように感じ始めています。パスでパスポートをどのようにルーティングしているかをしっかりと理解したいと思っていません。これらのエクスプレスルートをそれぞれのファイルに分割するにはどうすればいいですか

//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('/'); 
} 

いずれかが私の説明を助けてくれれば、別のディレクトリを通るルート内のパスポートをどのようにルーティングするかです。

答えて

0

Expressのルートは、左から右へ一連のミドルウェア機能によって処理されます。したがって、passport.authenticate()passport.authorize()は、ビジネスロジックを実行し、リダイレクトを処理する適切なミドルウェア機能を返すだけです。

複数のファイル(ローカルのサインアップのためのGoogleのための1、フェイスブックに1つ、1を言う)あなたがすることができる一つのことは、このようなものである上にルートを配布したい場合:次に

/* 
* 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)); 
関連する問題