diff --git a/features/tbank-connection.md b/features/tbank-connection.md new file mode 100644 index 0000000..c53a97a --- /dev/null +++ b/features/tbank-connection.md @@ -0,0 +1,38 @@ +# Подключение T-Bank + +Авторизованный пользователь управляет одним подключением к T-Bank Invest в настройках. Токен вводится только в поле пароля, отправляется в backend для проверки и больше не отображается. + +```mermaid +sequenceDiagram + participant F as Frontend + participant B as Backend + participant T as T-Bank gRPC + participant D as SQLite + F->>B: PUT /api/v1/tbank-connection (Bearer, token) + B->>T: GetAccounts(OPEN) over TLS + T-->>B: счета или ошибка проверки + B->>D: сохранить шифротекст AES-256-GCM + B-->>F: { connected, connectedAt } +``` + +## API + +- `GET /api/v1/tbank-connection` возвращает `{ connected: false, connectedAt: null }` или статус подключенного аккаунта. +- `PUT /api/v1/tbank-connection` принимает `{ token }`, проверяет его через `GetAccounts` и создает или заменяет подключение. +- `DELETE /api/v1/tbank-connection` идемпотентен и возвращает `204`. +- `connectedAt` - метка времени RFC 3339 в UTC. Ответы и ошибки API никогда не содержат токен. + +`INVALID_TBANK_TOKEN` означает, что T-Bank отклонил аутентификацию или права доступа. `TBANK_UNAVAILABLE` означает временную ошибку, превышение лимита, ожидание в очереди или другую ошибку внешнего сервиса. + +## Configuration and limits + +- `TOKEN_ENCRYPTION_KEY` - закодированный в base64 32-байтный ключ AES-256-GCM; обязателен при запуске. +- `TBANK_GRPC_ENDPOINT` по умолчанию имеет значение `invest-public-api.tbank.ru:443`. +- `TBANK_RATE_LIMIT_PER_SECOND` по умолчанию имеет значение `5`. +- `TBANK_CA_CERT_PATH` - необязательный путь к корневому CA-сертификату PEM для сетей с TLS-инспекцией; проверка TLS остается включенной. + +FIFO-ограничитель на экземпляр запускает не более 5 запросов в секунду и принимает не более 50 ожидающих вызовов. Для `UNAVAILABLE`, `DEADLINE_EXCEEDED` и `RESOURCE_EXHAUSTED` выполняется одна повторная попытка через секунду. Deadline каждой попытки - 10 секунд. + +## MVP limits + +Реализована только проверка токена. Счета, портфели, кэш метаданных инструментов, ротация ключа, распределенное ограничение запросов и сериализация параллельного обновления подключения отложены. Вендорные protobuf-контракты взяты из `references/moex-vibe`; при необходимости обновляйте их вручную по официальной документации T-Bank Invest API.