2014-05-14 3 views
5

Express.js 4.0에서 Passport.js를 사용하려고하는데 아무 일도 일어나지 않습니다. 필자는 아래의 튜토리얼을 따라 Express.js 4.0의 새로운 라우팅 기능에 맞게 조정하려고합니다.Express.js로 Passport.js 로컬 인증 4

http://scotch.io/tutorials/javascript/easy-node-authentication-setup-and-local

지금까지 난 그냥 LocalStrategy에 명시된 바와 같이, 로그인하고 적절한 메시지와 함께 실패 리디렉션보기를 얻을하려고합니다.

1 .- 필요한 모듈을 당기기와 MongoDB를 데이터베이스에 연결 응용 프로그램 변수

... 
var session = require('express-session'); 
var mongoose = require('mongoose'); 
var passport = require('passport'); 
var LocalStrategy = require('passport-local').Strategy; 
var flash = require('connect-flash'); 
var bcrypt = require('bcrypt-nodejs'); 

var app = express(); 

2 .-를 만들고 :

은 미안은 app.js에 무엇을 저장 사용자에게 사용자 모델을 확인

require('./models/db')(mongoose, 'mongodb://localhost/cms'); 

var User = require('./models/user')(mongoose); 

0 4. 구성 여권

require('./config/passport')(passport, User, LocalStrategy); 

5 .-

var router = express.Router(); 

router.use(function (req, res, next) { 

    if (req.method === 'POST' && req.url === '/login') { 
    // Log #1 
    console.log(passport); 

    passport.authenticate('login', { 
     successRedirect: '/', 
     failureRedirect: '/login', 
     failureFlash: true 
    }); 

    } else { 

    next(); 

    } 
}); 

router.route('/') 
     .get(function (req, res) { 
     res.render('index'); 
     }); 

router.route('/login') 
     .post(function (req, res) { 
     console.log('Post on /login'); 
     }) 
     .get(function (req, res) { 
     res.render('login', { 
      message: req.flash('loginMessage') 
     }); 
     }); 

app.use('/', router); 

... (Rest of app.js such as error handlers) 

이 처리에 필요한 모든 미들웨어

app.engine('.html', require('ejs').__express); 
app.set('views', path.join(__dirname, 'views')); 
app.set('view engine', 'html'); 

app.use(favicon()); 
app.use(logger('dev')); 
app.use(bodyParser.json()); 
app.use(bodyParser.urlencoded()); 
app.use(cookieParser()); 

app.use(session({ 
    secret: 'keyboardcat' 
})); 
app.use(passport.initialize()); 
app.use(passport.session()); 
app.use(flash()); 

app.use(express.static(path.join(__dirname, 'public'))); 

6 .- 경로를 포함하는지 확인하기 ./config/pas에서 Passport 전략의 구성을 설정하는 방법입니다. 우리가 입력 이름이 제대로 전략처럼 설정되어 볼 수 있듯이보기 로그인이

과 같은

module.exports = function (passport, User, LocalStrategy) { 

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

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

    passport.use('login', new LocalStrategy({ 
    usernameField : 'email', 
    passwordField : 'password', 
    passReqToCallback : true 
    }, function (email, password, done) { 

     User.findOne({ email: email }, function (err, user) { 

     if (err) { 

      return done(err); 

     } 

     if (!user) { 

      return done(null, false, { message: 'Incorrect username.' }); 

     } 

     if (!user.validPassword(password)) { 

      return done(null, false, { message: 'Incorrect password.' }); 

     } 

     return done(null, user); 

     }); 

    } 

)); 

}; 

을 sport.js. 어떤 사용자가 아직 내가 기대하지 않았다 놈의이 '/'로 리디렉션하기 때문에

<% include header.html %> 

<% if (message.length > 0) { %> 
    <div><%= message %></div> 
<% } %> 

<form action="/login" method="post" enctype="multipart/form-data"> 
    <input type="text" name="email"/> 
    <input type="password" name="password"/> 
    <input type="submit" value="Log In"/> 
</form> 

<% include footer.html %> 

'올바른 사용자 명.' 양식을 제출할 때 메시지가 표시되지만 대신 브라우저가로드 상태로 유지되고 아무 일도 발생하지 않습니다. 이

passport.authenticate('login', { 
    successRedirect: '/', 
    failureRedirect: '/login', 
    failureFlash: true 
}); 

를 호출 할 필요가 여기서

몇 가지 생각 ...

내가 부르고 있습니까? 여기서 내가 원하는 것은 로그인 경로에 POST 할 때 미들웨어로 호출하는 것입니다.

로그 # 1은 실제로 여권 개체를 보여줍니다.

나는 이것으로 며칠을 보내고 어떤 일이 일어나고 있는지 파악할 수 없다. 누군가가 뭔가를 발견 할 수 있기를 바랍니다. 감사합니다.

답변

2

난 당신이

(메시지를 보내고 console.log 제외) 귀하의 router.route('/login').post에 아무것도하지 않는 것을 볼이 작업을 수행 :

 
.post(passport.authenticate('local', { successRedirect: '/', 
             failureRedirect: '/login' })) 

아니면 custom callbackhttp://passportjs.org/guide/ (당신은 당신의 console.log을 유지 싶다면), 당신은 여권 반환 인증 방법을 반환합니다.

 
.post(function (req, res){ 
    console.log('Post on /login'); 
    return passport.authenticate('local-login', function(err, user, info){ 
     // PS: You can also inspect err/user here to see if everything else is working properly 
     console.log(err); 
     console.log(user); 
     console.log(info) 
    })(req, res, next); 
}); 
+1

안녕하세요, 첫 번째 옵션은 정상적으로 작동하는 옵션입니다. 이제 '/ login'으로 리디렉션됩니다. 이제는 올바른 오류 메시지를 출력하는 데 어려움을 겪고 있습니다. 그러나 그것은 제가 추측 한 또 다른 질문입니다. 감사합니다. –