2016-04-22 14 views
6

Tôi đang xây dựng một angular2-login-seed sử dụng Passport.js với chiến lược OAuth để xác thực. Rõ ràng phương pháp xác thực mặc định với các công cụ này là sử dụng cookie HTTP được ký bởi express. Hộ chiếu, từ những gì tôi có thể nói, quản lý tiêu đề thực tế Set Cookie để diễn đạt có thể xác thực từng yêu cầu tiếp theo qua số request.isAuthenticated() và truy cập vào bộ dữ liệu theo hộ chiếu qua req.session.passport.dataHere.Cách xác thực bằng Node.js/Express + Passport + Websockets?

Tôi muốn kết hợp dữ liệu thời gian thực trong ứng dụng thông qua websockets. Điều này tất nhiên có nghĩa là một luồng socket đến từ máy chủ đến máy khách. thông tin liên lạc này là hoàn toàn tách biệt với một yêu cầu HTTP máy chủ thường xuyên ý nghĩa:

  1. Nó không chứa các cookie rằng tất cả các yêu cầu HTTP chứa

  2. Express không môi giới sự tương tác với ổ cắm, nó được quản lý với bất cứ điều gì thực hiện được sử dụng trong backend (sock.js, socket.io)

này làm cho nó khó khăn để sắp xếp xác thực giữa các yêu cầu HTTP để thể hiện, và dữ liệu WebSocket vào backend như họ đang có phương pháp riêng biệt s giao tiếp.

Từ nghiên cứu của tôi, điều này khiến tôi có hai lựa chọn. Một trong số đó là sử dụng library để cung cấp cho việc triển khai socket của tôi (tốt hơn là sock.js trên socket.io nhưng tôi cần phải nghiên cứu thêm) truy cập vào phiên thể hiện. Sau đó, tôi có thể xác thực các kết nối ổ cắm tuy nhiên tôi muốn. Vấn đề là tôi không có ý tưởng làm thế nào tôi sẽ nhận được các cookie nhanh vào dòng từ phía trước kể từ javascript không thể truy cập nó (HTTP chỉ cookie).

Một giải pháp phổ biến khác mà tôi đã thấy mọi người chuyển sang là sử dụng JWT (JSON Web Tokens). Các triển khai xoay quanh cửa hàng này JWT trong localstorage trên giao diện người dùng. Điều này là như vậy SPA (trong trường hợp của tôi Angular2 dịch vụ) có thể gửi nó với mọi yêu cầu xác thực máy chủ 'stateless' và chúng tôi có thể gửi nó thông qua một websocket để xác thực kết nối websocket là tốt (JS phía trước có quyền truy cập vào localstorage rõ ràng) . Một vài điều cần lưu ý khi suy nghĩ về việc triển khai này:

  1. Thậm chí có thể có các chiến lược OAuth hộ chiếu sử dụng JWT thay vì thông tin phiên thông thường không? Điều gì sẽ sửa đổi này đòi hỏi? Từ những gì tôi có thể nói với chiến lược Hộ chiếu, hãy sử dụng một số hình thức chiến lược cha mẹ OAuth1 hoặc OAuth2 để xác thực mặc định sử dụng cookie.

  2. Would lưu trữ thông tin quan trọng này trong localStorage mở ứng dụng lên đến lỗ hổng bảo mật (XSS, CSRF, vv)

  3. Nếu vậy, phương pháp phổ biến nhất mà tôi đã nhìn thấy là để lưu trữ các JWT trong một cookie vì vậy nó không thể dễ dàng truy cập, giả mạo hoặc giả mạo. Tuy nhiên điều này đặt tôi trở lại vị trí tôi đã ở trước khi sử dụng JWT, vì vậy có thể cũng không bận tâm.

  4. Điều này có nghĩa là tôi phải sử dụng một số loại kho lưu trữ quản lý trạng thái trong chương trình phụ trợ (ví dụ Redis) để quản lý xác thực và giải mã nội dung JWT? (Tôi không biết gì về Redis, vv).

Ý tưởng xác thực kết nối giữa yêu cầu HTTP máy chủ và dữ liệu ổ cắm là lạ nhưng có vẻ quan trọng để xác thực đúng kết nối ổ cắm. Tôi hơi ngạc nhiên một phương pháp dễ dàng hơn không tồn tại.Tôi đã thực hiện một số nghiên cứu và đã thấy những thứ như socketio-jwt, express-jwt, v.v. tuy nhiên tôi không biết liệu đây có phải là quá trình chuyển đổi có thể quản lý với chiến lược Hộ chiếu hay không. , hoặc nếu tôi đang đi về tất cả các sai!

Bất kỳ trợ giúp hoặc hướng dẫn nào cũng sẽ được đánh giá cao.

Trả lời

0

Sau đó, tôi có thể xác thực kết nối socket nhưng tôi muốn. Vấn đề là tôi không có ý tưởng làm thế nào tôi sẽ nhận được các cookie nhanh vào dòng từ phía trước kể từ javascript không thể truy cập nó (HTTP chỉ cookie).

Với express-socket.io-session auth phiên được thực hiện khi bắt tay và bắt tay là yêu cầu http, vì vậy ngay cả khi cookie của bạn chỉ là http, nó sẽ hoạt động. (Được thử nghiệm bởi chính tôi)

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