Страницы

Поиск по вопросам

среда, 18 декабря 2019 г.

Как правильно реализовать API?

#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

Комментариев нет:

Отправить комментарий