Объем возвращаемого ресурса сильно зависит от роли пользователя, закодированной в токене JWT - это RESTful? - PullRequest
0 голосов
/ 05 марта 2020

Я работаю над API, который пытается придерживаться принципов RESTful, хотя одно требование продолжает меня беспокоить.

Мы используем аутентификацию на основе JWT. Внутри утверждений JWT мы храним роли пользователя. Теперь наша основная конечная точка GET (для простоты назовем ее ListAllOffers) ведет себя по-разному в зависимости от роли пользователя:

  • , если API распознает администратора через JWT, он отвечает полным списком предложений
  • если API распознает обычного пользователя через JWT, он отвечает суженным списком предложений (в зависимости от отношения в БД)

Мои опасения: все ли в порядке согласно принципам REST или любым неписаным методам REST ? Я используется для изменения объекта ответа в соответствии с аргументом из url, params из строки запроса или, альтернативно, через значения заголовка. Изменение JSON ответа, основанного на JWT, кажется недостаточно явным, что кажется странным.


Дополнительный вопрос: противоречит ли это какому-либо из принципов REST, как это требование должно быть реализовано.

1 Ответ

1 голос
/ 05 марта 2020

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

Когда дело доходит до REST, конечная точка всегда должна ссылаться на тот же ресурс. Однако вы можете представлять этот ресурс любым способом, которым вы sh. Маскировка некоторых предложений, поскольку пользователь не является администратором, не изменила ресурс , только представление, которое вы даете этому пользователю .

В то время как спецификация REST не изменяет У вас нет каких-либо конкретных c примеров изменения представлений из-за авторизации, но это все же стоит прочитать.

Если вы обеспокоены неявным изменением представления, есть несколько доступных вариантов, которые сделают его более явным, хотя все еще следуя стандартам RESTful.

Вы можете добавить параметр запроса, который явно запрашивает только предложения текущего пользователя: /offers?show=mine.

Если предложения являются «владельцем» пользователя, вы также можете сделать что-то вроде: /users/{username}/offers. Здесь пользователь будет авторизован только для своих предложений. Администратор, конечно, будет авторизован для любого.

В целом, ключевой момент таков: конечная точка всегда должна представлять один и тот же ресурс, но как он представляет, решать вам.

...