2014-04-02 17 views
5

Tôi đang cố gắng sử dụng passport.js trong ứng dụng node.js của mình để xác thực người dùng bằng MongoDB. Tôi chưa bao giờ thành công.Trả lại hộ chiếu-địa phương 400 lỗi, không bao giờ truy vấn cơ sở dữ liệu

Trong bài viết, tôi gửi "email": "[email protected]", "password": "test"

var passport = require('passport') 
    , LocalStrategy = require('passport-local').Strategy; 


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

passport.use(new LocalStrategy({ 
     emailField: 'email', 
     passwordField: 'passw', 
    }, 
function (emailField, passwordField, done) { 
    process.nextTick(function() { 
     db.collection(users, function (error, collection) { 
     if (!error) { 
      collection.findOne({ 
       'email': emailField, 
       'password': passwordField 
      }, function (err, user) { 
       if (err) { 
        return done(err); 
       } 
       if (!user) { 
        console.log('this email does not exist'); 
        return done(null, false); 
       } 
        return done(null, user); 
      }); 
     } else { 
      console.log(5, 'DB error'); 
     } 
     }); 
    }); 
})); 

Trong bộ sưu tập MongoDB 'của người sử dụng:

{ 
    "_id": { 
     "$oid": "533b5283e4b09d8a1148b4c4" 
    }, 
    "email": "[email protected]", 
    "password": "test" 
} 

Có lẽ tôi không kết nối với cơ sở dữ liệu đúng, tôi không chắc chắn.

Ngoài ra, khi tôi đăng nhập tất cả trong suốt hàm, tôi không nhận được bất kỳ nhật ký nào. Tôi chỉ cần nhận được

POST /login 302 7ms - 39b 
GET /fail 404 3ms 

Mọi đề xuất sẽ được đánh giá cao. Tôi nghĩ rằng tôi có thể thiếu một cái gì đó nhưng tôi không chắc chắn chính xác làm thế nào để cấu trúc này. Trong chức năng khác mà tôi đang viết để các cơ sở dữ liệu tôi phải sử dụng:

var uristring = 
process.env.MONGOLAB_URI || 
process.env.MONGOHQ_URL || 
'mongodb://<myurlhere>'; 

mongo.connect(uristring, function (err, db) { 

Đây là mã được cập nhật

yêu cầu sau đây:

, passport = require('passport') 
    , LocalStrategy = require('passport-local').Strategy; 

sử dụng các :

// all environments 
app.set('port', process.env.PORT || 3000); 
app.set('views', path.join(__dirname, 'views')); 
app.set('view engine', 'ejs'); 
app.use(express.favicon()); 
app.use(express.logger('dev')); 
app.use(express.json()); 
app.use(express.urlencoded()); 
app.use(express.methodOverride()); 
app.use(express.cookieParser()); 
app.use(express.session({ secret: 'keyboard cat'})); 
app.use(logfmt.requestLogger()); 
app.use(express.static(path.join(__dirname, 'public'))); 
app.use(passport.initialize()); 
app.use(passport.session()); 
app.use(app.router); 

// User authentication passport 

passport.use(new LocalStrategy(
    { 
     usernameField: 'email', 
     passwordField: 'passw', 
    }, 
    function (userId, password, done) { 
     // removed process.nextTick 
     console.log('Hey! no more 400 error!'); 
     db.collection(users, function (error, collection) { 
      if (!error) { 
       collection.findOne({ 
        'email': userId, 
        'password': password 
       }, function (err, user) { 
        if (err) { 
         return done(err); 
        } 
        if (!user) { 
         console.log('this email does not exist'); 
         return done(null, false); 
        } 
        return done(null, user); 
       }); 
      } else { 
       console.log(5, 'DB error'); 
      } 
     }); 
    } 
)); 

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

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

app.post('/login', passport.authenticate('local'), function(req, res) { 
    console.log('SUCCESS WOOOO'); 
    // If this function gets called, authentication was successful. 
    // `req.user` contains the authenticated user. 
    //res.redirect('/users/' + req.user.username); 
    }); 

Mã này luôn mang lại cho tôi POST /login 400 10ms khi đăng lên/đăng nhập. Tất cả các tuyến đường khác của tôi hoạt động tốt.

+0

Mã của bạn có trong một tệp hoặc được chia thành các mô-đun không? Tôi hỏi vì thứ tự mà bạn gọi là thứ có thể quan trọng. Ngoài ra, bạn có để lại 'process.nextTick' trong mã của bạn vì một lý do cụ thể không? Tôi tin rằng đó là trong mã ví dụ để 'giả' sự chậm trễ của một cuộc gọi DB nhưng không thực sự cần thiết. –

+0

Không, tôi vừa mới bắt đầu ứng dụng này và hiện tại chức năng này nằm trong app.js. Tôi có kế hoạch phá vỡ làm cho mô-đun này nhiều hơn sau khi tôi nhận được xác thực làm việc. – Joel

+0

Tôi đã thử rất nhiều thứ. Hiện tại tôi đang nhận được 404. 'app.post ('/ login', passport.authenticate ('local'), chức năng (req, res) {' 'console.log ('THÀNH CÔNG WOOOO');' '// Nếu chức năng này được gọi, xác thực thành công.' ' // req.user chứa người dùng đã xác thực.' '//res.redirect('/users/ '+ req.user.username);' '});' – Joel

Trả lời

1

Điều này đã trở thành vấn đề với Postman (tôi đã sử dụng soooo nhiều lần mà không gặp sự cố).

Khi tôi đã sử dụng biểu mẫu html thực thì nó hoạt động tốt. Có thể là một tiêu đề?

+0

Tôi đã gặp sự cố tương tự với Postman. Ngay cả với phần mở rộng Interceptor được bật, nó dường như không duy trì bất kỳ khái niệm nào về sự kiên trì phiên (thông qua cookie). –

17

1) Các sợ hãi HTTP 400 lỗi

Passport ném một lỗi HTTP 400 khi tên người dùng và/hoặc mật khẩu không được thiết lập.

Xem nguồn xung quanh dòng 75 trong đó Strategy.prototype.authenticate ném lỗi 'missing credentials'.

2) Chẩn đoán nguyên nhân

Trong code của bạn, bạn có khối:

passport.use(new LocalStrategy({ 
     emailField: 'email', 
     passwordField: 'passw', 
    }, 

Nhưng emailField không được công nhận bởi hộ chiếu. Trở lại trong source code, chúng ta thấy rằng hộ chiếu đang tuyển dụng:

this._usernameField = options.usernameField || 'username'; 
this._passwordField = options.passwordField || 'password'; 

Đây là lý do tại sao HTTP 400 đã được ném vào tình hình cụ thể này.

4) Xác định vấn đề

tôi đã chỉnh sửa mã ban đầu của bạn với những gì tôi tin rằng sẽ làm việc (tốt hơn) so với bản gốc. Tôi lấy một số tự do khi chỉnh sửa để loại bỏ các process.nextTick và đổi tên thành một vài điều. Tôi hy vọng bạn là một người tha thứ.:)

passport.use(new LocalStrategy(
    { 
     usernameField: 'email', 
     passwordField: 'passw', 
    }, 
    function (userId, password, done) { 
     // removed process.nextTick 
     console.log('Hey! no more 400 error!'); 
     db.collection(users, function (error, collection) { 
      if (!error) { 
       collection.findOne({ 
        'email': userId, 
        'password': password 
       }, function (err, user) { 
        if (err) { 
         return done(err); 
        } 
        if (!user) { 
         console.log('this email does not exist'); 
         return done(null, false); 
        } 
        return done(null, user); 
       }); 
      } else { 
       console.log(5, 'DB error'); 
      } 
     }); 
    } 
)); 

5) Một số lưu ý đóng cửa:

  • Bạn cũng có thể chỉnh sửa các thuộc tính hình thức đầu vào để phù hợp với giá trị mặc định mong đợi hộ chiếu của. Xem passport documentation để được hướng dẫn.
  • Tôi không thể đảm bảo cuộc gọi MongoDB sẽ hoạt động, nhưng điều này sẽ giúp bạn vượt qua HTTP 400. Nếu cuộc gọi cơ sở dữ liệu gặp sự cố, thì đó gần như chắc chắn là một câu hỏi mới vì một tập hợp mã và mô-đun khác có liên quan.
  • Khi sử dụng hộ chiếu, bạn nên truy cập trang GitHub của dự án và đọc qua nguồn. Thường có ý kiến ​​trong nguồn rằng (a) không có trong các tài liệu khác hoặc (b) gần với mã họ mô tả ... vì vậy mọi thứ được làm rõ cho bạn ngay cả khi bạn không phải là một guru mã hóa hay bất cứ điều gì.
+0

Tôi vẫn nhận được 400. Nếu tôi có thể vượt qua 400, tôi có thể đoán được điều này. Tôi vẫn không thể nhận bất kỳ nhật ký nào, ngoài 400. Tôi đã cập nhật bài đăng gốc với các thay đổi của mình. 'POST/login 400 10ms' – Joel

+0

Tôi đang đăng lên http: // localhost: 3000/login. Tất cả các tuyến đường khác của tôi đều hoạt động. Tôi đang gửi email và passw – Joel

+0

Tôi đã sao chép mọi thứ bạn đã đăng vào ứng dụng một trang dựa trên ví dụ về hộ chiếu địa phương để làm việc với express và mongo. Thời gian duy nhất tôi có thể nhận được nó là 400 khi các thuộc tính trong mẫu đăng nhập không phù hợp với những gì hộ chiếu đang mong đợi. Xin lỗi tôi không thể làm nhiều hơn nữa. Nếu bạn tìm ra nó, tôi muốn được nghe những gì đã xảy ra. –

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