54 lines
1.6 KiB
Markdown
54 lines
1.6 KiB
Markdown
# Безопасность
|
|
|
|
## Базовые требования
|
|
|
|
- `.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 (настроен)
|