Tôi biết điều này hơi cũ, nhưng đối với người đọc trong tương lai ngoài cách tiếp cận phân tích cookie và truy xuất phiên từ bộ nhớ (ví dụ: passport.socketio), bạn cũng có thể xem xét cách tiếp cận dựa trên mã thông báo.
Trong ví dụ này tôi sử dụng JSON Web Tokens khá chuẩn. Bạn phải cung cấp cho khách hàng trang được dấu hiệu, trong ví dụ này tưởng tượng một endpoint xác thực mà trả JWT:
var jwt = require('jsonwebtoken');
// other requires
app.post('/login', function (req, res) {
// TODO: validate the actual user user
var profile = {
first_name: 'John',
last_name: 'Doe',
email: '[email protected]',
id: 123
};
// we are sending the profile in the token
var token = jwt.sign(profile, jwtSecret, { expiresInMinutes: 60*5 });
res.json({token: token});
});
Bây giờ, máy chủ socket.io của bạn có thể được cấu hình như sau:
var socketioJwt = require('socketio-jwt');
var sio = socketIo.listen(server);
sio.set('authorization', socketioJwt.authorize({
secret: jwtSecret,
handshake: true
}));
sio.sockets
.on('connection', function (socket) {
console.log(socket.handshake.decoded_token.email, 'has joined');
//socket.on('event');
});
Các middleware socket.io-JWT hy vọng token trong một chuỗi truy vấn, vì vậy từ khách hàng bạn chỉ cần gắn nó khi kết nối:
var socket = io.connect('', {
query: 'token=' + token
});
tôi đã viết một lời giải thích chi tiết hơn về meth này od và cookie here.
Nguồn
2014-01-16 15:03:06
Bạn có sử dụng Socket.IO như một độc lập không?Trình xác thực không tạo cookie, nó chỉ chuyển chúng tới Socket.IO. – hexacyanide
@hexacyanide tại thời điểm tôi đang sử dụng express với socket.io. Express chỉ tạo cookie xác thực. Tôi không sử dụng nó định tuyến, middleware, .... Session giữa express và socket.io được chia sẻ với kết nối-redis. Tôi nghĩ rằng đó là một cách quá phụ thuộc lớn để sử dụng thể hiện chỉ để ký cookies. Vì vậy, tôi đang tìm một giải pháp mà không phụ thuộc vào thể hiện (kết nối). Tôi có thể thực hiện thủ tục xác thực không được kiểm tra và không an toàn của riêng mình nhưng như Golo Roden cho rằng nó không được khuyến khích. – bekite
Nói cách khác, bạn muốn triển khai chạy trên máy chủ HTTP cơ sở? Bởi vì nếu bạn không muốn sử dụng hoàn toàn máy chủ HTTP, bạn có muốn sử dụng cookie không? – hexacyanide