158 lines
5.4 KiB
Markdown
158 lines
5.4 KiB
Markdown
# Принцип и сценарии
|
|
|
|
## Глоссарий
|
|
|
|
- **гость** не аутентифицированный посетитель
|
|
- **пользователь** аутентифицированный посетитель
|
|
|
|
## Назначение и требования к токенам
|
|
|
|
### Access token
|
|
|
|
- Короткоживущий многоразовый токен
|
|
- JWT
|
|
- За счет короткого времени жизни дополнительной проверки не требуется
|
|
|
|
### Refresh token
|
|
|
|
- Предназначен для одноразового получения нового комплекта токенов
|
|
- Токен должен храниться в базе данных и содержать следующую информацию:
|
|
- Разрешение на генерацию токена
|
|
- предыдущий refresh token
|
|
- аутентификация пользователя
|
|
- регистрация пользователя
|
|
- Т.к. токен одноразовый и периодически обновляется, то нельзя использовать sessionStorage для его
|
|
хранения
|
|
|
|
## Технические сценарии
|
|
|
|
### Гость на сайте
|
|
|
|
```mermaid
|
|
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
|
|
```
|
|
|
|
### Гость логинится
|
|
|
|
```mermaid
|
|
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
|
|
```
|
|
|
|
### Гость регистрируется
|
|
|
|
```mermaid
|
|
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
|
|
```
|
|
|
|
### Пользователь выполняет запрос с корректным токеном
|
|
|
|
```mermaid
|
|
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
|
|
```
|
|
|
|
### Пользователь выполняет запрос с некорректным токеном
|
|
|
|
```mermaid
|
|
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'ы, выпущенные
|
|
благодаря потенциально утекшему
|
|
|
|
### Пользователь обновляет токены
|
|
|
|
```mermaid
|
|
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'ы, выпущенные
|
|
благодаря потенциально утекшему
|
|
|
|
### Пользователь логинится
|
|
|
|
При переходе пользователя на страницу логина его перенаправляет на главную
|
|
|
|
### Пользователь регистрируется
|
|
|
|
Регистрация недоступна для аутентифицированного пользователя
|