🔒 Безопасность
JWT + CSRF + HMAC + Rate Limiting + RLS
Многоуровневая защита платформы Red Petroleum EV
Аутентификация
JWT Token Flow
Токен
Тип
Срок
Хранение
Access Token
JWT
15 минут
HTTP-only Cookie (evp_access)
Refresh Token
JWT
7 дней
HTTP-only Cookie (evp_refresh)
CSRF Token
Random
Сессия
Cookie + Header (XSRF-TOKEN)
JWT Structure
{
"sub" : "user_uuid" ,
"role" : "client" ,
"phone" : "+996700123456" ,
"exp" : 1740000000 ,
"iat" : 1739999100
}
RBAC — Role-Based Access Control
flowchart TD
R["HTTP Request"] --> MW["Auth Middleware"]
MW --> JV["JWT Verify"]
JV -->|Invalid| E401["401 Unauthorized"]
JV -->|Valid| RC["Role Check"]
RC -->|Insufficient| E403["403 Forbidden"]
RC -->|OK| EP["Endpoint Handler"]
style E401 fill:#EF4444,color:#fff
style E403 fill:#F59E0B,color:#000
style EP fill:#22C55E,color:#000
CSRF Protection
Двойная Cookie защита:
Сервер устанавливает XSRF-TOKEN cookie (readable)
Клиент читает cookie и отправляет в header X-XSRF-TOKEN
Сервер сравнивает cookie и header
# Пример проверки
def verify_csrf ( request ):
cookie_token = request . cookies . get ( "XSRF-TOKEN" )
header_token = request . headers . get ( "X-XSRF-TOKEN" )
if not cookie_token or cookie_token != header_token :
raise HTTPException ( 403 , "CSRF validation failed" )
HMAC-SHA512 (Namba One)
Все запросы к платёжному API подписываются:
import hmac , hashlib
def sign_request ( merchant_guid : str , secret : str , payload : str ) -> str :
message = f " { merchant_guid } : { payload } "
return hmac . new (
secret . encode (), message . encode (), hashlib . sha512
) . hexdigest ()
Webhook верификация
Проверка
Описание
IP Whitelist
Только IP-адреса Namba One
Webhook Secret
HMAC подпись тела
Idempotency
Дедупликация по payment_id
Rate Limiting
REST API
Эндпоинт
Лимит
Окно
/auth/otp/request
3 запроса
5 минут
/auth/otp/verify
5 попыток
5 минут
/charging/start
10 запросов
1 минута
Общий API
100 запросов
1 минута
Admin API
200 запросов
1 минута
OCPP WebSocket
Параметр
Лимит
Heartbeat интервал
30 секунд (мин)
MeterValues интервал
15 секунд (мин)
Сообщений / минута / станция
20
Reconnect backoff
Экспоненциальный (1s → 2s → 4s → ... → 60s)
Защита базы данных
Row Level Security (RLS)
-- Клиент видит только свои данные
CREATE POLICY user_own_data ON charging_sessions
FOR ALL USING ( user_id = auth . uid ());
-- Партнёр видит только свои станции
CREATE POLICY partner_stations ON stations
FOR SELECT USING ( partner_id = auth . uid ());
-- Админ видит всё
CREATE POLICY admin_all ON charging_sessions
FOR ALL USING ( auth . jwt () ->> 'role' IN ( 'superadmin' , 'admin' ));
SQL Injection Protection
Мера
Реализация
ORM
SQLAlchemy 2.0 (параметризованные запросы)
Pydantic
Валидация всех входных данных
Prepared Statements
Для raw SQL запросов
Input Sanitization
Escape на уровне ORM
Idempotency
Зарядные сессии
# Предотвращение двойного старта
async def start_charging ( user_id , connector_id ):
# Проверка активной сессии
active = await get_active_session ( user_id )
if active :
raise HTTPException ( 409 , "Active session exists" )
# Идемпотентный ключ
idempotency_key = f "charge: { user_id } : { connector_id } "
if await redis . get ( idempotency_key ):
raise HTTPException ( 409 , "Duplicate request" )
await redis . set ( idempotency_key , "1" , ex = 30 )
Платежи
Каждый webhook от Namba One содержит уникальный payment_id
Дедупликация: проверка в таблице balance_transactions
Атомарность: SELECT FOR UPDATE на баланс
OCPP Security
Мера
Описание
WSS (TLS)
Все OCPP соединения через WSS
Station Auth
Проверка charge_point_id при подключении
IP Whitelist
Опционально для станций
Message Validation
Валидация JSON по OCPP schema
Heartbeat Monitor
Детекция offline станций (>2 мин без heartbeat)
Compliance
Стандарт
Статус
Описание
OCPP 1.6J
✅
Полная совместимость
OCPP 2.0.1
✅
Базовые операции
PCI DSS
N/A
Платежи через Namba One (они сертифицированы)
GDPR/ЗЗПД
✅
Минимум персональных данных
ISO 27001
🟡
Планируется
Security Checklist
23 февраля 2026 г.
23 февраля 2026 г.