2014-05-14 17 views
5

Tôi đang cố gắng sử dụng Passport.js với Express.js 4.0 nhưng không có gì xảy ra. Tôi đang làm theo hướng dẫn dưới đây và cố gắng thích ứng với nó để phù hợp với các tính năng định tuyến mới của Express.js 4.0.Xác thực địa phương Passport.js với Express.js 4

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

Cho đến nay tôi chỉ muốn cố gắng đăng nhập và có được cái nhìn thất bại chuyển hướng với thông điệp thích hợp, như đã nêu trong LocalStrategy.

Đây là những gì Tôi đang làm trong app.js:

1.- Kéo các module cần thiết và tạo ra các biến ứng dụng

... 
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.- Kết nối đến cơ sở dữ liệu MongoDB và đảm bảo Mô hình người dùng lưu trữ người dùng

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

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

4. Cấu hình Passport

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

5.- đảm bảo bao gồm tất cả các Middleware cần

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.- Route Xử lý

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) 

này là cách cấu hình của chiến lược hộ chiếu được đặt trong ./config/pas sport.js

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); 

     }); 

    } 

)); 

}; 

Các Login Xem trông như thế này

Như chúng ta có thể thấy những cái tên đầu vào được thiết lập đúng như trong Chiến lược.

<% 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 %> 

Kể từ there's không sử dụng nhưng tôi đã mong được chuyển hướng tới '/' với 'username không đúng.' tin nhắn khi gửi biểu mẫu nhưng thay vào đó các trình duyệt vẫn ở trạng thái tải và không có gì xảy ra.

Một vài suy nghĩ ...

Tôi gọi to:

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

đâu nó nên được gọi là? Những gì tôi muốn ở đây là gọi nó là phần mềm trung gian khi tạo POST cho tuyến đăng nhập.

Nhật ký # 1 thực sự đang hiển thị đối tượng hộ chiếu.

Tôi có một vài ngày với điều này và tôi không thể tìm ra những gì đang xảy ra ... Tôi hy vọng ai đó có thể phát hiện ra điều gì đó, Cảm ơn nhiều !.

Trả lời

2

tôi thấy rằng bạn không làm bất cứ điều gì trong bạn router.route('/login').post (trừ console.log ing nhắn)

Làm điều này: http://passportjs.org/guide/

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

Hoặc với một custom callback (nếu bạn muốn giữ console.log của bạn), bạn trả lại hộ chiếu trả lại phương thức xác thực.

 
.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

Xin chào, tùy chọn đầu tiên là tùy chọn hoạt động tốt. Bây giờ tôi đang được chuyển hướng đến '/ đăng nhập'. Bây giờ tôi đang đấu tranh với việc xuất ra các thông báo lỗi đúng, nhưng đó sẽ là một câu hỏi khác tôi đoán, cảm ơn nhiều !. –

Các vấn đề liên quan