2013-07-26 30 views
5

Điều này chưa được chú ý trước đây, vì liên lạc giữa máy khách và máy chủ, không có yêu cầu xác thực nào xảy ra qua XHR (chưa). Trong việc thực hiện một số kiểm thử tích hợp, tôi đang tạo ra các yêu cầu thực sự node-xmlhttprequest đến một cá thể thực của ứng dụng. Người dùng đang được xác thực trong yêu cầu đầu tiên và theo lý thuyết số nhận dạng duy nhất của người dùng và một số thông tin thích hợp khác được lưu trữ trong phiên (như tôi đã nói, điều này chỉ phù hợp với khách hàng thực, không cần xác nhận danh tính của họ trên XHR). Vì một số lý do, mặc dù các yêu cầu tiếp theo đang được kích hoạt với cùng một ID phiên, tôi không thể truy xuất phiên trong các yêu cầu tiếp theo và do đó không thể thấy người dùng được xác thực và điều này dẫn đến các thử nghiệm không thành công hành vi mong đợi không xảy ra, và HTTP 401 UNAUTHORIZED đang lấp đầy thiết bị đầu cuối.Express.js/Ứng dụng hộ chiếu tạo phiên mới cho mỗi yêu cầu, mặc dù ID phiên trong tiêu đề yêu cầu

Tôi đã nhìn thấy một vài câu hỏi trông giống như thế này, nhưng điều "cùng một ID phiên" dường như không có mặt trong số đó.

Tôi có cần thêm thủ công tiêu đề Set-Cookie cho tất cả các yêu cầu XHR không? Đó là khủng khiếp, có phải là một cách tốt hơn!

Vì vậy, những người như mã nguồn, đây là một số từ kiểm tra, bắn những yêu cầu này:

// Ensure logged in before sending request, to verify that authorized 
// users encounter the expected behaviour. 
jQuery.post(domain+'/login', {email:'[email protected]', password:'12345678'}, 
function(data,x,y){ 
    data.should.equal("true") 
    jQuery.ajax({url:domain+'/event', type:"POST", 
    name: "TestEvent", location: "TestVille", 
    startDate: new Date('2013-09-01'), startTime: '6:45 pm', 
    description: "Test Event #1", success: state.success, 
    error: state.error, completed: state.completed 
    }) 
}) 

Đăng nhập xảy ra, ID người dùng được ghi vào phiên (`req.logIn() nên làm điều này, và nó không báo cáo bất kỳ lỗi nào), việc tuần tự hóa ID người dùng không báo cáo bất kỳ lỗi nào và tôi vô cùng bối rối về lý do tại sao các yêu cầu tiếp theo sử dụng cùng một ID phiên không thể tìm thấy ID người dùng được tuần tự hóa.

Tôi thường không tham gia vào phát triển web, vì vậy điều này có thể hiển nhiên đối với một số người, nhưng tôi đã tìm kiếm câu trả lời cả ngày và đơn giản là không thể tìm được. Tôi đánh giá cao bất kỳ con trỏ nào, và rất vui khi cung cấp nhiều mã như tôi có thể, để minh họa cho vấn đề là gì.

Một vài điểm bổ sung mã mà có thể thích hợp:

serialization/deserialization của user ID (hiện thực hiện trong thể cách đơn giản nhất - Đây là từ rất sớm trong initiallization của middleware, sau initiallizing hộ chiếu và passpot.session() Và này hoạt động hoàn toàn tốt cho các yêu cầu phi XHR)

// Serialize user for passport session-store 
// Currently only serializing 'user_id' 
passport.serializeUser(function(user, done) { 
    done(null, user._id) 
}) 

// Deserialize user from session-store to provide 
// access to the User instance 
passport.deserializeUser(function(id, done) { 
    User.findById(id, function(err, user) { 
    done(err, user) 
    }) 
}) 

xác thực của người dùng thông qua các chiến lược địa phương:.

passport.use(new LocalStrategy({ 
    usernameField: "email", passwordField: "password", 
    passReqToCallback: true, failureFlash: true 
    }, 
    function(req, email, password, done) { 
    User.findByEmail(email, function(err, user) { 
     if(user) { 
     if(err) console.log(err) 
     if(user instanceof UserLocal) { 
      user.verifyPassword(password, function(err, match) { 
      if(err) console.log(err) 
      if(!match) { 
       return done(err, false, 
       "Username or password is incorrect.") 
      } 
      return done(null, user) 
      }) 
     } else { 
     var msg = "Account registered under " + user.providerName() 
       + ", please login using " + user.providerName() 
     return done(err, false, msg) 
     } 
    } else { 
     return done(err, false, "Username or password is incorrect.") 
    } 
    }) 
}) 

Và cuối cùng là yêu cầu mà viết thư cho phiên ở nơi đầu tiên:

function loginHelper(req, res, next) { 
    passport.authenticate('local', { 
    failureFlash:true, 
    failureRedirect: false, 
    successRedirect: false 
    }, 
    function(err, user, info) { 
    req.logIn(user, function(err) { 
     if(!err) err = {} 
     if(req.xhr) { 
     console.log(req.session) 
     res.status(200).end(err.message || "true") 
     } else { 
     if(err.message) req.flash('error', err.message) 
     else res.redirect('/') 
     } 
    }) 
    })(req, res, next) 
} 

Tôi biết có một số điều kỳ lạ như gửi lại trạng thái 200 không phụ thuộc vào tình trạng đăng nhập, nhưng tôi có thể khẳng định rằng người dùng serialized id được ghi vào phiên trên yêu cầu đăng nhập XHR ban đầu và không được deserialized trên các yêu cầu XHR tiếp theo.

Như tôi tin tôi đã đề cập, tôi khá thiếu kinh nghiệm trong lĩnh vực này và có thể sử dụng rất nhiều. Bất kỳ hỗ trợ nào sẽ được đánh giá cao, cảm ơn trước.

+1

nào bạn tìm thấy bất kỳ giải pháp – Sushant

Trả lời

0

Đó của giúp tôi Đầu tiên

app.use(express.static(__dirname + '/public', { maxAge: oneDay })); 

và cập nhật chức năng để không kích hoạt cơ sở dữ liệu

passport.serializeUser((user, done) => { 
     var sessionUser = { id: user.dataValues.id, fio: user.dataValues.fio, email: user.dataValues.localemail, role: user.dataValues.role, login: user.dataValues.login, position: user.dataValues.position } 
     done(null, sessionUser) 
    }) 

    passport.deserializeUser((sessionUser, done) => { 
     // The sessionUser object is different from the user mongoose collection 
     // it's actually req.session.passport.user and comes from the session collection 
     done(null, sessionUser) 
    }) 

https://www.airpair.com/express/posts/expressjs-and-passportjs-sessions-deep-dive

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