2011-06-18 47 views
19

Tôi biết rằng tôi có thể sử dụngCách truy cập phiên trong diễn đạt, bên ngoài req?

function(req, res) { 
    req.session 
} 

sử dụng nhanh. Tuy nhiên tôi cần truy cập phiên bên ngoài chức năng phản hồi. Tôi sẽ làm thế nào?

Tôi đang sử dụng socket.io để chuyển thông tin để thêm bài đăng và nhận xét. Vì vậy, khi tôi nhận được thông báo socket.io ở phía máy chủ, tôi cần xác minh người đăng thông tin bằng cách sử dụng phiên. Tuy nhiên vì điều này đang được thực hiện thông qua socket.io không có req/res.

+0

Những gì tôi đã làm chỉ là cho mỗi người dùng một uuid khi đăng nhập và thay đổi nó khá thường xuyên, sau đó sử dụng nó trong các thông báo ổ cắm để xác minh rằng họ thực sự là người mà họ đã nói. – MrBojangles

Trả lời

7

Sử dụng socket.io, tôi đã thực hiện việc này một cách đơn giản. Tôi giả sử bạn có một đối tượng cho ứng dụng của bạn giả sử MrBojangle, cho tôi nó được gọi là Shished:

/** 
* Shished singleton. 
* 
* @api public 
*/ 
function Shished() { 
}; 


Shished.prototype.getHandshakeValue = function(socket, key, handshake) {       
    if(!handshake) { 
     handshake = socket.manager.handshaken[ socket.id ];           
    } 
    return handshake.shished[ key ];                 
};                         

Shished.prototype.setHandshakeValue = function(socket, key, value, handshake) {     
    if(!handshake) { 
     handshake = socket.manager.handshaken[ socket.id ];           
    } 
    if(!handshake.shished) { 
     handshake.shished = {};                  
    } 
    handshake.shished[ key ] = value;                
}; 

Sau đó, trên phương pháp uỷ quyền của bạn, tôi đang sử dụng MongoDB cho việc lưu trữ phiên:

io.set('authorization', function(handshake, callback) { 
    self.setHandshakeValue(null, 'userId', null, handshake); 
    if (handshake.headers.cookie) { 
     var cookie = connect.utils.parseCookie(handshake.headers.cookie); 
     self.mongoStore() 
     .getStore() 
     .get(cookie['connect.sid'], function(err, session) { 
      if(!err && session && session.auth && session.auth.loggedIn) { 
       self.setHandshakeValue(null, 
          'userId', 
          session.auth.userId, 
          handshake); 
      } 
     }); 
    } 

Sau đó, trước khi lưu bản ghi trong mô hình, bạn có thể làm:

model._author = shished.getHandshakeValue(socket, 'userId');

+0

Điều này thực sự gần như chính xác những gì chúng tôi đã kết thúc! – MrBojangles

+0

Tôi rất vui vì nó đã giúp. – vimdude

+0

parseCookie sẽ không hoạt động nữa – UpTheCreek

0

Giả sử đang socket.io của bạn trông kinda như thế này:

io.on('connection', 
function(client) { 
    console.log(client.request) 
}); 

Yêu cầu là client.request như trong ví dụ trên.

Edit: Như một điều riêng biệt, có lẽ đây sẽ giúp: https://github.com/aviddiviner/Socket.IO-sessions

+0

Tôi thực sự vui mừng khi đọc phản hồi của bạn, nhưng sau khi in nội dung của "khách hàng.yêu cầu "biến Tôi thấy rằng vì một lý do nào đó, tôi thấy rằng mọi thứ khác đi qua chỉ là về mọi thứ khác sau đó phiên. Không chắc chắn tại sao thông tin phiên không được bao gồm, có vẻ như nó ở đâu. Ý tưởng nào khác? – MrBojangles

+1

@ user776796 bạn nên có thể truy cập vào cookie 'client.request.headers.cookie', và sử dụng nó để kiểm tra kho lưu trữ session của bạn – Harry

+0

Không may là không." headers.cookie "ở đó với cookie của tôi được liệt kê, tuy nhiên thông tin phiên của tôi không có trong đó – MrBojangles

0

Tôi tin rằng việc kiểm tra socket.handshake sẽ giúp bạn có phiên:

io.sockets.on('connection', function(socket) { 
    console.log(socket.handshake.sessionID); 
}); 

Khi client thiết lập một kết nối ổ cắm với ổ cắm của bạn .io server, máy khách gửi yêu cầu bắt tay WebSocket. Những gì tôi đang làm ở trên là lấy ID phiên từ cái bắt tay.

6

Tôi nghĩ rằng tôi có câu trả lời khác.

mã:

var MongoStore = require('connect-mongo')(session); 
var mongoStore = new MongoStore({ 
    db:settings.db,   //these options values may different 
    port:settings.port, 
    host:settings.host 
}) 
app.use(session({ 
    store : mongoStore 
    //here may be more options,but store must be mongoStore above defined 
})); 

thì bạn nên xác định một khóa phiên tại req, giống như:

mã:

req.session.userEmail; 

cuối cùng, bạn có thể nhận được nó theo cách này:

mã:

var cookie = require("cookie"); //it may be defined at the top of the file 
io.on("connection",function(connection){ 

var tS = cookie.parse(connection.handshake.headers.cookie)['connect.sid']; 
var sessionID = tS.split(".")[0].split(":")[1]; 
mongoStore.get(sessionID,function(err,session){ 
     console.log(session.userEmail); 
}); 
} 

Tôi đã thử nghiệm nó ngày hôm qua, nó hoạt động tốt.

+0

Giải pháp tuyệt vời – jordajm

+0

Holy crap, hoạt động này 3 năm sau và đây vẫn là một câu trả lời chắc chắn. Đá vào mông. –

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