2010-04-23 25 views
28

Có thể nào để xác thực người dùng khi kết nối websocket được sử dụng?Xác thực WebSockets

Kịch bản ví dụ: Ứng dụng trò chuyện nhiều người dùng dựa trên web thông qua kết nối websocket được mã hóa. Làm thế nào tôi có thể đảm bảo (hoặc đảm bảo) rằng mỗi kết nối trong ứng dụng này thuộc về một số người dùng đã được xác thực và "không thể" bị mạo danh giả mạo trong quá trình kết nối.

Trả lời

3

SSL/TLS có thể được sử dụng để xác thực cả khách hàng và máy chủ bằng chứng chỉ X.509. Nó phụ thuộc vào nền tảng ứng dụng web mà bạn đang sử dụng. Trong apache, SSL_CLIENT_CERT environment variable có thể được kiểm tra tính hợp lệ đối với danh sách chứng chỉ đã biết hợp lệ. Điều này sẽ không yêu cầu sử dụng PKI đầy đủ và sẽ không yêu cầu bạn mua chứng chỉ cho từng khách hàng. Mặc dù tôi khuyên bạn nên sử dụng CA để quay lại chứng chỉ ssl của máy chủ.

+0

Bạn có nghĩa là chứng chỉ SSL sẽ được sử dụng cho kết nối HTTP và WebSocket tương ứng? – yojimbo87

+0

Tôi không đồng ý những gì rook nói. SSL/TLS có thể đảm bảo dữ liệu không bị thay đổi trong lớp truyền tải. Nhưng vấn đề ở đây là làm thế nào chúng ta có thể biết yêu cầu socket web là từ người dùng A không phải là người dùng B? Hình ảnh cả người dùng A và B đều được đăng nhập. Vì ổ cắm web không gửi cookie sau khi kết nối được thiết lập. Vì vậy, sau này, làm thế nào để web-socked này đảm bảo yêu cầu là từ người dùng thực sự A chứ không phải là người dùng B? –

41

Nếu bạn đã thực hiện xác thực phần không phải websocket của ứng dụng, chỉ cần chuyển cookie phiên cùng với thông điệp đầu tiên sau khi kết nối và kiểm tra cookie như bình thường.

CẢNH BÁO: Nó được chỉ ra rằng sau không hoạt động khi flashsockets được sử dụng:
Nếu bạn đang sử dụng socket.io, nó thậm chí còn dễ dàng hơn-the cookie được chuyển qua tự động kết nối, và có thể được truy cập như sau:

var io = require('socket.io'); 
var socket = io.listen(app); 
socket.on('connection', function(client){ 
    cookies = client.headers['cookie']; 
}); 
+4

Bạn có chắc chắn rằng điều này luôn hoạt động? Nếu Socket.IO rơi trở lại ổ cắm Flash, ví dụ, cookie trình duyệt sẽ không (AFAIK) được gửi đi. – Thomas

+1

@Thomas bạn nói đúng, có [vấn đề được gửi] (https://github.com/LearnBoost/socket.io/issues/101) đề cập rằng bạn nên thực hiện xác thực thông qua tin nhắn đầu tiên. –

+1

Đây là một phương pháp thực tế, nhưng nó yêu cầu trang web đăng nhập (và thiết lập cookie) đến từ cùng một nguồn gốc như WebSocket, vì nếu không cookie (được đặt từ trang đăng nhập) sẽ không được gửi trên Kết nối WebSocket. – oberstet