Я разрабатываю веб-приложение Spring Boot, которое предоставляет REST API. Большинство моих страниц (шаблоны тимелеафа) используют этот API для взаимодействия с внутренними компонентами (с использованием запросов AJAX). Я читал о различных подходах, таких как Basic Authentication, OAuth2 и т. Д. Эти подходы описывают аутентификацию пользователя, после чего пользователи могут обращаться к API. Но я не хочу, чтобы пользователи напрямую обменивались данными с моим API, используя браузер или клиент REST (т. Е. Расширение mailman postman, имеющее доступ к куки-файлам браузера, где обычно хранятся токены доступа).
У меня есть что-то вроде этого:
(1) Пользователь -> (2) MyOwnPages -> (3) RestAPI.
Есть ли способ предотвратить прямую связь 1-3?
Могу ли я как-то определить, что запрос был сделан с моих страниц (т. Е. Добавить к каждому запросу какой-то токен доступа)? Есть ли лучшие практики?
Спасибо!Как разрешить доступ к API только для собственных страниц?
ответ
Нет, это невозможно. Вы могли бы добавить токены, чтобы сделать это сложнее, генерировать вещи в Javascript и т. Д. И т. Д., Но все, что было бы сделано, это сделать вашу страницу медленнее и с большей вероятностью сбой.
поток не является:
(1) User --> (2) MyOwnPages --> (3) RestAPI.
Но скорее:
(1) User --> (2) Users Browser --> (3) RestAPI.
И поскольку это браузер, который делает вызов вашим API, не существует разумный способ сказать различие между тем, cURL, Postman и т. д. Все, что вы можете сделать, пользователь может поставить, скажем, Wireshark, чтобы посмотреть, что именно отправляется, и от этого они могут делать все, что делает браузер.
Было бы более полезно понять, почему именно вы хотите это сделать, поскольку, вероятно, будет лучшее решение для любой конечной цели.
Спасибо за ваш ответ! Моя цель мешает пользователям делать плохие вещи. Предположим, у меня есть следующая конечная точка: POST ../api/checks. Эта конечная точка используется интерфейсом для создания проверки после успешной оплаты. Я не хочу, чтобы пользователи вручную создавали проверки с использованием некоторого клиента для отдыха. Или я должен просто удалить такие конечные точки и инкапсулировать эту логику в других моих конечных точках (просто запретить создание проверок с использованием отдельной конечной точки, вместо этого автоматически создать проверку, то есть после успешного завершения платежа)? –
Это DMZ для (https://en.wikipedia.org/wiki/DMZ_(computing)). В вашем случае вам понадобятся два приложения с межсетевым экраном: один в DMZ, действующий как посредник, и один в вашем back-end. – vtosh