Initial commit: VoIdeaAI - voice-first AI idea assistant
This commit is contained in:
@@ -0,0 +1,53 @@
|
||||
# Безопасность
|
||||
|
||||
## Базовые требования
|
||||
|
||||
- `.env` — всегда в `.gitignore`. Никогда не коммитить.
|
||||
- JWT: HS256, access_token = 60 минут, refresh_token = 30 дней
|
||||
- Пароли: bcrypt через passlib
|
||||
- Pydantic валидация на всех входах
|
||||
- RBAC: роли `user` и `admin` (`is_superuser`)
|
||||
|
||||
## Аутентификация
|
||||
|
||||
```python
|
||||
# app/core/security.py
|
||||
def create_access_token(data: dict, expires_delta: timedelta | None = None) -> str
|
||||
def decode_token(token: str) -> dict[str, Any] | None
|
||||
def hash_password(password: str) -> str
|
||||
def verify_password(plain: str, hashed: str) -> bool
|
||||
```
|
||||
|
||||
## RBAC
|
||||
|
||||
| Роль | Права |
|
||||
|------|-------|
|
||||
| user | CRUD своих идей, запуск анализа |
|
||||
| admin | Управление пользователями, просмотр логов, системные настройки |
|
||||
|
||||
## Sensitive data
|
||||
|
||||
**Никогда не логировать:**
|
||||
- Пароли (даже хэш)
|
||||
- JWT токены
|
||||
- API keys и секреты
|
||||
- Email в открытом виде (только user_id)
|
||||
|
||||
**Маскировать:**
|
||||
- Email: `u***@mail.ru`
|
||||
- IP: `195.208.*.*`
|
||||
|
||||
## Secrets management
|
||||
|
||||
| Окружение | Где хранить |
|
||||
|-----------|-------------|
|
||||
| Local | `.env` (в .gitignore) |
|
||||
| Staging/Prod | GitHub Secrets |
|
||||
|
||||
Без Vault (< 10 разработчиков). JWT_SECRET_KEY менять при утечке или раз в год.
|
||||
|
||||
## Запланировано
|
||||
|
||||
- OAuth2 (Yandex, Google) — Authlib
|
||||
- Rate limiting — slowapi
|
||||
- CORS — FastAPI middleware (настроен)
|
||||
Reference in New Issue
Block a user