Как ограничить доступ к api сайта?

Вопрос избитый, но решения не нашёл.
Есть front.web.ru, файлы обращаются а api.web.ru, как ограничить доступ к api тока для сайта front.web.ru? Как дать доступ к api.web.ru только если запрос идёт с домена front.web.ru?

Подозреваю,что никак, ибо - все заголовки можно подделать (или нет?), а сам фронт отдаётся в браузере, поэтому ключ ему не приделаешь и логика приложения не позволяет вводить авторизацию.

Но я ж могу ошибаться, например сайт dadata.ru именно ограничением домена защищает токен пользователя от левых пассажиров, но как они это делают - ума не приложу.

ПРАВКА!!!

Я, конечно, виноват в том, что неправильно задал вопрос
По домену front.web.ru лежит сайт, на страницах которого ajax-ом тащится контент с сайта на api.web.ru, вот в чем соль. Самая обычная связка ajax и json.

Самый простой способ, который я придумал - расставить на всех страницах проекта google recaptcha 3 (который невидимый). Но хрен знает, как он себя ведет в таких ситуациях.
  • Вопрос задан
  • 1587 просмотров
Решения вопроса 1
xmoonlight
@xmoonlight Куратор тега PHP
https://sitecoder.blogspot.com
Простое решение: JSON с API - только для авторизованных пользователей, для всех остальных - статичный контент, собранный целиком на стороне сервера.

Непростое:

Кратко:
Каждый запрос функции API - это 2 запроса к API с получением и исполнением на стороне клиента обфусцированной JS-задачи между ними, и с ограничением по времени между ними от 1 до 3-х секунд:
1-й - подпись запроса к API (или получение публичного ключа) и получение JS-задачи
2-й - получение ответа на запрос к API (если всё верно и REFERER - разрешён)

Подробно.

Загрузка страницы (front):
1. При загрузке страницы, запросом к API (через JS) на стороне API генерируем временный паблик-токен (PUB-TOKEN) и JS-задачу на основе параметров HTTP-протокола (IP,REFERER,etc..).
2 Затем, исполняем JS-задачу и сразу же, обмениеваем PUB-TOKEN через повторный запрос к API (с помощью полученного от API и обфусцированного JS-кода!) на публичный ключ (API-KEY).
3. API-KEY сохраняем в куках.

ВАЖНО! Срок действия PUB-TOKEN: 1-3 секунды.

*страница появилась в браузере*

Запрос к API:
Подписываем запрос публичным ключом API-KEY конкретно для этого клиента и снова делаем два запроса к API:
1 Отправка данных для проверки обработки запроса и получение JS-кода с временным токеном (PUB-TOKEN). Исполнение JS-кода с параметрами API-KEY, PUB-TOKEN, TIMESTAMP.
2 Отправка результата исполнения JS-кода и получение результата запроса к API.

Важно мониторить:
0. Все невалидные запросы и ПРИЧИНЫ! их возникновения (например, возможно, что из-за скорости соединения придётся компенсировать время жизни PUB-TOKEN, увеличив его до 5-10 секунд)!

1. Все запросы должны быть УНИКАЛЬНЫМИ!
2. Не допускать запросы к повторному использованию.
3. Код задачи на JS на получение публичного ключа или исполнения запросов к API, должен:
  • динамически генериться на стороне API и быть уникальным (полиморфизм)
  • быть крайне сложным для анализа
  • насколько это возможно: проверять, что среда исполнения - это реальный браузер
  • быстро исполняться на стороне клиента
Ответ написан
Пригласить эксперта
Ответы на вопрос 6
uDenX
@uDenX
PHP Developer
С помощью CORS можно контролировать кому разрешено делать запросы

CORS
Ответ написан
@Hellayas
Изучить и использовать JWT как один из вариантов.
Ответ написан
@UPSA
anykey
1) А "в лоб" с помощью iptables? одинаковый IP?
2) api.web.ru = 127.0.0.1 ...
3) Средствами веб-серверов (например, apache - allow? deny?)
4) ..htaccess - Не помню rewritemod с ip адресами работает...
Ответ написан
shurshur
@shurshur
Если запрос делается с клиента, то в общем случае никак нельзя запретить клиенту подделать запрос. Но можно усложнить (обфускация, Referer, CORS и всё такое).
Ответ написан
@Kirill-Gorelov
С ума с IT
Мы в апи подписывает запрос. И проверяем, кто нам шлет запросы.
Ключ, подпись, данные. И на стороне апи проверяем сходится ли подписанные данные. Если да, то пускаем пользователя.
Если нет, редирект.
Ответ написан
@Jloa
Авторизуйтесь через ваш апи, выдайте клиенту jwt токен. Клиент будет слать токен при дальнейших запросах.
Решит все ваши проблемы.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы
07 дек. 2019, в 00:10
1000 руб./за проект
06 дек. 2019, в 21:54
30000 руб./за проект
06 дек. 2019, в 21:12
450000 руб./за проект