Как защитить API сервиса от поддельных запросов?

Итак, у нас имеется:

  • API
  • Клиентское приложение (VK Mini App), которое ни что иное, как удобный для пользователя интерфейс, реализующий функциональность API


У нас есть пользователь, у которого есть user_id.
У API есть метод someAction.perform, который взаимодействует с базой данных и что-то там меняет. Мне нужно каким-либо образом проверять, что этот запрос отправил именно этот пользователь, именно через клиентское приложение, а не какой-то злодей, отправляющий запросы curl'oм и подставляющий чужой user_id. Также хочу подчеркнуть, что работаю через VK, по этому у моих пользователей нет паролей или логинов в моем сервисе, и что клиентское приложение легко поддается реверс-инжинирингу.
  • Вопрос задан
  • 1260 просмотров
Решения вопроса 1
Читать документацию по VK Mini Apps, раздел Подпись параметров запуска. Там же ссылки на примеры реализцию проверки подписи.

Пользователь приходит с кучей параметров, в числе которых user_id и подпись запроса sign, которую надо у себя на сервере проверять. Она завязана на «секрет» приложения.
Так можно убедиться, что пришёл именно тот пользователь и параметры не подделаны.

Далее эти же параметры можно передавать и с каждым API-запросом, а в обработчике снова проверять их.

Либо, чуть сложнее, генерить временный уникальный ключ, хранить у себя в БД/Redis, и его передавать в заголовках всех API запросов.
Ответ написан
Пригласить эксперта
Ответы на вопрос 2
dimonchik2013
@dimonchik2013
non progredi est regredi
Комментировать
xmoonlight
@xmoonlight
https://sitecoder.blogspot.com
Надо связать юзера и секретный ключ подписи запросов, используя ответчик стороннего сервиса.

Проверьте: можно ли по кольцу передавать данные: ваш сервис -> приложение -> vkAPI -> и.. отбивка vk на ваш сервис, минуя клиента?

Если это возможно - вы можете подписывать свои запросы и проверять подпись по отбивке/ответчику vk для конкретного пользователя (секретный ключ - знаете только Вы, а пользователя - только VK).

Иначе - никак.
Ответ написан
Ваш ответ на вопрос

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

Похожие вопросы