#php #android #json #api
Здравствуйте. Есть сайт(сервис) по предоставлению услуг, внутри сайта есть личный кабинет пользователя, с его историей заказов, статусами заказов, историей оплаты и т.д. Необходимо сделать API, которым бы пользовалось android приложение. Как я начал делать, при авторизации с приложения делаю запрос к API такого плана: /api/?user.checkAuth={"login":"admin", "pass":"md5('.....)"} проверяю правильный ли хеш. А дальше генерирую случайную строку и сохраняю ее на сервере в паре СТРОКА - ПОЛЬЗОВАТЕЛЬ, так же отсылаю ее в ответ приложению, те эдакий сессионный токен, который знаю я, и знает приложение. Далее приложение запрашивает список заказов, передавая мне только то, что знает, те токен, который я выдал при авторизации. Запрос на список заказов: /api/?user.getUserOrders={"token":"29db74ae5302f6fafa75428ada7f1871"} на стороне сервера я принимаю токен, смотрю есть ли такой токен вообще к какому пользователю он привязан, и если все окей, то возвращаю JSON с заказами. Тут первый вопрос, я двигаюсь в правильном направлении? и вытекающая проблема из текущей реализации: есть у пользователя телефон и планшет с приложением; он авторизовался на телефоне - получил токен - пользуется; заходит с планшета - получает токен, КОТОРЫЙ ПЕРЕЗАПИСЫВАЕТСЯ если уже привязан к какому-то пользователю - пользуется. Вот тут и проблема, теперь если пользователь зайдет со своего телефона в приложение и попытается что-то запросить, передав токен с который сохранен в телефоне, то этот токен мы уже не найдем (т.к. перезаписали пару пользователь-токен при авторизации с планшета) и соответственно кинем его на страницу авторизации, для получения токена... и так до бесконечности, пользователь может работать только с 1ого устройста... Как решить эту проблему, те сохранить безопасность, работая с токенами, и дать пользователю возможность иметь несколько токенов? Чем-то грозит реализация, такая, что один user_id может иметь несколько токенов? Как организовать сброс этих токенов и нужен ли он? Заранее благодарен за помощь.
Ответы
Ответ 1
Один из вариантов (а вообще, тема холиварная): При первом запуске приложения, оно запрашивает у сервера токен устройства. Привязка на сервере осуществляется по 3-м параметрам: токен устройства, токен сессии, пользователь Никакой угрозы в хранении нескольких токенов для одного пользователя нет. Единственно, что вам необходимо изучить best practics по использованию сессий. Например как это рекомендовано в PHP UPD А зачем вы передаете в URI готовый JSON, какой в том смысл? Сравните: /api/?user.getUserOrders={"token":"29db74ae5302f6fafa75428ada7f1871"} /api/?method=getUserOrders&token=29db74ae5302f6fafa75428ada7f1871Ответ 2
Посмотрите https://jwt.io/. Из преимуществ: Стандарт Не нужны сессии. Поддержка разными языками(одинаковая) одновеременно (можете писать части приложения на разных языках). Можно перенести проверку на уровень сервера. https://github.com/auth0/nginx-jwt Недостатки: Нельзя удалить/запретить токен. Токен становится недействительным только когда "истекает срок годности". Если не связываться с JWT перенесите токен авторизации в заголовки запроса. Authorization: 29db74ae5302f6fafa75428ada7f1871
Комментариев нет:
Отправить комментарий