SHA256
TrustedDeviceLogin API и настройки входа через устройство
Что сделано:\n- публичный API сценария входа через доверенное устройство переведён на TrustedDeviceLogin\n- добавлен GetTrustedDeviceLoginSettings\n- отсутствие записи настроек на сервере теперь трактуется как enabled=true и hasPassword=false\n- ttlSeconds убран из клиентского API, TTL заявки фиксирован на сервере: 300 секунд\n- в shine-UI добавлен отдельный экран настроек входа через устройство и статус на основном экране\n- browser wallet переведён на новые TrustedDeviceLogin операции\n- в wallet добавлен выбор rootKey/deviceKey для будущего запроса подписи\n- документация API обновлена\n\nЧто ещё не проверено вручную end-to-end:\n- полный сценарий UI/plugin после этого деплоя не прогонялся руками до конца\n- сам signaling подписи в wallet всё ещё не реализован
This commit is contained in:
@@ -303,13 +303,14 @@ SESSION_LOGIN:{sessionId}:{timeMs}:{nonce}
|
||||
|
||||
Новые `op`, относящиеся к этому сценарию:
|
||||
|
||||
- `UpsertEspPairingSettings`
|
||||
- `StartEspPairing`
|
||||
- `ListEspPairingRequests`
|
||||
- `ApproveEspPairing`
|
||||
- `RejectEspPairing`
|
||||
- `CancelEspPairing`
|
||||
- `GetEspPairingStatus`
|
||||
- `GetTrustedDeviceLoginSettings`
|
||||
- `UpsertTrustedDeviceLoginSettings`
|
||||
- `StartTrustedDeviceLogin`
|
||||
- `ListTrustedDeviceLoginRequests`
|
||||
- `ApproveTrustedDeviceLogin`
|
||||
- `RejectTrustedDeviceLogin`
|
||||
- `CancelTrustedDeviceLogin`
|
||||
- `GetTrustedDeviceLoginStatus`
|
||||
|
||||
В этом потоке:
|
||||
|
||||
|
||||
@@ -9,16 +9,17 @@
|
||||
|
||||
Дополнительно в этом же слое управления сессиями появился сценарий pairing через доверенную уже авторизованную сессию пользователя:
|
||||
|
||||
- `UpsertEspPairingSettings`
|
||||
- `ListEspPairingRequests`
|
||||
- `ApproveEspPairing`
|
||||
- `RejectEspPairing`
|
||||
- `CancelEspPairing`
|
||||
- `GetTrustedDeviceLoginSettings`
|
||||
- `UpsertTrustedDeviceLoginSettings`
|
||||
- `ListTrustedDeviceLoginRequests`
|
||||
- `ApproveTrustedDeviceLogin`
|
||||
- `RejectTrustedDeviceLogin`
|
||||
- `CancelTrustedDeviceLogin`
|
||||
|
||||
Анонимное новое устройство работает с двумя связанными операциями:
|
||||
|
||||
- `StartEspPairing`
|
||||
- `GetEspPairingStatus`
|
||||
- `StartTrustedDeviceLogin`
|
||||
- `GetTrustedDeviceLoginStatus`
|
||||
|
||||
Логика раздела такая:
|
||||
|
||||
@@ -167,11 +168,11 @@ K9v3nQ4u8jYk0a2p7cD4mLx1zR0sT5wV6bN8eH3fQ1M
|
||||
|
||||
---
|
||||
|
||||
## 5. ESP pairing через доверенную сессию
|
||||
## 5. TrustedDeviceLogin через доверенную сессию
|
||||
|
||||
Этот блок относится к сценарию добавления новой сессии через доверенное устройство пользователя.
|
||||
|
||||
### 5.1. `UpsertEspPairingSettings`
|
||||
### 5.1. `GetTrustedDeviceLoginSettings`
|
||||
|
||||
Доступно для любой уже авторизованной доверенной сессии пользователя.
|
||||
|
||||
@@ -179,17 +180,57 @@ K9v3nQ4u8jYk0a2p7cD4mLx1zR0sT5wV6bN8eH3fQ1M
|
||||
|
||||
```json
|
||||
{
|
||||
"op": "UpsertEspPairingSettings",
|
||||
"requestId": "esp-set-001",
|
||||
"op": "GetTrustedDeviceLoginSettings",
|
||||
"requestId": "trusted-login-get-001",
|
||||
"payload": {
|
||||
"enabled": true,
|
||||
"passwordHash": "sha256$0123abcd...",
|
||||
"ttlSeconds": 180
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
Если pairing должен работать **без доп. пароля**, клиент может включить его с пустым `passwordHash`.
|
||||
### Успешный ответ
|
||||
|
||||
```json
|
||||
{
|
||||
"op": "GetTrustedDeviceLoginSettings",
|
||||
"requestId": "trusted-login-get-001",
|
||||
"status": 200,
|
||||
"ok": true,
|
||||
"payload": {
|
||||
"enabled": true,
|
||||
"hasPassword": false
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
Если отдельной записи настроек на сервере ещё нет, сервер считает состояние по умолчанию таким:
|
||||
|
||||
- `enabled = true`
|
||||
- `hasPassword = false`
|
||||
|
||||
### Ошибки
|
||||
|
||||
- `463 / PAIRING_REQUIRES_AUTH_SESSION` — операция вызвана без уже авторизованной доверенной сессии пользователя.
|
||||
|
||||
### 5.2. `UpsertTrustedDeviceLoginSettings`
|
||||
|
||||
Доступно для любой уже авторизованной доверенной сессии пользователя.
|
||||
|
||||
### Запрос
|
||||
|
||||
```json
|
||||
{
|
||||
"op": "UpsertTrustedDeviceLoginSettings",
|
||||
"requestId": "esp-set-001",
|
||||
"payload": {
|
||||
"enabled": true,
|
||||
"passwordHash": "sha256$0123abcd..."
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
Если вход через доверенное устройство должен работать **без доп. пароля**, клиент включает его с пустым `passwordHash`.
|
||||
|
||||
Если `enabled = false`, сервер автоматически удаляет пароль и запрещает вход через другое устройство.
|
||||
|
||||
Формат непустого `passwordHash`:
|
||||
|
||||
@@ -201,13 +242,13 @@ sha256$<hex( SHA-256("shine-pairing|" + lower(login.trim()) + "|" + password) )>
|
||||
|
||||
```json
|
||||
{
|
||||
"op": "UpsertEspPairingSettings",
|
||||
"op": "UpsertTrustedDeviceLoginSettings",
|
||||
"requestId": "esp-set-001",
|
||||
"status": 200,
|
||||
"ok": true,
|
||||
"payload": {
|
||||
"enabled": true,
|
||||
"ttlSeconds": 180
|
||||
"hasPassword": true
|
||||
}
|
||||
}
|
||||
```
|
||||
@@ -216,7 +257,7 @@ sha256$<hex( SHA-256("shine-pairing|" + lower(login.trim()) + "|" + password) )>
|
||||
|
||||
- `463 / PAIRING_REQUIRES_AUTH_SESSION` — операция вызвана без уже авторизованной доверенной сессии пользователя.
|
||||
|
||||
### 5.2. `StartEspPairing`
|
||||
### 5.3. `StartTrustedDeviceLogin`
|
||||
|
||||
Эта операция доступна без уже существующей пользовательской сессии.
|
||||
|
||||
@@ -224,7 +265,7 @@ sha256$<hex( SHA-256("shine-pairing|" + lower(login.trim()) + "|" + password) )>
|
||||
|
||||
```json
|
||||
{
|
||||
"op": "StartEspPairing",
|
||||
"op": "StartTrustedDeviceLogin",
|
||||
"requestId": "esp-start-001",
|
||||
"payload": {
|
||||
"login": "alice",
|
||||
@@ -237,15 +278,17 @@ sha256$<hex( SHA-256("shine-pairing|" + lower(login.trim()) + "|" + password) )>
|
||||
}
|
||||
```
|
||||
|
||||
Если на доверённом устройстве pairing включён **без доп. пароля**, новое устройство может отправить пустой `passwordHash`.
|
||||
Если на доверённом устройстве вход включён **без доп. пароля**, новое устройство может отправить пустой `passwordHash`.
|
||||
|
||||
Поле `trustedSessionOnline` показывает, что у пользователя сейчас есть хотя бы одна онлайн доверенная сессия, способная принять pairing-заявку.
|
||||
|
||||
TTL заявки фиксирован на сервере и сейчас всегда равен `300` секундам.
|
||||
|
||||
### Успешный ответ
|
||||
|
||||
```json
|
||||
{
|
||||
"op": "StartEspPairing",
|
||||
"op": "StartTrustedDeviceLogin",
|
||||
"requestId": "esp-start-001",
|
||||
"status": 200,
|
||||
"ok": true,
|
||||
@@ -272,7 +315,7 @@ sha256$<hex( SHA-256("shine-pairing|" + lower(login.trim()) + "|" + password) )>
|
||||
- `422 / PAIRING_NO_TRUSTED_SESSION_ONLINE` — сейчас нет ни одной онлайн доверённой сессии пользователя, поэтому код не создаётся.
|
||||
- `429 / PAIRING_RATE_LIMITED`
|
||||
|
||||
### 5.3. `ListEspPairingRequests`
|
||||
### 5.4. `ListTrustedDeviceLoginRequests`
|
||||
|
||||
Доступно для любой уже авторизованной доверенной сессии пользователя.
|
||||
Возвращает только реально активные pending-заявки со `state = created`. Уже `approved` и `rejected` заявки в этот список больше не попадают.
|
||||
@@ -281,7 +324,7 @@ sha256$<hex( SHA-256("shine-pairing|" + lower(login.trim()) + "|" + password) )>
|
||||
|
||||
```json
|
||||
{
|
||||
"op": "ListEspPairingRequests",
|
||||
"op": "ListTrustedDeviceLoginRequests",
|
||||
"requestId": "esp-list-001",
|
||||
"status": 200,
|
||||
"ok": true,
|
||||
@@ -309,7 +352,7 @@ sha256$<hex( SHA-256("shine-pairing|" + lower(login.trim()) + "|" + password) )>
|
||||
|
||||
- `463 / PAIRING_REQUIRES_AUTH_SESSION`
|
||||
|
||||
### 5.4. `ApproveEspPairing`
|
||||
### 5.5. `ApproveTrustedDeviceLogin`
|
||||
|
||||
Доступно для любой уже авторизованной доверенной сессии пользователя.
|
||||
|
||||
@@ -317,7 +360,7 @@ sha256$<hex( SHA-256("shine-pairing|" + lower(login.trim()) + "|" + password) )>
|
||||
|
||||
```json
|
||||
{
|
||||
"op": "ApproveEspPairing",
|
||||
"op": "ApproveTrustedDeviceLogin",
|
||||
"requestId": "esp-approve-001",
|
||||
"payload": {
|
||||
"pairingId": "base64url",
|
||||
@@ -330,7 +373,7 @@ sha256$<hex( SHA-256("shine-pairing|" + lower(login.trim()) + "|" + password) )>
|
||||
|
||||
```json
|
||||
{
|
||||
"op": "ApproveEspPairing",
|
||||
"op": "ApproveTrustedDeviceLogin",
|
||||
"requestId": "esp-approve-001",
|
||||
"status": 200,
|
||||
"ok": true,
|
||||
@@ -351,11 +394,11 @@ sha256$<hex( SHA-256("shine-pairing|" + lower(login.trim()) + "|" + password) )>
|
||||
- `422 / PAIRING_EXPIRED`
|
||||
- `463 / PAIRING_REQUIRES_AUTH_SESSION`
|
||||
|
||||
### 5.5. `RejectEspPairing`
|
||||
### 5.6. `RejectTrustedDeviceLogin`
|
||||
|
||||
Доступно для любой уже авторизованной доверенной сессии пользователя. Похоже на approve, но переводит заявку в `state=rejected`.
|
||||
|
||||
### 5.6. `GetEspPairingStatus`
|
||||
### 5.7. `GetTrustedDeviceLoginStatus`
|
||||
|
||||
Операция для нового устройства.
|
||||
|
||||
@@ -363,7 +406,7 @@ sha256$<hex( SHA-256("shine-pairing|" + lower(login.trim()) + "|" + password) )>
|
||||
|
||||
```json
|
||||
{
|
||||
"op": "GetEspPairingStatus",
|
||||
"op": "GetTrustedDeviceLoginStatus",
|
||||
"requestId": "esp-status-001",
|
||||
"payload": {
|
||||
"pairingId": "base64url"
|
||||
@@ -375,7 +418,7 @@ sha256$<hex( SHA-256("shine-pairing|" + lower(login.trim()) + "|" + password) )>
|
||||
|
||||
```json
|
||||
{
|
||||
"op": "GetEspPairingStatus",
|
||||
"op": "GetTrustedDeviceLoginStatus",
|
||||
"requestId": "esp-status-001",
|
||||
"status": 200,
|
||||
"ok": true,
|
||||
@@ -399,7 +442,7 @@ sha256$<hex( SHA-256("shine-pairing|" + lower(login.trim()) + "|" + password) )>
|
||||
- `canceled`
|
||||
- `expired`
|
||||
|
||||
### 5.7. `CancelEspPairing`
|
||||
### 5.8. `CancelTrustedDeviceLogin`
|
||||
|
||||
Операция для нового устройства, которое уже создало pairing-заявку и хочет принудительно снять ожидание до истечения TTL.
|
||||
|
||||
@@ -407,7 +450,7 @@ sha256$<hex( SHA-256("shine-pairing|" + lower(login.trim()) + "|" + password) )>
|
||||
|
||||
```json
|
||||
{
|
||||
"op": "CancelEspPairing",
|
||||
"op": "CancelTrustedDeviceLogin",
|
||||
"requestId": "esp-cancel-001",
|
||||
"payload": {
|
||||
"pairingId": "base64url",
|
||||
@@ -420,7 +463,7 @@ sha256$<hex( SHA-256("shine-pairing|" + lower(login.trim()) + "|" + password) )>
|
||||
|
||||
```json
|
||||
{
|
||||
"op": "CancelEspPairing",
|
||||
"op": "CancelTrustedDeviceLogin",
|
||||
"requestId": "esp-cancel-001",
|
||||
"status": 200,
|
||||
"ok": true,
|
||||
|
||||
@@ -19,13 +19,14 @@
|
||||
| `CreateAuthSession` | `02_Authentication_API.md` | создание новой авторизованной сессии |
|
||||
| `SessionChallenge` | `02_Authentication_API.md` | challenge для входа в существующую сессию |
|
||||
| `SessionLogin` | `02_Authentication_API.md` | вход в существующую сессию |
|
||||
| `UpsertEspPairingSettings` | `03_Session_Management_API.md` | включение/обновление pairing-настроек доверенной сессией |
|
||||
| `StartEspPairing` | `03_Session_Management_API.md` | создание pairing-заявки для нового устройства |
|
||||
| `ListEspPairingRequests` | `03_Session_Management_API.md` | список активных pairing-заявок для доверенной сессии |
|
||||
| `ApproveEspPairing` | `03_Session_Management_API.md` | подтверждение pairing-заявки доверенной сессией |
|
||||
| `RejectEspPairing` | `03_Session_Management_API.md` | отклонение pairing-заявки доверенной сессией |
|
||||
| `CancelEspPairing` | `03_Session_Management_API.md` | отмена pairing-заявки со стороны нового ожидающего устройства |
|
||||
| `GetEspPairingStatus` | `03_Session_Management_API.md` | чтение статуса и результата pairing-заявки |
|
||||
| `GetTrustedDeviceLoginSettings` | `03_Session_Management_API.md` | чтение текущего режима входа через доверенное устройство |
|
||||
| `UpsertTrustedDeviceLoginSettings` | `03_Session_Management_API.md` | включение/обновление pairing-настроек доверенной сессией |
|
||||
| `StartTrustedDeviceLogin` | `03_Session_Management_API.md` | создание pairing-заявки для нового устройства |
|
||||
| `ListTrustedDeviceLoginRequests` | `03_Session_Management_API.md` | список активных pairing-заявок для доверенной сессии |
|
||||
| `ApproveTrustedDeviceLogin` | `03_Session_Management_API.md` | подтверждение pairing-заявки доверенной сессией |
|
||||
| `RejectTrustedDeviceLogin` | `03_Session_Management_API.md` | отклонение pairing-заявки доверенной сессией |
|
||||
| `CancelTrustedDeviceLogin` | `03_Session_Management_API.md` | отмена pairing-заявки со стороны нового ожидающего устройства |
|
||||
| `GetTrustedDeviceLoginStatus` | `03_Session_Management_API.md` | чтение статуса и результата pairing-заявки |
|
||||
| `ListSessions` | `03_Session_Management_API.md` | список активных сессий |
|
||||
| `CloseActiveSession` | `03_Session_Management_API.md` | закрытие активной сессии |
|
||||
| `AddBlock` | `04_Add_Block_to_Blockchain_API.md` | добавление блока в блокчейн |
|
||||
|
||||
Reference in New Issue
Block a user