2013-07-05 46 views
13

Tôi là người mới đến REST webservice và vừa tạo dịch vụ web đầu tiên của tôi.
Trong dịch vụ của tôi, người dùng có thể tạo hồ sơ thông qua biểu mẫu đơn giản cung cấp Tên người dùng và mật khẩu mong muốn của mình.Cách sử dụng Xác thực HTTP cơ bản với REST webservice (Java + Jersey)?

Bây giờ, làm cách nào để kiểm tra thông tin đăng nhập của người dùng khi người dùng đăng nhập ??
Tôi có nghĩa là tôi có một biểu mẫu đơn giản xác nhận người dùng đã đăng nhập nhưng cách xác thực người dùng khi anh ta thực hiện nhiều thao tác hồ sơ khác nhau của việc thêm/cập nhật/xóa ??

Ví dụ:
Trong FB, bạn đăng nhập và lưu trữ cookie có thông tin đăng nhập của bạn và khi bạn thực hiện các hoạt động như "Trạng thái bài đăng", nhắn tin cho bạn bè ... v.v ... nó không hỏi cho thông tin đăng nhập của bạn nữa vì nó có cookie mà thông tin đăng nhập của bạn ở đó và nó chỉ sử dụng cookie đó ...

Nhưng trong REST chúng tôi không sử dụng cookie, vì vậy tùy chọn tiếp theo là tiêu đề HTTP. Và tôi muốn biết làm thế nào để gửi và nhận thông tin người dùng qua tiêu đề HTTP .ie
Basic HTTP Auth

+0

Bạn có cần thêm phản hồi về điều này không? Nếu không và câu trả lời của tôi hữu ích cho bạn, bạn có thể chấp nhận bài đăng của tôi cho câu hỏi này. Greetz :) – benjiman

Trả lời

29

Side Khách hàng

Để gửi thông tin đến các API bạn sử dụng các tiêu đề HTTP Authorization, quy định cụ thể các chứng chỉ dưới dạng Basic username:password. Tên người dùng: mật khẩu Chuỗi phải được mã hóa bằng cách sử dụng lược đồ mã hóa có tên là Base64. Vì vậy, một tiêu đề ví dụ có thể trông giống như thế này:

Authorization: Basic d2lraTpwZWRpYQ== 

Như thông số kỹ thuật còn lại khẳng định rằng việc giao tiếp client-server nên không quốc tịch, bạn phải bao gồm tiêu đề với các thông tin trên tất cả các yêu cầu. Thông thường, bạn sẽ sử dụng cookie phiên ở phía máy khách để xác định người dùng để không phải nhập thông tin đăng nhập của mình vào mọi yêu cầu.

Server Side

Để kiểm tra các thông tin bên REST của Dịch vụ Jersey của bạn, bạn cần phải nắm bắt và ngăn chặn tất cả các yêu cầu gửi đến. Jersey cung cấp một khái niệm gọi là ContainerRequestFilters để thực hiện điều này. Ví dụ, nếu bạn sử dụng Tomcat bạn có thể thêm các bộ lọc thuộc loại này bên trong định nghĩa servlet của bạn trong web.xml của bạn như thế này:

<init-param> 
    <param-name>com.sun.jersey.spi.container.ContainerRequestFilters</param-name> 
    <param-value>your.package.BasicAuthFilter</param-value> 
</init-param> 

Các tham chiếu lớp BasicAuthFilter nhu cầu để thực hiện giao diện Jerseys ContainerRequestFilter và ghi đè lên các phương pháp public ContainerRequest filter(ContainerRequest request). Bên trong phương pháp này về cơ bản bạn sẽ làm như sau:

  • lấy các chứng chỉ Base64 mã hóa từ tiêu đề ủy quyền được yêu cầu
  • giải mã chúng (tức là sử dụng javax.xml.bind.DatatypeConverter.parseBase64Binary())
  • sử dụng UserDao của bạn (hoặc nhà cung cấp nguồn dữ liệu khác) để kiểm tra xem thông tin đăng nhập có hợp lệ không
  • mã trạng thái trả lại 401 Unauthorized nếu xác thực không thành công (ví dụ:throw new WebApplicationException(Status.UNAUTHORIZED))
  • nếu các chứng chỉ có giá trị, chỉ cần trả lại yêu cầu để ủy thác nó vào Resource Jersey đó là trách nhiệm xử lý nó

Bạn có thể tìm thấy một ví dụ rất tốt trong this bài đăng blog.

+2

ví dụ trong liên kết được cung cấp chỉ hoạt động với JERSEY 1.x. Và nó không hoạt động với 2.X. – lonelyloner

+1

Bài đăng trên blog được liên kết chứa liên kết tới ví dụ cho Jersey 2.x: https://simplapi.wordpress.com/2015/09/17/jersey-jax-rs-implements-a-http-basic-auth-decoder -cho-2-x-chi nhánh / – CalumMcCall