2010-10-08 32 views
8

Tôi đang phát triển API REST và tôi cần chuyển mã hóa để xác thực thư cho mỗi yêu cầu trong quá trình đăng ký (mã hóa MAC từ khóa bí mật). Tôi đã suy nghĩ về việc đặt chúng trong tiêu đề thư để tránh thêm thông tin phi dữ liệu trong nội dung thư chứa đối tượng đã đăng/truy xuất (XML hoặc JSON).Truyền tham số trong tiêu đề thư bằng REST API

Đây có phải là phương pháp hay nhất không?

Tôi có thể thêm bao nhiêu thông số mình muốn vào tiêu đề không? Tôi đã đọc mà tôi phải tiền tố chúng với "x-". Hành vi của tham số này chính xác giống với thông số Đường dẫn hoặc Truy vấn?

Tôi đang sử dụng Jersey.

Cảm ơn sự giúp đỡ của bạn.

+0

Câu hỏi bổ sung: tốt hơn là nên sử dụng thông số tiêu đề hiện có (Ngày, ủy quyền) hoặc để tạo các tham số cụ thể (x-app-date, x-app-auth)? – Zofren

Trả lời

8
  1. Có, tôi cho rằng có thể chấp nhận thông số tiêu đề để chuyển dữ liệu nhất định. Tiêu chuẩn JAX-RS thậm chí còn xác định @HeaderParam annotation. Đơn giản example of @HeaderParam.

  2. Đó là quy ước để thêm tiền tố tiêu đề http không chuẩn với "x-".

Tôi có tình huống tương tự với bạn: Tôi cần chuyển mã thông báo người dùng và ID ứng dụng bằng mọi cuộc gọi REST. Để tránh trùng lắp mã, tôi đã triển khai PreProcessInterceptor (Tôi đang sử dụng Resteasy), thông qua đó tất cả các yêu cầu REST được định tuyến. Nếu mã thông báo người dùng không hợp lệ và nếu người dùng không có đặc quyền đối với ID ứng dụng đã cho, thì tôi trả lại 401 trái phép. Mã của tôi trông tương tự như thế này (phiên bản được đơn giản hóa):

@Provider 
@ServerInterceptor 
public class RestSecurityInterceptor implements PreProcessInterceptor { 

    @Override 
    public ServerResponse preProcess(HttpRequest request, ResourceMethod method) 
      throws UnauthorizedException { 

     String token = request.getHttpHeaders().getRequestHeader("token").get(0); 

     // user not logged-in? 
     if (checkLoggedIn(token)) { 
      ServerResponse response = new ServerResponse(); 
      response.setStatus(HttpResponseCodes.SC_UNAUTHORIZED); 
      MultivaluedMap<String, Object> headers = new Headers<Object>(); 
      headers.add("Content-Type", "text/plain"); 
      response.setMetadata(headers); 
      response.setEntity("Error 401 Unauthorized: " 
       + request.getPreprocessedPath()); 
      return response; 
     } 
     return null; 
    } 
} 
+0

Cảm ơn bạn. Các giải pháp Interceptor là thanh lịch nhưng quá trình xác thực của tôi không được tổng quát trong tất cả các ứng dụng của tôi. – Zofren

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