2013-10-23 18 views
7

Tôi đã hướng dẫn này màu đỏ: http://howtonode.org/socket-io-auth. Nó cho thấy cách xác thực người dùng bằng cách sử dụng express và socket.io. Nhưng có cách nào để xác thực người dùng chỉ bằng socket.io mà không cần phải thể hiện không?xác thực người dùng bằng cách sử dụng socket.io

chỉnh sửa:

Đối xử lý phiên tôi sử dụng RedisStore (https://github.com/LearnBoost/Socket.IO/wiki/Configuring-Socket.IO). Whats left là một module để tạo cookie xác thực. Có ai biết về việc thực hiện socket.io tôi có thể sử dụng để tạo một cookie xác thực giống như bạn có thể thực hiện với việc xử lý phiên không?

+0

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

+0

@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

+0

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

Trả lời

9

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.

+1

Vì vậy, đối với điều này, mã thông báo không được sử dụng như một phiên? Như trong, mã thông báo không được lưu trữ ở bất cứ nơi nào ngoại trừ khách hàng? Đang giải mã một mã thông báo bằng cách sử dụng một bí mật giống nhau (về mặt bảo mật) khi sử dụng mã thông báo làm id phiên trong một cửa hàng phiên? Tôi chỉ đang cố gắng che giấu đầu của mình xung quanh lợi ích của phương pháp dựa trên mã thông báo này. – funseiki

+0

@ José F. Romaniello Mặc dù tôi đã yêu cầu xác thực dựa trên cookie, tôi sẽ chấp nhận câu trả lời của bạn. Hồi đó năm 2013, tôi nghĩ rằng cookie là cách đi. Sau khi đọc cho bạn bài viết (và một số khác trên auth0), tôi sẽ cung cấp cho các thẻ thử. – bekite

3

Thay vào đó hoặc kết nối mã xác thực và mã xử lý phiên theo cách thủ công, tôi khuyên bạn nên sử dụng mô-đun chuyên dụng, chẳng hạn như session.socket.io (nhưng xin lưu ý rằng đây cũng là một mô-đun yêu cầu Express).

Tôi đoán (nhưng không biết) rằng đã có downvotes vì ​​bạn cần một số loại xử lý phiên, và bạn có thể không muốn làm điều này bằng tay là tốt ;-). Do đó nó là một ý tưởng khá tốt để gắn bó với Express ở đây.

Tuy nhiên, đây là một câu hỏi thú vị, mặc dù tôi không thể trả lời về cách thực hiện mà không có Express.

+0

để xử lý phiên tôi sử dụng RedisStore. Tìm thấy nó trên https://github.com/LearnBoost/Socket.IO/wiki/Configuring-Socket.IO. – bekite

1

Tôi khá mới đối với node.js, chỉ mới bắt đầu cách đây vài ngày. và tôi chỉ có thể trả lời phần đầu tiên cho câu hỏi, đó là xác thực người dùng mà không cần sử dụng express. và tôi cũng chưa xử lý theo phiên.
lý do tôi vẫn trả lời câu hỏi này là để giúp đỡ những người khác mới vào nút với giải pháp thay thế đơn giản hơn để bắt đầu.

giải pháp tôi hiện đang sử dụng trong dự án học tập của mình (trò chuyện dựa trên socket.io, còn gì khác?) Đang sử dụng máy chủ http để xác thực.
nếu bạn không thể nhận được xác thực hợp lệ trên máy chủ http, bạn sẽ không bao giờ có quyền truy cập vào trang bằng giao diện socket.io.

xác thực người dùng trên máy chủ http được xử lý bằng cách đọc một số dữ liệu POST. chỉ khi dữ liệu POST là dữ liệu người dùng hợp lệ, người dùng được phép chuyển sang trò chuyện nơi giao diện socket.io là.

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