8

ellou 'Làm cách nào để xác thực người dùng trong WebSocket 2.0 của Play?

Tôi có phương pháp Play WebSocket chung đang hoạt động như mong đợi, nhưng tôi cần phải xác thực người dùng. Thật không may khi cố gắng thậm chí Cách đơn giản nhất để xác định người sử dụng trong phương pháp này:

public class Application extends Controller { 
    public static WebSocket<JsonNode> connect() { 
     return new WebSocket<JsonNode>() { 

      @Override 
      public void onReady(final WebSocket.In<JsonNode> in, final WebSocket.Out<JsonNode> out) { 
       User logged = User.findByUsername(Http.Context.current().request().username()); 
       // ... 
      } 
     }; 
    } 
} 

tôi nhận được một lỗi:

java.lang.RuntimeException: There is no HTTP Context available from here. 

workaround hiện tại của tôi là phải vượt qua ngẫu nhiên, định danh duy nhất để xem và lưu nó trong mô hình tài , hơn là tôi có thể kết nối với socket từ khung nhìn và tìm người dùng với định danh đã cho, nhưng điều này không hoàn hảo vì chỉ có thể có một kết nối WebSocket cho mỗi người dùng và cũng không ngăn chặn giả mạo.

Tôi nên xác thực người dùng và ngăn chặn tấn công giả mạo bằng cách nào?

Trả lời

0

Như dữ liệu tôi muốn gửi rất nhạy cảm và trong trường hợp này bảo mật là quan trọng với tôi hơn hiệu suất, cuối cùng tôi đã sử dụng thông báo hai bước, trước tiên gửi qua id WebSocket của thư và một số dữ liệu không quan trọng và sau đó tìm nạp thông qua AJAX và phần thân thư hành động được bảo mật sau khi xác thực của người dùng.

Câu hỏi vẫn còn mở: Tất nhiên nếu có sẽ là gợi ý khác tôi sẽ thay đổi phiếu bầu của tôi :)

1

Tôi không biết mã nguồn của bạn ở đâu, nhưng bạn có thể truy cập yêu cầu HTTP khi khởi tạo Websocket (kết nối đầu tiên), nghĩa là bạn chỉ có thể kiểm tra xác thực khi bắt đầu kết nối socket websocket (cuộc gọi tiếp theo sẽ không sử dụng HTTP, đó là cách hoạt động của Webscokets).

Vì vậy, ví dụ, trong điều khiển của bạn, bạn có thể có một cái gì đó như thế này:

public class Application extends Controller { 

    public static WebSocket<JsonNode> connect() { 

     Logger.info("Username from request = " + request().username()); 

     return new WebSocket<JsonNode>() { 

      @Override 
      public void onReady(final WebSocket.In<JsonNode> in, final WebSocket.Out<JsonNode> out) { 
       // .... 

      } 

     }; 
    } 

} 
+0

Tôi đã chỉnh sửa mẫu của mình, để vừa với mã của bạn, như bạn có thể thấy tôi đã đặt nó trong 'onReady (...)', nó trả về ngoại lệ, khi được đặt trước 'return' nó trả về null. Tất nhiên cả hai dòng ('request(). Username()' và 'Http.Context.current() ...') trả về tên người dùng hợp lệ trong hành động chung. – biesior

+0

Bạn không có bất kỳ loại chú thích nào về các hành động phổ biến? Bạn đặt tên người dùng như thế nào? –

+0

Cả hai hành động đều nằm trong cùng một bộ điều khiển, chú thích cho lớp Secured.class được đưa vào bộ điều khiển, chứ không phải để thao tác nên cả hai đều sử dụng chúng theo cùng một cách. Tôi nghĩ rằng vấn đề là hành động phổ biến được Http.Context và WebSocket là không. – biesior

1

Bạn đã thử lấy ID người dùng xác thực từ các phiên HTTP để thay thế? Bối cảnh dường như có sẵn tại thời điểm đó.

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