Как использовать авторизацию на основе токенов в REST?

Итак, прочитав много о BasicAuth, OAuth, JWT... и т. д., я придумал этот вопрос.

У меня есть клиент, в котором некоторые люди могут войти в систему (аутентификация выполнена). Когда люди хотят выполнить вызов API, они используют графический интерфейс клиента, и клиент отправляет некоторые запросы на конечную точку веб-сервиса.

host/resources/{id}

//id=path, res=post
public Response updateResourceById(String id, Resource res) {
....

Таким образом, типичный вызов обновления может быть

POST host/resources/1234 -d={ some json for a resource }

Теперь я не хочу, чтобы каждый пользователь имел все права для каждого ресурса, поэтому мне нужно добавить некоторую информацию о пользователе, который выполняет запрос.

Для этого я думал использовать некоторый токен JSON с некоторой полезной нагрузкой (или вообще с любой информацией о пользователе). Но мне было интересно, как правильно отправить этот токен в RESTful API.

Моей первой идеей было бы изменить код примерно так:

//id=path, token=post
public Response updateResourceById(String id, Token token) {
...

Конечная точка не изменит только данные POST.

Будет ли это правильным или есть другие подходы?

Редактировать: Также возможна отправка токена через HTTP-заголовок.


person Gobliins    schedule 12.02.2016    source источник
comment
Следует иметь в виду две идеи: либо использовать файлы cookie, которые кодируют, какой пользователь выполняет запрос, а затем фильтровать права пользователя в бэкэнде, либо использовать другие HTTP-заголовки для передачи токена аутентификации.   -  person Johannes Jander    schedule 12.02.2016


Ответы (1)


Отправка учетных данных в HTTP

В HTTP учетные данные должны отправляться в стандартном HTTP-заголовке Authorization.

Взгляните на RFC 7235, текущий справочник по аутентификации в HTTP 1.1. :

4.2. Авторизация

Поле заголовка Authorization позволяет пользовательскому агенту аутентифицировать себя на исходном сервере — обычно, но не обязательно, после получения ответа 401 (Unauthorized). Его значение состоит из учетных данных, содержащих информацию об аутентификации пользовательского агента для области запрашиваемого ресурса.

Authorization = credentials

[...]

Обратите внимание, что имя этого HTTP-заголовка неудачно, поскольку оно содержит данные аутентификации вместо авторизации. В любом случае, это стандартный заголовок для отправки учетных данных.

При аутентификации на основе токенов токены являются учетными данными. При таком подходе жесткие учетные данные, такие как имя пользователя и пароль, заменяются маркером, который отправляется в каждом запросе для идентификации пользователя.

Никогда не помешает сказать, что вы должны использовать HTTPS при отправке конфиденциальных данных, например учетных данных, через провод. HTTPS защитит ваше приложение от атак типа "человек посередине".

Чтение токена аутентификации в JAX-RS

Вы можете прочитать заголовок Authorization в приложении JAX-RS следующим образом, а затем проверьте, действителен ли токен:

@GET
public Response myMethod(@HeaderParam("Authorization") String token) {
    ...
}

Однако лучшим подходом было бы использование ContainerRequestFilter , сохраняя ваши конечные точки компактными и сосредоточенными на бизнес-логике. Для получения дополнительной информации об аутентификации на основе токенов и о том, как использовать ContainerRequestFilter, взгляните на этот вопрос.

person cassiomolin    schedule 12.02.2016
comment
Я бы добавил, что следует рассмотреть возможность использования защищенного соединения - person Louis F.; 12.02.2016
comment
знаете ли вы, как должен выглядеть файл swagger yaml/json, чтобы получить параметры заголовка в методах - person Gobliins; 12.02.2016
comment
@Gobliins У меня нет этой информации в голове, и для меня это другой вопрос. Следовательно, подумайте о том, чтобы попросить новый. Но вы можете взглянуть на этот ответ и на этот ответ, чтобы узнать, как использовать Swagger с JAX-RS для отправки заголовка Authorization. - person cassiomolin; 12.02.2016
comment
Можно ли поместить несколько сведений в заголовок авторизации? - person Gobliins; 19.02.2016
comment
@Gobliins Рассмотрите возможность использования токенов JWT, чтобы вы могли хранить в токене все, что хотите. - person cassiomolin; 19.02.2016