298 lines
12 KiB
Markdown
298 lines
12 KiB
Markdown
# Описание функций авторизации
|
||
____
|
||
#### Алгоритм
|
||
Refresh token токен действует 12 часов и за эти 12 часов не реже чем раз в 3 часа нужно обновить Refresh token ну и заодно Access token обновиться.
|
||
Аccess token действует 20 минут (позже уменьшу до 10 минут) и его можно обновить в любое время, если будет просрочен выдаст 401 ошибку. Чтобы время от времени по расписанию не запрашивать обновление токена,
|
||
можно сделать обвёртку для 2й отправки запроса, в случае выявления просрочки токена чтобы эта обвёртка отправляла запрос Refresh, а потом обратно в нужное место отправляла запрос.
|
||
|
||
Настройки хранятся в HashiCorp Vault и их можно загрузить туда так:
|
||
|
||
vault kv put secret/org-ccalm-jwt jwt.secret=my-secret-value db.user=admin db.pass=123456
|
||
|
||
В базе есть поля такие как e_iin и они записываются так: pgp_sym_encrypt('Мои данные', 'пароль')
|
||
Читаются так: select pgp_sym_decrypt(e_name, 'пароль') from main.drivers;
|
||
|
||
|
||
____
|
||
## Оглавление
|
||
1. [Получить список разрешений для пользователя по Access token](#получить-список-разрешений-для-пользователя-по-Access-token)
|
||
2. [Получить CAPTCHA с проверочным токеном](#получить-captcha-с-проверочным-токеном)
|
||
3. [Создать нового пользователя](#создать-нового-пользователя)
|
||
4. [Получить информацию о пользователе по его Access token ](#получить-информацию-о-пользователе-по-его-access-token )
|
||
5. [Авторизоваться](#авторизоваться)
|
||
6. [Обновить токен доступа (а также обновить рефреш токен)](#обновить-токен-доступа-а-также-обновить-рефреш-токен)
|
||
7. [Ссылка для подтверждения смены пароля (переходят на неё из почты)](#ссылка-для-подтверждения-смены-пароля-переходят-на-неё-из-почты)
|
||
8. [Принять капчу и код для инициализации процедуры восстановления пароля](#принять-капчу-и-код-для-инициализации-процедуры-восстановления-пароля)
|
||
9. [Обновить пароль по логину и старому паролю](#обновить-пароль-по-логину-и-старому-паролю)
|
||
10. [Проверить валидность токена](#проверить-валидность-токена)
|
||
|
||
____
|
||
|
||
Запаковка в хранилище ключей
|
||
|
||
```sh
|
||
openssl pkcs12 -export \
|
||
-in authorization.crt \
|
||
-inkey authorization.key \
|
||
-out keystore.p12 \
|
||
-name tomcat \
|
||
-CAfile authorization-ca.crt \
|
||
-caname root \
|
||
-password pass:MFNX344yh4
|
||
```
|
||
|
||
📖 Расшифровка аргументов:
|
||
|
||
| Параметр | Назначение |
|
||
|---------------------------------|---------------------------------------------------------------------------------------------|
|
||
| `openssl pkcs12` | Утилита OpenSSL, работающая с PKCS#12 контейнерами (включают сертификаты и ключи). |
|
||
| `-export` | Указывает, что нужно экспортировать (создать) PKCS#12-файл. |
|
||
| `-in authorization.crt` | Основной (публичный) сертификат. Это то, что выдано для твоего домена. |
|
||
| `-inkey authorization.key` | Приватный ключ, соответствующий сертификату. Нужен для использования сертификата. |
|
||
| `-out keystore.p12` | Выходной файл (итоговый контейнер PKCS#12). Это будет твой `keystore`. |
|
||
| `-name tomcat` | Алиас (имя) для ключа в хранилище. Spring Boot (и Tomcat) по умолчанию ищет alias `tomcat`. |
|
||
| `-CAfile authorization-ca.crt` | (Необязательно) Цепочка доверенных сертификатов (например, корневой и промежуточные CA). |
|
||
| `-caname root` | Имя для CA-сертификата (используется внутри контейнера). |
|
||
| `-password pass: XXXXXX` | Пароль для защиты хранилища (в Spring Boot это `key-store-password`). |
|
||
|
||
|
||
### Получить токен для защиты от CSRF атак
|
||
https://istransit.kz/api/authorization/v02/get_request_token
|
||
|
||
GET запрос без данных.
|
||
|
||
Пример ответа:
|
||
```json
|
||
{
|
||
"ttl":600,
|
||
"token":"VTf8zvHKqK7QFJ0ZEyheOYAUrI7cRIbejxMzRKlMzYM"
|
||
}
|
||
```
|
||
|
||
### Получить список разрешений для пользователя по Access token
|
||
https://istransit.kz/api/authorization/v02/access/
|
||
|
||
Запрос может содержать параметры фильтрации для поиска частичного совпадения названия (действия), если параметров фильтрации нет или он равен null то вернёт все записи.
|
||
|
||
Пример запроса:
|
||
```json
|
||
{
|
||
"action_name":"arm_"
|
||
}
|
||
```
|
||
|
||
Пример ответа:
|
||
```json
|
||
{
|
||
"error_code": 0,
|
||
"error_message": "",
|
||
"data": [
|
||
"arm_accounting",
|
||
"arm_carrier",
|
||
"arm_hr"]
|
||
}
|
||
```
|
||
|
||
### Получить CAPTCHA с проверочным токеном
|
||
https://istransit.kz/api/authorization/v02/captcha/
|
||
|
||
Пример запроса:
|
||
```json
|
||
{
|
||
"email":"test@mail.ru"
|
||
}
|
||
```
|
||
Пример ответа:
|
||
```json
|
||
{
|
||
"image":"тут gif в base64",
|
||
"token":"ZUROMC9xQVpRNjVGZGZBSWdrSGk5NHlPK2JXcHJMHVlbWVBPT0=.ywHb5zzI+ARK3XDRpgVkC1fdlqEQWWOXLuVIu\/rRMho="
|
||
}
|
||
```
|
||
Где "image" это рисунок в base64
|
||
|
||
А "token" это токен для последующей проверки введённого кода "code":"XXXXXX".
|
||
|
||
По умолчанию токен captcha действует 10 минут.
|
||
|
||
### Создать нового пользователя
|
||
https://istransit.kz/api/authorization/v02/create/
|
||
|
||
Письмо с паролем придёт на почту
|
||
|
||
Пример запроса:
|
||
```json5
|
||
{
|
||
"country_id": "1",
|
||
"company_name": "ТОО 'Тестовая компания'",
|
||
"position": "Менеджер",
|
||
"name": "Берик",
|
||
"surname": "Султанов",
|
||
"patronymic": "Серикович",
|
||
"phone": "+7777123456",
|
||
"email": "test@test.kz",
|
||
"code":"11111", //Код с CAPTCHA
|
||
"token":"ZUROMC9xQVpRNjVGZGZBSdyc2JIV0ZueHdDMHVlbWVBPT0=.ywHb5zzI+ARK3XDRpgVkC1fdlqEQWWOXLuVIu\/rRMho=" //Токен с CAPTCHA
|
||
}
|
||
```
|
||
Пример ответа:
|
||
```json
|
||
{
|
||
"error_code": "0",
|
||
"error_message":""
|
||
}
|
||
```
|
||
|
||
### Получить информацию о пользователе по его Access token
|
||
https://istransit.kz/api/authorization/v02/info/
|
||
|
||
Запрос:
|
||
```
|
||
Cookie: jwt_a = Access token
|
||
```
|
||
Пример ответа:
|
||
```json5
|
||
{
|
||
"error_code": "0",
|
||
"error_message": "",
|
||
"name": "Igor",
|
||
"surname": "M",
|
||
"patronymic": "I",
|
||
"roles": "Кассир, Кладовщик",
|
||
"time": "1703838784", //Время с сервера
|
||
"expiration": "1696924443", //Когда "протухнет" пароль
|
||
"appid": "postman",
|
||
"arm": "monitoring"
|
||
}
|
||
```
|
||
### Авторизоваться
|
||
https://istransit.kz/api/authorization/v02/login/
|
||
|
||
Пример запроса:
|
||
```json
|
||
{
|
||
"login" : "test@istt.kz",
|
||
"password" : "test",
|
||
"totp": "123456",
|
||
"appid" : "postman"
|
||
}
|
||
```
|
||
В ответ:
|
||
```json5
|
||
{
|
||
"error_code": "0",
|
||
"error_message": "",
|
||
"name": "Igor",
|
||
"surname": "M",
|
||
"patronymic": "I",
|
||
"roles": "Кассир, Кладовщик",
|
||
"time": "1703838784", //Время с сервера
|
||
"expiration": "1696924443", //Когда протухает пароль
|
||
"appid": "postman",
|
||
"arm": "monitoring"
|
||
}
|
||
```
|
||
Также в ответ Cookie:
|
||
```
|
||
Cookie: jwt_a = Access token
|
||
Cookie: jwt_r = Refresh token
|
||
```
|
||
|
||
### Обновить токен доступа (а также обновить рефреш токен)
|
||
https://istransit.kz/api/authorization/v02/refresh/
|
||
|
||
В запросе Cookie:
|
||
```
|
||
Cookie: jwt_a = Access token
|
||
Cookie: jwt_r = Refresh token
|
||
```
|
||
Пример ответа:
|
||
```json
|
||
{
|
||
"error_code": "0",
|
||
"error_message":""
|
||
}
|
||
```
|
||
Также в ответе Cookie:
|
||
```
|
||
Cookie: jwt_a = Access token
|
||
Cookie: jwt_r = Refresh token
|
||
```
|
||
|
||
### Ссылка для подтверждения смены пароля (переходят на неё из почты)
|
||
https://istransit.kz/api/authorization/v02/reset/
|
||
|
||
Пример запроса:
|
||
```html
|
||
https://istransit.kz/api/authorization/v02/reset/?token=xxxxx&lng=1
|
||
```
|
||
|
||
В ответ HTML страница с результатом на 7 секунд, с переходом на главную страницу:
|
||
```html
|
||
<!DOCTYPE html>
|
||
<html lang="ru">
|
||
<head>
|
||
<title></title>
|
||
<meta http-equiv="refresh" content="7; url='https://aistransit.kz'" />
|
||
</head>
|
||
<body>
|
||
<h1>Описание результата</h1>
|
||
</body>
|
||
</html>
|
||
```
|
||
|
||
### Принять капчу и код для инициализации процедуры восстановления пароля
|
||
https://istransit.kz/api/authorization/v02/restore/
|
||
|
||
Пример запроса:
|
||
```json
|
||
{
|
||
"code":"11111",
|
||
"token":"ZUROMC9xQVpRNjVGZGZBSdyc2JIV0ZueHdDMHVlbWVBPT0=.ywHb5zzI+ARK3XDRpgVkC1fdlqEQWWOXLuVIu\/rRMho="
|
||
}
|
||
```
|
||
Код и токен из captcha
|
||
|
||
Пример ответа:
|
||
```json
|
||
{
|
||
"error_code": "0",
|
||
"error_message":""
|
||
}
|
||
```
|
||
|
||
### Обновить пароль по логину и старому паролю
|
||
https://istransit.kz/api/authorization/v02/update/
|
||
|
||
Для этой функции авторизация пользователя не обязательна, а значит пользователя можно не авторизовывать если у него просрочен пароль.
|
||
|
||
В новом пароле должно быть цифра, большая латинская буква, маленькая латинская буква, один спец символ и длина не менее 6 символов.
|
||
|
||
Пример запроса:
|
||
```json
|
||
{
|
||
"login":"test@mail.ru",
|
||
"password":"12345",
|
||
"password_new":"54321"
|
||
}
|
||
```
|
||
Пример ответа:
|
||
```json
|
||
{
|
||
"error_code": "0",
|
||
"error_message":""
|
||
}
|
||
```
|
||
|
||
### Проверить валидность токена доступа
|
||
https://istransit.kz/api/authorization/v02/alive/
|
||
|
||
На вход Cookie с jwt_a токеном, на выход код ошибки.
|
||
|
||
Пример ответа:
|
||
```json
|
||
{
|
||
"error_code": "0",
|
||
"error_message":""
|
||
}
|
||
``` |