2014-11-11 18 views
10

Tôi có đoạn code làm việc tiếp theo để xác thực thông qua các chiến lược hộ chiếu thuộc địa phương:Bạn có thể xác thực với Hộ chiếu mà không cần chuyển hướng không?

app.post('/api/login', passport.authenticate('local-login', { 
    successRedirect : '/api/login/success', 
    failureRedirect : '/api/login/error', 
    failureFlash : true 
    })); 
    app.get('/api/login/error', function(req, res) { 
    res.send(401, {error: req.flash('loginMessage')}); 
    }); 
    app.get('/api/login/success', function(req, res) { 
    res.send(200, {user: req.user}); 
    }); 

Tuy nhiên, tốt nhất là tôi muốn để xử lý các lỗi và thông điệp thành công từ một đường cao tốc, và không phải chuyển hướng đến hai tuyến đường phụ.

Điều này có khả thi không? Tôi đã thử bằng cách sử dụng một 'tùy chỉnh gọi lại' nhưng điều đó dường như lỗi ra trên serializing người dùng vì một lý do nào đó.

Trả lời

5

Bạn có thể sử dụng gọi lại tùy chỉnh, chẳng hạn như:

passport.authenticate('local', function (err, account) { 
    req.logIn(account, function() { 
     res.status(err ? 500 : 200).send(err ? err : account); 
    }); 
})(this.req, this.res, this.next); 

Trong đối tượng err bạn có thể tìm thấy tất cả các lỗi cần thiết, xuất hiện khi xác thực.

+0

Hoàn hảo! Bạn có biết rằng liệu có tương đương với 'req.logIn' để đăng ký địa phương không? Khác hơn thế, cảm ơn nhiều! – Hyra

+0

Bạn chỉ cần viết một chiến lược khác, sẽ gọi hàm để đăng ký người dùng mới – magmel

5

Bạn đang sử dụng Mongoose? Hãy thử thêm này để server.js bạn/index.js

var User = mongoose.model('User'); 
passport.use(new LocalStrategy(User.authenticate())); 
passport.use(User.createStrategy()); 
passport.serializeUser(User.serializeUser()); 
passport.deserializeUser(User.deserializeUser()); 

này đến tuyến đường của bạn index.js

var auth = require('./auth'); 
app.post('/api/auth/login', passport.authenticate('local'),auth.login); 

auth.js:

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

exports.login = function(req, res) { 
    var user = req.user; 
    req.login(user, function(err) { 
     //if error: do something 
     return res.status(200).json(user) 
    }); 
}; 

Thêm này để mô hình chỉ số .js

var passportLocalMongoose = require('passport-local-mongoose'); 
userSchema.plugin(passportLocalMongoose, { 
    usernameField: 'email', 
    usernameLowerCase: 'true' 
}); 

Tôi đang đưa ra rất nhiều giả định về cấu trúc và các gói ở đây. nhưng điều này nên làm việc

EDIT

Đối với callbacks tùy chỉnh:

app.get('/login', function(req, res, next) { 
    passport.authenticate('local', function(err, user, info) { 
    if (err) { return next(err); } 
    if (!user) { return res.redirect('/login'); } 
    req.logIn(user, function(err) { 
     if (err) { return next(err); } 
     return res.redirect('/users/' + user.username); 
    }); 
    })(req, res, next); 
}); 

Ở đây bạn thay vì res.redirect bạn có thể sử dụng giống như return res.status(404).json("Not Found)

Xem tài liệu cho biết thêm thông tin: http://passportjs.org/guide/authenticate/

+0

Mọi thứ đang hoạt động hết mức xác thực, chỉ là cuộc gọi lại (auth.login trong trường hợp của bạn) chỉ bị kích hoạt khi đăng nhập thành công. Tôi cũng muốn cung cấp tin nhắn khi nó không thành công, mà bạn không thể làm trong chiến lược. – Hyra

+0

Xin lỗi, tôi đã hiểu lầm. Tôi sẽ cập nhật câu trả lời của tôi – Clto

+0

Cảm ơn @Clto, bạn đã vô tình trả lời như 4 câu hỏi ngẫu nhiên tôi đã có –

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