Цель: дать короткоживущий access-токен с обновлением и возможность мгновенно отозвать доступ.
Зависимость: #10, USR-1.
Что сделать
- Ввести пару access (короткий TTL) + refresh (длинный).
POST /api/auth/refresh обменивает refresh на новый access с ротацией refresh (старый сразу инвалидируется).
POST /api/auth/logout — отзыв текущего refresh (и access до истечения).
- Хранить состояние токенов в Redis: whitelist валидных refresh либо blacklist отозванных access (с TTL = остаток жизни токена, чтобы не копить мусор).
- При деактивации пользователя (USR-1
DELETE /api/users/{id}) — отозвать все его токены.
- Стретч: деактивированный юзер теряет доступ мгновенно, а не по истечении access-токена — продумать, как фильтр проверяет отзыв на каждом запросе, не убив производительность (Redis-lookup, не БД).
- Защита от reuse украденного refresh: повторное использование уже ротированного refresh → отозвать всю цепочку.
Acceptance criteria
Цель: дать короткоживущий access-токен с обновлением и возможность мгновенно отозвать доступ.
Зависимость: #10, USR-1.
Что сделать
POST /api/auth/refreshобменивает refresh на новый access с ротацией refresh (старый сразу инвалидируется).POST /api/auth/logout— отзыв текущего refresh (и access до истечения).DELETE /api/users/{id}) — отозвать все его токены.Acceptance criteria
refreshвыдаёт новый, старый refresh больше не работает.logout→ старые токены отклоняются (401).