Как разрешить доступ к API только для своих страниц?

Я разрабатываю веб-приложение Spring Boot, которое предоставляет REST API. Большинство моих страниц (шаблоны тимелеафа) используют этот API для связи с серверной частью (используя запросы AJAX). Я читал о различных подходах, таких как базовая аутентификация, OAuth2 и т. д. Эти подходы описывают аутентификацию пользователей, после чего пользователи могут получить доступ к API. Но я не хочу, чтобы пользователи напрямую взаимодействовали с моим API, используя браузер или REST-клиент(т. е. расширение postman для Chrome, которое имеет доступ к файлам cookie браузера, где обычно хранятся токены доступа).

У меня что-то вроде этого:
(1) User --> (2) MyOwnPages --> (3) RestAPI.

Есть ли способ предотвратить прямое общение 1-3 ?
Могу ли я как-то определить, что запрос был сделан с моих страниц (т.е. добавить к каждому запросу какой-то токен доступа)? Есть ли передовой опыт?

Спасибо!


person Glinskiy Vladislav    schedule 27.07.2016    source источник


Ответы (1)


Нет, это совершенно невозможно. Вы можете добавить токены, чтобы усложнить задачу, генерировать что-то в Javascript и т. д., но все, что это сделает, — это сделает вашу страницу медленнее и с большей вероятностью приведет к сбою.

Поток не:

(1) User --> (2) MyOwnPages --> (3) RestAPI.

Скорее:

(1) User --> (2) Users Browser --> (3) RestAPI.

А поскольку именно браузер обращается к вашему API, нет разумного способа определить разницу между этим, cURL, Postman и т. д. Все, что вы можете сделать, пользователь может ввести, скажем, Wireshark таким образом, чтобы точно видеть, что отправляется, и исходя из этого они могут делать все, что делает браузер.

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

person ipsi    schedule 27.07.2016
comment
Спасибо за ваш ответ! Моя цель — не допустить, чтобы пользователи совершали плохие поступки. Предположим, у меня есть следующая конечная точка: POST ../api/checks. Эта конечная точка используется внешним интерфейсом для создания чека после успешной оплаты. Я не хочу, чтобы пользователи вручную создавали чеки, используя какой-то клиент для отдыха. Или я должен просто удалить такие конечные точки и инкапсулировать эту логику в других моих конечных точках (просто запретить создание чеков с использованием отдельной конечной точки, вместо этого автоматически создавать чек, т.е. после успешной оплаты)? - person Glinskiy Vladislav; 27.07.2016