2010-10-08 29 views
8

Rozwijam interfejs REST API i muszę przeprowadzić tranportogram szyfrów, aby uwierzytelnić wiadomość dla każdego żądania w procesie aplikacyjnym (szyfrowanie MAC z tajnych kluczy). Zastanawiałem się nad umieszczeniem ich w nagłówku wiadomości, aby uniknąć dodawania informacji innych niż dane w treści wiadomości zawierającej wysłany/pobrany obiekt (XML lub JSON).Przekazywanie parametrów w nagłówku komunikatu za pomocą interfejsu REST API

Czy to najlepsza praktyka?

Czy mogę dodać tyle parametrów, ile chcę w nagłówku? Czytałem, że muszę poprzedzić je "x-". Zachowanie tego parametru jest dokładnie takie samo jak parametry Path lub Query?

Używam Jersey.

Dziękuję za pomoc.

+0

Additonnal pytanie: czy lepiej wykorzystać istniejące parametry nagłówka (data, zezwoleniach) lub do tworzenia konkretnych te (X-app-data, x-app-auth)? – Zofren

Odpowiedz

8
  1. Tak Uważam, że dopuszczalne jest, aby parametry nagłówka przesyłały określone dane. Standard JAX-RS definiuje nawet @HeaderParam annotation. Prosty example of @HeaderParam.

  2. Konwencją jest przedrostek niestandardowych nagłówków http za pomocą "x-".

Moja sytuacja była podobna: podczas każdego wywołania REST musiałem przesłać token użytkownika i identyfikator aplikacji. Aby uniknąć powielania kodu, zaimplementowałem PreProcessInterceptor (używam Resteasy), dzięki czemu wszystkie żądania REST są kierowane. Jeśli token użytkownika jest niepoprawny, a użytkownik nie ma uprawnień do danego identyfikatora aplikacji, wówczas zwracam 401 nieautoryzowane. Mój kod wyglądał podobnie do tego (w wersji uproszczonej):

@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

Dziękuję. Rozwiązanie Interceptor jest eleganckie, ale mój proces uwierzytelniania nie jest uogólniony we wszystkich aplikacjach. – Zofren

Powiązane problemy