Session: дублировать сессии во внешний Redis для доступа из n8n

- backend/app/api/session.py: при записи сессии в локальный Redis (6383) теперь также дублируем те же ключи
  в внешний Redis (REDIS_HOST/REDIS_PORT) через redis_service.client.
- Дублируются оба вида ключей:
  - session:{channel}:{channel_user_id}
  - session:{session_token}
- Ошибки внешнего Redis не ломают авторизацию: при недоступности — warning в логах.
This commit is contained in:
Fedor
2026-02-27 10:33:07 +03:00
parent 06b89d20e7
commit f2e144e9ca
2 changed files with 34 additions and 4 deletions

View File

@@ -0,0 +1,8 @@
Session: дублировать сессии во внешний Redis для доступа из n8n
- backend/app/api/session.py: при записи сессии в локальный Redis (6383) теперь также дублируем те же ключи
в внешний Redis (REDIS_HOST/REDIS_PORT) через redis_service.client.
- Дублируются оба вида ключей:
- session:{channel}:{channel_user_id}
- session:{session_token}
- Ошибки внешнего Redis не ломают авторизацию: при недоступности — warning в логах.

View File

@@ -16,6 +16,8 @@ from fastapi import APIRouter, HTTPException
from pydantic import BaseModel
import redis.asyncio as redis
from ..services.redis_service import redis_service
logger = logging.getLogger(__name__)
router = APIRouter(prefix="/api/v1/session", tags=["session"])
@@ -59,10 +61,20 @@ async def set_session_by_channel_user(
"verified_at": datetime.utcnow().isoformat(),
}
ttl = SESSION_BY_CHANNEL_TTL_HOURS * 3600 if SESSION_BY_CHANNEL_TTL_HOURS else None
body = json.dumps(payload)
if ttl:
await redis_client.setex(key, ttl, json.dumps(payload))
await redis_client.setex(key, ttl, body)
else:
await redis_client.set(key, json.dumps(payload))
await redis_client.set(key, body)
# Дублируем сессию в внешний Redis, чтобы n8n мог читать по тем же ключам
try:
if redis_service.client:
if ttl:
await redis_service.client.setex(key, ttl, body)
else:
await redis_service.client.set(key, body)
except Exception as e:
logger.warning("Не удалось продублировать сессию в внешний Redis (channel): %s", e)
logger.info("Сессия записана: %s, unified_id=%s", key, payload.get("unified_id"))
@@ -94,10 +106,20 @@ async def set_session_by_token(session_token: str, data: Dict[str, Any]) -> None
"verified_at": datetime.utcnow().isoformat(),
}
ttl = SESSION_BY_CHANNEL_TTL_HOURS * 3600 if SESSION_BY_CHANNEL_TTL_HOURS else None
body = json.dumps(payload)
if ttl:
await redis_client.setex(key, ttl, json.dumps(payload))
await redis_client.setex(key, ttl, body)
else:
await redis_client.set(key, json.dumps(payload))
await redis_client.set(key, body)
# Дублируем сессию по токену в внешний Redis для доступа из n8n
try:
if redis_service.client:
if ttl:
await redis_service.client.setex(key, ttl, body)
else:
await redis_service.client.set(key, body)
except Exception as e:
logger.warning("Не удалось продублировать сессию в внешний Redis (token): %s", e)
class SessionVerifyRequest(BaseModel):