Правильное использование access и refresh token (JWT) в php
Всем привет. Сейчас пытаюсь разобраться с использованием JWT в своём проекте на php. Использую библиотеку php-jwt.
На данный момент получилось реализовать авторизацию через приложение на смартфоне.
После успешной регистрации приложение получает jwt access_token (если я правильно понял) через JWT::encode($token, $key);.
Также клиент может отправлять этот токен на сервер, который проверяет его корректность и например изменяет данные в БД.
Я достаточно много читал про JWT, но до конца всё равно не разобрался в принципе его работы.
У меня возникает сразу несколько вопросов.
Как корректно настроить переменные для JWT:
$key = "your_secret_key"; $iss = "http://any-site.org"; $aud = "http://any-site.com"; $iat = 1356999524; $nbf = 1357000000;Как это вижу я:
$key - любая комбинация цифр, знаков, букв - то есть что-то типа соли. $iss - адрес сайта, который выдаёт токены (место расположения сервера) $aud - аналогичный адрес (но как я прочитал, для генерации access и refresh используют два разных сервера) $iat - время создания (нужно изменять каждый раз, когда генерируется access token?) $nbf - время жизни токена (какое время нужно использовать?)Как формировать refresh токен? Судя по статьям про JWT.
access_token — токен, который нам нужно будет отправлять в шапке каждого запроса, для получения данных в ответ.
refresh_token — токен, который нам нужно будет отправлять, для получения нового токена, когда истечет время жизни старого
Где хранить токены после получения?
Я предполагаю, что access_token можно хранить в памяти смартфона и отправлять каждый раз, когда требуется его проверка со стороны сервера.Как сохранять авторизацию пользователя после каждого запуска приложения? Я бы отправлял access_token каждый раз, когда зарегистрированный пользователь открывает приложение и если валидация на сервере прошла успешна - проводил авторизацию (по аналогии с cookies).
Для меня JWT на данный момент достаточно сложная тема, но если кто-то, кто уже работал с ним, подскажет, я буду благодарен.
Ответы (1 шт):
1 - Payload — это любые данные, которые вы хотите передать в токене. Но стандарт предусматривает несколько зарезервированных полей: iss — (issuer) издатель токена sub — (subject) "тема", назначение токена,описываемый объект aud — (audience) аудитория, получатели токена exp — (expire time) срок действия токена nbf — (not before) срок, до которого токен не действителен iat — (issued at) время создания токена jti — (JWT id) идентификатор токена
пример: { "iss": " StuLux Team", "sub": "auth", "exp": 1505467756865, "iat": 1505467152065, "user": 3 }
2 - Пользователь логинится в приложении, передавая логин/пароль, в случае удачи создает запись в БД с рефреш токеном и временем его жизни, юзеру же возвращается сгенерированные сервером access и refresh токены JWT, для более подробного понимания можно разобрать примеры или использовать готовые решения библиотек с сайта https://jwt.io/#libraries.
3 - много холиваров на эту тему про хранение токенов JWT это вопрос уязвимости приложения так сказать, на клиенте access лежат в памяти приложения, refresh сетится в куке или ложится в локалсторедж
4 - для этого как раз и нужен refresh token
Более подробно можно почитать тут - https://gist.github.com/zmts/802dc9c3510d79fd40f9dc38a12bccfc
Я лично для начала рекомендую хотя бы для тестов развернуть какие то готовые решения и понять ход работы не делая велосипедов.