Hi đã viết quan sát và câu hỏi này vào this question trước đó, nhưng chỉ sau đó nhận thấy rằng đó là một câu hỏi cũ và "chết". Khi tôi thực sự thích một số hiểu biết từ người khác, tôi đang nhắc lại nó như một câu hỏi mới.Xác thực RESTful cho các ứng dụng web
Để đặt câu hỏi về cách thực hiện xác thực RESTfully, mọi người thường enthousiastically hét "Xác thực HTTP". Tuy nhiên, tôi không chắc liệu những người đó có bao giờ thử làm một ứng dụng dựa trên trình duyệt (thay vì một dịch vụ web từ máy đến máy) với REST. (Không có hành vi phạm tội có ý định - Tôi chỉ không nghĩ rằng họ đã từng phải đối mặt với những biến chứng)
vấn đề mà tôi tìm thấy bằng cách sử dụng HTTP Authentication về các dịch vụ RESTful sản xuất trang HTML để được xem trong một trình duyệt là:
- người dùng thường nhận được một hộp đăng nhập do trình duyệt tạo ra xấu xí, đó là veyr người dùng không thân thiện. bạn không thể thêm truy xuất mật khẩu, hộp trợ giúp, v.v.
- đăng xuất hoặc đăng nhập vào dưới một cái tên khác nhau là một vấn đề - các trình duyệt sẽ tiếp tục gửi thông tin xác thực để các trang web cho đến khi bạn đóng cửa sổ
- timeouts rất khó
Một bài viết rất sâu sắc rằng đã khắc phục những điểm theo điểm là here, nhưng điều này dẫn đến một số lô của tin tặc javascript dành cho trình duyệt cụ thể, giải pháp cho các giải pháp thay thế, v.v. Như vậy, nó cũng không tương thích về phía trước vì vậy sẽ yêu cầu bảo trì liên tục khi các trình duyệt mới được phát hành. Tôi không nghĩ rằng thiết kế sạch sẽ và rõ ràng, cộng với tôi cảm thấy nó là rất nhiều công việc phụ và đau đầu chỉ để tôi có thể phô trương biểu tượng REST của tôi cho bạn bè của tôi.
Tôi tin rằng cookie là giải pháp. Nhưng chờ đợi, cookie là ác, phải không? Không, chúng không phải là cách mà cookie được sử dụng thường là điều ác. Bản thân cookie chỉ là một phần thông tin phía máy khách, giống như thông tin xác thực HTTP mà trình duyệt sẽ theo dõi trong khi bạn duyệt. Và phần thông tin phía máy khách này được gửi tới máy chủ theo mọi yêu cầu, một lần nữa giống như thông tin xác thực HTTP sẽ là. Về mặt khái niệm, khác biệt duy nhất là nội dung của trạng thái phía máy khách này có thể được xác định bởi máy chủ như một phần của phản hồi của nó.
Bằng cách làm cho các buổi một nguồn tài nguyên RESTful chỉ với các quy tắc sau:
- Một phiên bản đồ một chìa khóa cho một user id (và có thể là một hành động-timestamp cuối cùng cho timeout)
- Nếu một phiên tồn tại, điều đó có nghĩa là khóa hợp lệ.
- Đăng nhập có nghĩa là Đăng lên/phiên, một khóa mới được đặt làm cookie
- Đăng xuất nghĩa là DELETEing/sessions/{key} (với POST quá tải, hãy nhớ rằng chúng tôi là trình duyệt và HTML 5 là một chặng đường dài để đi nào)
- xác thực được thực hiện bằng cách gửi chìa khóa như một cookie tại mọi yêu cầu và kiểm tra xem phiên tồn tại và có giá trị
sự khác biệt duy nhất HTTP authentication, bây giờ, đó là chìa khóa xác thực được tạo ra bởi máy chủ và được gửi tới máy khách, những người tiếp tục gửi nó trở lại, thay vì máy khách tính toán nó từ các thông tin đã nhập. Tôi cảm thấy rằng đây là một giải pháp đủ để hoạt động tốt, nhưng tôi phải thừa nhận rằng tôi không đủ chuyên gia bảo mật để xác định các lỗ tiềm ẩn trong lược đồ này - tất cả những gì tôi biết là hàng trăm ứng dụng web không RESTful sử dụng về cơ bản giao thức đăng nhập giống nhau ($ _SESSION inphp, HttpSession in j2ee, v.v.). Nội dung tiêu đề cookie được sử dụng đơn giản để giải quyết tài nguyên phía máy chủ, giống như ngôn ngữ chấp nhận có thể được sử dụng để truy cập tài nguyên dịch, v.v. Tôi cảm thấy nó giống nhau, nhưng có lẽ những người khác thì không? Bạn nghĩ gì chàng trai?
Xin chào, cảm ơn câu trả lời của bạn! Tuy nhiên, tôi không đồng ý rằng việc phơi bày một phiên có nghĩa là bạn giữ trạng thái máy khách trên máy chủ. Một phiên là "niềm tin rằng bất cứ ai biết một số K chính là người dùng U", mà rõ ràng là một niềm tin được tổ chức bởi máy chủ. Chắc chắn, nó không phải là dữ liệu rất tĩnh như các phiên một cách nhanh chóng đi không hợp lệ, nhưng ai nói trạng thái máy chủ phải được tĩnh? So sánh với hệ thống giỏ hàng RESTful. Nỗi lo lớn nhất của tôi là, việc "có khóa K có nghĩa là máy chủ cho rằng người dùng của bạn U" cảm thấy rất không an toàn với tôi, nhưng tôi không chắc chắn cách khắc phục điều đó. – skrebbel
một điểm rất thú vị. vẫn còn, một nền tảng của lập trình RESTful là người ta không yêu cầu máy chủ lưu trữ thông tin về phạm vi ứng dụng/ứng dụng. yêu cầu tài nguyên "không thể tận dụng bất kỳ ngữ cảnh được lưu trữ nào trên máy chủ". tôi thực sự thích ý tưởng này về trạng thái của khách hàng như một nguồn tài nguyên, nhưng tôi tiếp tục tin rằng đó là một sự vi phạm rõ ràng các nguyên tắc REST. – codemonkey
Tôi chưa bao giờ hoàn toàn hiểu tại sao thông số RESTful lại kiên quyết về trạng thái phi trạng thái, ngay cả khi nói đến xác thực người dùng. Perhaphs bạn có thể làm sáng tỏ. Trong thực tế, trường hợp duy nhất mà tôi sẽ "vi phạm" là người dùng auth becuse tôi có kế hoạch để chạy API của tôi ra khỏi Glassfish và theo dõi các phiên người dùng. Nếu phiên không mở, khách hàng sẽ nhận được mã trả lại tương ứng và sau đó anh ta có thể gửi thông tin đăng nhập qua xác thực thông báo. sau khi anh ta được xác thực, anh ấy là tốt để đi trong phiên cho đến khi nó hết hạn, tức là không có xác nhận lại quyền sở hữu đối với mọi yêu cầu REST. Tôi nghĩ đây là một sự thỏa hiệp hợp lý – amphibient