2012-01-09 46 views
26

Vì vậy, tôi đang phát triển một dịch vụ web REST bằng RESTeasy và Google App Engine. Câu hỏi của tôi không liên quan đến GAE, nhưng tôi đã đề cập nó trong trường hợp nó quan trọng. Điều đó xảy ra một cách tự nhiên là tôi cần phải bảo vệ tài nguyên và người dùng của riêng mình (không phải của Google).Xác thực HTTP REST - Cách thực hiện?

Đảm bảo một webservice REST có vẻ như là một chủ đề rất gây tranh cãi, hoặc ít nhất là một chủ đề rất tự do. REST không áp đặt bất kỳ tiêu chuẩn nào về vấn đề này. Từ những gì tôi đã nghiên cứu trên web và văn học, có ít nhất 3 phương pháp mà tôi nghĩ rằng có thể phù hợp trong ứng dụng của tôi:

  • HTTP Basic (hỗ trợ SSL)
  • HTTP Digest (với SSL)
  • OAuth

OAuth có vẻ như cách tiếp cận đầy đủ nhất. Nhưng tôi không nghĩ rằng sự phức tạp như vậy là cần thiết vì tôi sẽ không cần phải cho phép bất kỳ ứng dụng của bên thứ ba nào. Đây là một dịch vụ web chỉ được sử dụng bởi các ứng dụng khách của riêng tôi.

HTTP BasicHTTP Digest xuất hiện như những người đơn giản nhất trên web, nhưng thực tế là tôi đã không bao giờ tìm thấy một thực hiện cụ thể trong số họ sử dụng RESTeasy, ví dụ. Tôi đã tìm thấy this pagethis one trong tài liệu của RESTeasy. Họ thực sự rất thú vị, nhưng họ nói ít hoặc không có gì về chủ đề này (HTTP Basic hoặc Digest).

Vì vậy, ở đây tôi đang hỏi:

Làm thế nào để đảm bảo WebService tôi sử dụng HTTP Basic hoặc Digest trong RESTeasy?

Có lẽ nó đơn giản đến mức không đáng nhắc đến trong tài liệu hoặc ở bất kỳ nơi nào khác? Ngoài ra, nếu có ai đó có thể cung cấp cho tôi một số thông tin chi tiết về vấn đề bảo mật các dịch vụ web RESTful, nó có thể hữu ích.

Tôi có chọn đúng cách tiếp cận không?

+0

Hãy xem http://stackoverflow.com/questions/6296740/authentication-in-play-and-resteasy –

+1

Xin lỗi, nhưng bạn đang làm một vài điều sai ở đây. 1) bạn đã cập nhật câu hỏi bằng câu trả lời/câu trả lời một phần. Nếu bạn đã tìm thấy câu trả lời là * không * được cung cấp bởi bất kỳ ai khác, bạn nên thêm câu trả lời đó và đánh dấu nó là được chấp nhận. Nếu người khác cung cấp câu trả lời, thì bạn nên đánh dấu * rằng * câu trả lời là được chấp nhận. 2) Nếu bạn có câu hỏi * bổ sung *, sau đó hỏi * một câu hỏi * khác, không * thêm * vào câu hỏi của bạn sẽ làm mất hiệu lực câu trả lời đã đưa ra. – casperOne

+1

@casperOne, bạn nói đúng, xin lỗi. Đây là câu hỏi đầu tiên của tôi ở đây trong Stack Overflow. Cảm ơn. – miguelcobain

Trả lời

6

tôi đã quản lý để thực hiện điều này bằng cách sử dụng đánh chặn RESTeasy của. Về cơ bản các yêu cầu bị chặn bằng cách sử dụng một người nghe như lớp học. Trong lớp này, tôi kiểm tra các tiêu đề HTTP của yêu cầu và sau đó tiến trình Basic-Auth bình thường tiếp tục.

Liên kết hữu ích:

http://en.wikipedia.org/wiki/Basic_access_authentication
Passing parameters in the message header with a REST API
http://www.alemoi.com/dev/httpaccess/ (phần Servlet)

Tôi hy vọng điều này sẽ giúp bất cứ ai.

Cảm ơn.

+0

Tôi chỉ muốn thêm rằng đôi khi sử dụng công cụ xác thực từ vùng chứa có thể phù hợp hơn. Để xem tomcat [trang này] (http://tomcat.apache.org/tomcat-7.0-doc/realm-howto.html) về ** cõi **. – miguelcobain

+0

Ngoài ra, đừng quên xem xét Spring Security và Apache Shiro! – miguelcobain

0

Bạn có thể xem sử dụng OAuth 2. Nó đơn giản hơn đáng kể sau đó là OAuth 1 và đang được sử dụng trên REST API lớn bởi Facebook và Google.

+1

Tôi nghĩ tốt khi sử dụng OAuth 2 nếu người dùng cuối sẽ phải cấp quyền truy cập cho các ứng dụng của bên thứ ba (như trường hợp với FB), nhưng nếu ứng dụng khách của API là ứng dụng của riêng họ và họ là một phần của cùng một hệ sinh thái, tôi nghĩ rằng OAuth là không cần thiết. – middlehut

+0

Giống như @Lyuben cho biết, các ứng dụng duy nhất sẽ tiêu thụ dịch vụ này là của riêng tôi. Tại sao OAuth nên phù hợp trong trường hợp này? – miguelcobain

+0

Tôi đã đọc "để bảo mật tài nguyên và người dùng của riêng mình" để ngụ ý rằng bạn có người dùng sẽ sử dụng OAuth. Nếu bạn là người tiêu dùng duy nhất hơn OAuth thì quá mức cần thiết. BasicAuth sẽ ổn thôi. – abraham

6

Cách đơn giản nhất để bảo mật API REST là sử dụng xác thực HTTP cơ bản qua SSL. Kể từ khi các tiêu đề được mã hóa không có nhiều điểm của việc sử dụng Digest. Điều này sẽ làm việc tuyệt vời miễn là bạn có thể giữ mật khẩu an toàn trên (các) ứng dụng khách.

+0

Vâng, tôi đã hiểu và nó được giải thích trong câu hỏi. Nhưng cảm ơn bạn đã làm rõ. Câu hỏi là cách tốt nhất để thực hiện nó bằng cách sử dụng RESTeasy. – miguelcobain

+0

Xin lỗi, đó là những gì tôi nhận được để lướt qua. Có một số thư rác trong liên kết đầu tiên về '' BASIC '' nhưng tôi không thấy cách cấu hình tên người dùng/mật khẩu. Có lẽ bạn nên gắn lại thẻ này là "java" để nhiều người xem hơn. –

+0

Vâng, đó là điều duy nhất tôi thấy. Tôi sẽ cần sử dụng phần phụ trợ dữ liệu của mình để lưu trữ và truy xuất người dùng. Tôi đã thêm thẻ "java". – miguelcobain

1

bạn chắc chắn sẽ phải đối mặt với nguy cơ bảo mật khi sử dụng bất kỳ phương pháp xác thực nào không có SSL.

nhưng nếu bạn đã sử dụng SSL, bạn thường sẽ bị hiệu suất kém.

Oauth thực sự là giải pháp để cho phép bên thứ ba truy cập vào dịch vụ web của bạn.

do sự lựa chọn hạn chế, giải pháp của tôi để một webservices hiện yêu cầu xác thực sử dụng sự kết hợp của SSL + cơ bản

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