Передача параметров в заголовке сообщения с помощью REST API

Я разрабатываю REST API, и мне нужно транспортировать криптограммы для аутентификации сообщения для каждого запроса в прикладном процессе (шифрование MAC с помощью секретных ключей). Я думал о том, чтобы поместить их в заголовок сообщения, чтобы избежать добавления информации, отличной от данных, в тело сообщения, которое содержит отправленный/полученный объект (XML или JSON).

Это лучшая практика?

Могу ли я добавить в заголовок столько параметров, сколько захочу? Я читал, что я должен ставить перед ними префикс «x-». Поведение этого параметра точно такое же, как у параметров пути или запроса?

Я использую Джерси.

Спасибо за помощь.


person Zofren    schedule 08.10.2010    source источник
comment
Дополнительный вопрос: лучше использовать существующие параметры заголовка (дата, авторизация) или создавать определенные (x-app-date, x-app-auth)?   -  person Zofren    schedule 11.10.2010


Ответы (1)


  1. Да, я считаю допустимым иметь параметры заголовка для передачи определенных данных. Стандарт JAX-RS даже определяет аннотацию @HeaderParam. . Простой пример @HeaderParam.

  2. По соглашению нестандартные заголовки HTTP имеют префикс «x-».

У меня была ситуация, похожая на вашу: мне нужно было передавать токен пользователя и идентификатор приложения при каждом вызове REST. Чтобы избежать дублирования кода, я реализовал PreProcessInterceptor (я использую Resteasy), через который маршрутизируются все REST-запросы. Если токен пользователя недействителен и если у пользователя нет привилегий для данного идентификатора приложения, я возвращаю 401 неавторизованный. Мой код выглядел примерно так (упрощенная версия):

@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;
    }
}
person Peter Knego    schedule 20.02.2011
comment
Спасибо. Решение Interceptor элегантно, но мой процесс аутентификации не распространяется на все мои приложения. - person Zofren; 21.02.2011