Загрузка...

Безопасность запроса

Тема в разделе Node.js создана пользователем Mi7kiro 2 июл 2023. 196 просмотров

  1. Mi7kiro
    Mi7kiro Автор темы 2 июл 2023 0 18 апр 2021
    Делаю веб приложение на react и сервер на express sequelize mysql, когда пользователь логинится ему дается jwt токен и авторизация запросов на сервер для взаимодействия с бд происходит через токен, но если мне надо чтобы допустим человек на клиенте нажимает кнопку получить 30 бесплатных монет, соответственно надо отправить на сервер запрос на изменение количества монет в бд у юзера, но для авторизации же передается только токен и человек может тупо его взять из заголовка и также отправить запрос и изменить себе деньги, так как авторизировать запросы именно от сервера, чтобы посторонний не мог взаимодействовать с бд. Точнее как принято это делать
     
    2 июл 2023 Изменено
  2. constsvetlov
    constsvetlov 2 июл 2023 n(1) 231 29 янв 2023
    Почему у тебя бизнес логика на клиенте. Переводи на бэк её.
     
    2 июл 2023 Изменено
    1. Посмотреть предыдущие комментарии (5)
    2. Mi7kiro Автор темы
      vtlstolyarov, а как тогда отправлять запросы к базе с клиента, чтобы другие юзеры не видели url?Извините за тупые вопросы
    3. vtlstolyarov
      Mi7kiro, Я не понимаю при чём тут url и зачем тебе делать запросы к базе с клиента. Как уже говорилось с базой работает только сервер. Расскажи подробнее свой кейс - я его понимаю так:
      - есть клиент написаный на React
      - есть web-сервер написаный на Node.js
      - есть база данных MySQL

      Строка подключения к базе данных должна храниться в конфиге web-сервера (она одна и та же для всех клиентов), клиенты логинятся (аутентифицируются) на сервере и получают jwt токен - этот jwt токен приходит на сервер во всех последующих запросах с залогиненного клиента (в заголовках или куках). Сервер должен отвечать 401 Unauthorized на все запросы в которых требуется авторизация (фактически весь API) но нету jwt токена в запросе. API состоит из действий которые может совершить авторизрованный пользьзователь - например в твоем случае это "получить 30 бесплатных монет" может выглядеть как "POST /api/claim-free-coins" - сервер получает этот запрос, проверяет что jwt токен валиден, достаёт из токена UserID и для этого пользователя (UserID) обновляет в базе данных запись о количестве монет у пользователя (добавляя туда 30 монет), плюс записывает в базе когда пользователь в последний раз получал бесплатные монеты - по идее перед тем как добавлять монеты надо проверить время когда пользователь в последний раз получал монеты и если прошло слишком мало времени то выдавать в ответ ошибку о том что пока монеты получить нельзя, надо ждать.

      Таким образом URL - это не секрет - его могут все знать, секрет - это jwt токен - его можно получить только с сервера после логина. jwt токен зашифрован - расшифровать его может только сервер, клиент не может расшифровать jwt токен и не может его подделать так как у него нету ключей шифрования. Доступа к базе у клиента нет - есть только jwt токен который определяет что пользователь логинился и даёт серверу информацию о том кто этот пользователь.
    4. constsvetlov
      Mi7kiro, юзеры и не видят и не могут. Лишь те кто зайдут в дебаггер, это не скрыть.
      Так, а зачем отправлять запросы к базе с клиента. Бэк сам должен этим возится, ему лишь приходит твой ответ подобну ниже примеру(я не юзал jwt-token и подобно, но суть не меняет). И не обязательно jwt токены юзать, можешь куки авторизацию проверять
      [IMG]
    5. Посмотреть следующие комментарии (4)
Загрузка...
Top