2016-11-01 4 views
0

は、だから私は、このマニュアルを見て:希望の結果が得られるように、これをどのように書くことができますか?

Documentation for "ensureAuthentication" "isAuthenticated" passport's functions?

そして、この1:

https://www.jokecamp.com/tutorial-passportjs-authentication-in-nodejs/

そして、残念ながらどちらもパスポートミドルウェアは私に望ましい結果を与えていない理由を考え出すに役立っています登録済みのユーザーにログインしてメンバーページにリダイレクトする代わりに、同じログインページにリダイレクトするだけで、ログインしたユーザーはメンバーページに移動することはできません。ユーザーがログアウトしたとき。

これは、ルートフォルダにindex.jsです:

var express = require('express'); 
var router = express.Router(); 

// Members Page 
router.get('/', ensureAuthenticated, function(req, res, next) { 
    res.render('index', { title: 'Members' }); 
}); 

function ensureAuthenticated(req, res, next){ 
    if(req.isAuthenticated()){ 
     return next(); 
    } 
    res.redirect('/users/login'); 
} 

module.exports = router; 

をそして、これはルートフォルダ内のusers.jsページです:

var express = require('express'); 
var router = express.Router(); 
var passport = require('passport'); 
var LocalStrategy = require('passport-local').Strategy; 
var User = require('../models/user'); 

/* GET users listing. */ 
router.get('/', function(req, res, next) { 
    res.send('respond with a resource'); 
}); 

router.get('/register', function(req, res, next) { 
    res.render('register',{ 
    'title': 'Register' 
    }); 
}); 

router.get('/login', function(req, res, next) { 
    res.render('login',{ 
    'title': 'Login' 
    }); 
}); 

router.post('/register', function(req, res, next){ 
    // Get Form Values 
    var name = req.body.name; 
    var email = req.body.email; 
    var username = req.body.username; 
    var password = req.body.password; 
    var password2 = req.body.password2; 

    // Check for Image Field 
    if(req.files && req.files.profileimage){ 
     console.log('Uploading File...'); 

     // File Info 
     var profileImageOriginalName = req.files.profileimage.originalname; 
     var profileImageName = req.files.profileimage.name; 
     var profileImageMime = req.files.profileimage.mimetype; 
     var profileImagePath = req.files.profileimage.path; 
     var profileImageExt = req.files.profileimage.extension; 
     var profileImageSize = req.files.profileimage.size; 
    } else { 
     // Set a Default Image 
     var profileImageName = 'noimage.png'; 
    } 

    // Form Validation 
    req.checkBody('name','Name field is required').notEmpty(); 
    req.checkBody('email','Email field is required').notEmpty(); 
    req.checkBody('email','Email not valid').isEmail(); 
    req.checkBody('username','Username field is required').notEmpty(); 
    req.checkBody('password','Password field is required').notEmpty(); 
    req.checkBody('password2','Passwords do not match').equals(req.body.password); 

    // Check for Errors 
    var errors = req.validationErrors(); 

    if(errors){ 
     res.render('register',{ 
      errors: errors, 
      name: name, 
      email: email, 
      username: username, 
      password: password, 
      password2: password2 
     }); 
    } else { 
     var newUser = new User({ 
      name: name, 
      email: email, 
      username: username, 
      password: password, 
      profileimage: profileImageName 
     }); 

     // Create User 

     User.createUser(newUser, function(err, user){ 
      if(err) throw err; 
      console.log(user); 
     }); 

     User.createUser(newUser, function(err, user){ 
      if(err) throw err; 
      console.log(user); 
     }); 

     // Success Message 
     req.flash('success', 'You are now registered and may log in'); 

     res.location('/'); 
     res.redirect('/'); 
    } 
}); 

passport.serializeUser(function(user, done) { 
    done(null, user.id); 
}); 

passport.deserializeUser(function(id, done) { 
    User.getUserByUsername(id, function(err, user) { 
    done(err, user); 
    }); 
}); 

passport.use(new LocalStrategy(
    function(username, password, done){ 
     User.getUserByUsername(username, function(err, user){ 
      if(err)throw err; 
      if(!user){ 
       console.log('Unknown User'); 
       return done(null, false,{message: 'Unknown User'}); 
      } 

      User.comparePassword(password, user.password, function(err, isMatch){ 
       if(err) throw err; 
       if(isMatch){ 
        return done(null, user); 
       } else { 
        console.log('Invalid Password'); 
        return done(null, false, {message: 'Invalid Password'}); 
       } 
      }); 
     }); 
    } 
)); 

router.post('/login', passport.authenticate('local', {failureRedirect: '/users/login', failureFlash:'Invalid username or password'}), function(req, res){ 
    console.log('Authentication Successful'); 
    req.flash('success', 'You are logged in'); 
    res.redirect('/'); 
}); 

router.get('/logout', function(req, res){ 
    req.logout(); 
    req.flash('success', 'You have logged out'); 
    res.redirect('/users/login'); 
}); 


module.exports = router; 
+0

私は、コードをリダイレクトするに誤りがあると思い、私は「((a)の { res.redirect場合 {その作業のユーザーが* app.get( '*'、機能(REQ、RES)そのようにしましたhttp://google.com/logedin');他の } { res.send( "ログインできません") } – Adiii

答えて

0

あなたがライン102で何かをスペルミスと思われますあなたのdeserializeUser関数。 User.getUserByUsernameを使用するのではなく、User.getUserByIdを使用する必要があります。

passport.deserializeUser(function(id, done) { 
    User.getUserById(id, function(err, user) { 
    done(err, user); 
    }); 
}); 

このlinkは、関連するstackoverflow質問に行きます。そこでの最良の答えは、変数idは、関数の 'done'キーワードによって作成されたユーザオブジェクトに対応すると言います。だからあなたがNodeJSによって関数に入力されたユーザー名だったと思ったのは、実際には一意のキーです。

+0

素敵なキャッチMonilitoあなたが一日保存した – Daniel

+0

それは私の喜び、@Danielです! –

関連する問題