5.4 KiB
5.4 KiB
Принцип и сценарии
Глоссарий
- гость не аутентифицированный посетитель
- пользователь аутентифицированный посетитель
Назначение и требования к токенам
Access token
- Короткоживущий многоразовый токен
- JWT
- За счет короткого времени жизни дополнительной проверки не требуется
Refresh token
- Предназначен для одноразового получения нового комплекта токенов
- Токен должен храниться в базе данных и содержать следующую информацию:
- Разрешение на генерацию токена
- предыдущий refresh token
- аутентификация пользователя
- регистрация пользователя
- Разрешение на генерацию токена
- Т.к. токен одноразовый и периодически обновляется, то нельзя использовать sessionStorage для его хранения
Технические сценарии
Гость на сайте
sequenceDiagram
participant C as Client
participant G as Gateway
participant S as Server
C->>G: Request without access token
G->>S: Request without user info
S->>G: Response
G->>C: Response without tokens
Гость логинится
sequenceDiagram
participant C as Client
participant G as Gateway
participant S as Server
C->>S: Credentials
Note over S: Check credentials
alt valid and user active
S->>C: access_token, refresh_token
else invalid or user not active
S-->>C: 422 error
end
Гость регистрируется
sequenceDiagram
participant C as Client
participant G as Gateway
participant S as Server
C->>S: Credentials
Note over S: Check for no access token
Note over S: Check credentials
alt valid and user active
S->>C: Congratulation page with redirect on timeout to login
else invalid or user not active
S-->>C: 422 error
end
Пользователь выполняет запрос с корректным токеном
sequenceDiagram
participant C as Client
participant G as Gateway
participant S as Server
C->>G: Request with access token
Note over G: Check access token
G->>S: Request with session data
alt session data changed
S->>G: Change sesstion data
G->>C: Response with new access token
else no sesstion changed
S->>C: Response
end
Пользователь выполняет запрос с некорректным токеном
sequenceDiagram
participant C as Client
participant G as Gateway
participant S as Server
C->>G: Request with access and refresh tokens
Note over G: Check access token
Note over G: Access token invalid
Note over G: Check refresh token
alt refresh token valid, user is active
G->>S: Request with sesstion data
S->>G: Response with/without session data
Note over G: Create new tokens with session data
G->>C: Response with new access and refresh tokens
else refresh token expared
G-->>C: 401 Token expired
else refresh token already used
Note left of G: Leak warning
G-->>C: 419 Token already used, leak warning
end
Если refresh token уже был ранее использован, то это может означать что токен ранее утек, потому
пользователю надо об этом сообщить, и, возможно заблокировать все refresh token'ы, выпущенные
благодаря потенциально утекшему
Пользователь обновляет токены
sequenceDiagram
participant C as Client
participant G as Gateway
participant S as Server
C->>G: Request with access and refresh tokens
Note over G: Check refresh token
alt refresh token valid, user is active
Note over G: Create new tokens with session data from access token
G->>C: Response with new access and refresh tokens
else refresh token expared
G-->>C: 401 Token expired
else refresh token already used
Note left of G: Leak warning
G-->>C: 419 Token already used, leak warning
end
Если refresh token уже был ранее использован, то это может означать что токен ранее утек, потому
пользователю надо об этом сообщить, и, возможно заблокировать все refresh token'ы, выпущенные
благодаря потенциально утекшему
Пользователь логинится
При переходе пользователя на страницу логина его перенаправляет на главную
Пользователь регистрируется
Регистрация недоступна для аутентифицированного пользователя