feat(auth): store the token signing secret in the metadata layer
- app_settings table (PostgreSQL migration 000010, SQLite 000002) - internal/settings repository (Get/Set/Ensure) wired into store.Repos - secret generated with crypto/rand on first start and persisted; reused on restart - drop required JWT_SECRET from env/config; app.New takes a TokenManager and storage.Open takes the resolved secret (URL_SECRET still overrides) - docs updated
This commit is contained in:
@@ -0,0 +1,36 @@
|
||||
# Proposal
|
||||
|
||||
## Why
|
||||
|
||||
`JWT_SECRET` сейчас обязателен в окружении: его нужно задавать вручную и одинаково на
|
||||
всех инстансах. Хранение секрета в слое метаданных с автогенерацией убирает обязательный
|
||||
секрет из env и даёт стабильное значение на инсталляцию.
|
||||
|
||||
## What Changes
|
||||
|
||||
- Убрать обязательный `JWT_SECRET` из конфига и окружения.
|
||||
- Добавить таблицу `app_settings` (key/value) в оба бэкенда метаданных (PostgreSQL и
|
||||
SQLite) и репозиторий чтения/создания секрета.
|
||||
- При старте после открытия метаданных читать секрет или генерировать его
|
||||
(`crypto/rand`) и сохранять; использовать для `TokenManager` и как fallback при подписи
|
||||
URL объектов.
|
||||
- `URL_SECRET` остаётся необязательным env-оверрайдом.
|
||||
- Обновить `.env.example`, `project.md`, `README.md`.
|
||||
|
||||
## Capabilities
|
||||
|
||||
### New Capabilities
|
||||
- `app-secrets`: хранение секретов приложения (JWT) в слое метаданных с автогенерацией при первом использовании.
|
||||
|
||||
### Modified Capabilities
|
||||
<!-- Нет изменений требований существующих спек: для клиента поведение аутентификации не меняется. -->
|
||||
|
||||
## Impact
|
||||
|
||||
- `backend/internal/config` (убрать `JWTSecret` и его обязательность).
|
||||
- `backend/internal/app`, `backend/cmd/server` (порядок старта: метаданные → секрет →
|
||||
storage/app).
|
||||
- `backend/internal/storage` (fallback-секрет для подписи URL).
|
||||
- Новая settings-репозиция (`internal/settings`), миграции PostgreSQL и SQLite.
|
||||
- Тесты (контрактные, e2e), `.env.example`, `project.md`, `README.md`.
|
||||
- Не затрагивает формат данных клиента.
|
||||
Reference in New Issue
Block a user