Я разрабатываю веб-приложение Spring Boot, которое предоставляет REST API. Большинство моих страниц (шаблоны тимелеафа) используют этот API для связи с серверной частью (используя запросы AJAX). Я читал о различных подходах, таких как базовая аутентификация, OAuth2 и т. д. Эти подходы описывают аутентификацию пользователей, после чего пользователи могут получить доступ к API. Но я не хочу, чтобы пользователи напрямую взаимодействовали с моим API, используя браузер или REST-клиент(т. е. расширение postman для Chrome, которое имеет доступ к файлам cookie браузера, где обычно хранятся токены доступа).
У меня что-то вроде этого:
(1) User --> (2) MyOwnPages --> (3) RestAPI.
Есть ли способ предотвратить прямое общение 1-3 ?
Могу ли я как-то определить, что запрос был сделан с моих страниц (т.е. добавить к каждому запросу какой-то токен доступа)? Есть ли передовой опыт?
Спасибо!
Как разрешить доступ к API только для своих страниц?
comment
Для этого и нужна DMZ (en.wikipedia.org/wiki/DMZ_(computing)< /а>). В вашем случае вам понадобятся два приложения с брандмауэром между ними: одно в демилитаризованной зоне, выступающее в качестве посредника, и одно на вашем сервере.
- person Bragolgirith   schedule 27.07.2016
Ответы (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
Спасибо за ваш ответ! Моя цель — не допустить, чтобы пользователи совершали плохие поступки. Предположим, у меня есть следующая конечная точка: POST ../api/checks. Эта конечная точка используется внешним интерфейсом для создания чека после успешной оплаты. Я не хочу, чтобы пользователи вручную создавали чеки, используя какой-то клиент для отдыха. Или я должен просто удалить такие конечные точки и инкапсулировать эту логику в других моих конечных точках (просто запретить создание чеков с использованием отдельной конечной точки, вместо этого автоматически создавать чек, т.е. после успешной оплаты)?
- person Glinskiy Vladislav; 27.07.2016