Mail.ruПочтаМой МирОдноклассникиВКонтактеИгрыЗнакомстваНовостиКалендарьОблакоЗаметкиВсе проекты

Как работать с токенами?

Анонимный Пользователь Ученик (88), закрыт 4 года назад
На сайте имеется система авторизации. Она неидеальна, тк при удачной авторизации в сессию сохраняется объект класса User,содержащий методы для возврата email,проверки существования пользователя и т. д. Прочитал, что безопаснее всего использовать токены при авторизации пользователя. Однако я не понимаю и не могу найти описание механизма работы такой системы регистрации. Если я правильно понимаю, то такая система работает так: При успешной авторизации (успешная проверка email и пароля) в сессию и в базу данных (в ячейку, связанную с конкретным пользователем) сохраняется токен, который представляет собой строку (например 34ifhvjdfoiw$#%$,при авторизации всегда генерируется случайное значение). Далее я на каждой странице, где требуется авторизация извлекаю из сессии токен и отправляю запрос в бд, который находит среди пользователей пользователя с таким токеном. Если токены совпадают, то я могу получать данные этого пользователя. Я правильно понял механизм работы системы авторизации с токенами?
Лучший ответ
dim565 Искусственный Интеллект (424865) 4 года назад
Сразу предупрежу, лично с токенами не работал, но ваш вопрос меня заинтересовал, поэтому поискал информацию с разных сайтов и постарался быстро вникнуть в суть.
В целом идею вы поняли правильно, можно сделать как написали, но существует стандарт JWT (JSON Web Tokens), думаю для аутентификации лучше попытаться использовать именно его или хотя бы рассмотрите этот вариант.

Кратко, что я понял: после успешной аутентификации сервер генерирует access token такого формата: eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpZCI6IjEzMzciLCJ1c2VybmFtZSI6ImJpem9uZSIsImlhdCI6MTU5NDIwOTYwMCwicm9sZSI6InVzZXIifQ.ZvkYYnyM929FM4NW9_hSis7_x3_9rymsDAx9yuOcc1I
В нем зашифрован набор полей (как минимум ID пользователя, но можете добавить и другие неконфиденциальные данные). Токен можно сохранить в cookie, каждый раз сервер будет получать его, расшифровывать, проверять подпись и если все правильно получать ID.

В базе данных хранить access token не нужно, но пишут, что для дополнительной безопасности есть смысл сохранять refresh token (случайная строка) и также сохранять в браузере клиента.

В общем, скину ссылки на статьи, из которых все это узнал (может есть и более подробные), будет желание посмотрите:
cyberpolygon.com/ru/materials/security-of-json-web-tokens-jwt/
only-to-top.ru/blog/programming/2019-06-20-registraciya-i-avtorizaciya-v-php-s-jwt.html
gist.github.com/zmts/802dc9c3510d79fd40f9dc38a12bccfc (здесь для мобильного приложения, но суть одна)
Остальные ответы
Похожие вопросы