2009-07-16 29 views
24

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ố 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?

Trả lời

4

Một câu hỏi thú vị. Tôi đang hoàn thành việc triển khai REST API ngay bây giờ - đã sử dụng mod_rewrite và PHP. Nó sử dụng HTTP auth cơ bản trên HTTPS. Cho đến nay chúng tôi đang làm việc trên một khách hàng Palm Pre. Các chàng trai phát triển khách hàng đó đã được một chút đặt ra tại có để theo dõi các thông tin người dùng để gửi với mỗi yêu cầu.

Ý tưởng hiển thị SESSION dưới dạng tài nguyên là một tài nguyên thú vị. Bao gồm nó vẫn sẽ vi phạm các nguyên tắc RESTful nghiêm ngặt. Ngay cả khi bạn hiển thị SESSION dưới dạng tài nguyên, bạn vẫn sẽ sử dụng máy chủ để theo dõi trạng thái máy khách. Nghiêm ngặt tuân thủ REST có lẽ sẽ yêu cầu sử dụng cookie, vì đó là bộ nhớ liên tục phía máy khách có sẵn cho bạn từ trình duyệt. Vấn đề là để bạn tạo ứng dụng JavaScript (hoặc FLash?) Để quản lý các yêu cầu HTTP phía máy khách nếu bạn không muốn người dùng tương tác với việc thu thập thông tin xác thực HTTP do trình duyệt triển khai.

Một công cụ tôi thấy hữu ích là công cụ REST Client for Firefox ... nhưng tôi vẫn nhập thông tin đăng nhập của mình vào cửa sổ bật lên trình duyệt chuẩn ngay cả khi tôi đang sử dụng.

Tôi phải thừa nhận bao gồm một số lỗi trong quá trình triển khai. Nếu tất cả những gì bạn đang làm là sử dụng các phiên để cho phép các nhà phát triển tiềm năng kiểm tra/duyệt API của tôi hoặc tôi không nghĩ rằng việc sử dụng xác thực dựa trên phiên là một vấn đề lớn. Purists sẽ không đồng ý tôi chắc chắn. Thực sự đó là những gì này đi xuống ... đây thực chất là một lập luận học thuật. Trong các tình huống thực tế, bạn phải làm những gì có hiệu quả.

... thêm vào này trên 2012/10/23 ...

Các RESTful phương pháp nhấn mạnh vào việc tạo cho khách hàng theo dõi trạng thái của nó là không chỉ học tập. Nó có ý nghĩa quan trọng đối với khả năng mở rộng và khả năng giải quyết của các tài nguyên tiếp xúc. Khi tôi nói điều này, tôi giả định rằng theo trạng thái máy khách, chúng ta đang nói về các thuộc tính cụ thể cho một người dùng yêu cầu có ảnh hưởng đến các phản hồi do (các) giao diện RESTful phát hành. Một trong những điểm mạnh của REST là khả năng giải quyết của nó. Khi bạn thực hiện các phản ứng của nó theo bất kỳ cách nào phụ thuộc vào thông tin không được truyền trong yêu cầu bạn bắt đầu sứt mẻ ở đó. Chỉ là một suy nghĩ ... 3 năm sau, lol.

+1

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

+0

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

+0

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

1

Tôi biết đây là một câu hỏi cũ, nhưng tôi nghĩ rất nhiều câu hỏi ở đây đã được giải quyết trong các lĩnh vực khác nhau.Đặc biệt, tôi nghĩ rằng các OAuth 2.0 Protocol đã được xem xét rất nhiều những câu hỏi này; Tôi không cảm thấy đủ thẩm quyền để cung cấp tóm tắt câu trả lời ở đây, nhưng trang web được liên kết có rất nhiều trường hợp sử dụng khác nhau được gọi rõ ràng, có vẻ rất hữu ích cho câu hỏi này, ngay cả khi OAuth 2.0 đầy đủ không thực sự cần thiết đây.

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