diff --git a/apps/constants.py b/apps/constants.py index ca5421612c1682187f92785d3e677814d6a183ab..e0ea1af0f29df7e8de840da8e7d1057e7e7c6aac 100644 --- a/apps/constants.py +++ b/apps/constants.py @@ -18,6 +18,8 @@ SLIDE_WINDOW_QUESTION_COUNT = 10 MAX_API_RESPONSE_LENGTH = 8192 # Executor最大步骤历史数 STEP_HISTORY_SIZE = 3 +# Session时间,单位为分钟 +SESSION_TTL = 30 * 24 * 60 REASONING_BEGIN_TOKEN = [ "", diff --git a/apps/dependency/csrf.py b/apps/dependency/csrf.py index fb747b5ede895863f2625d4ebb17cf50b1854a70..2c6fa6b415acb71cb04a6e27305c988105b9cc87 100644 --- a/apps/dependency/csrf.py +++ b/apps/dependency/csrf.py @@ -7,6 +7,7 @@ Copyright (c) Huawei Technologies Co., Ltd. 2023-2025. All rights reserved. from fastapi import HTTPException, Request, Response, status from apps.common.config import Config +from apps.constants import SESSION_TTL from apps.manager.session import SessionManager @@ -26,10 +27,10 @@ async def verify_csrf_token(request: Request, response: Response) -> Response | raise HTTPException(status_code=status.HTTP_500_INTERNAL_SERVER_ERROR, detail="Renew CSRF token failed.") if Config().get_config().deploy.cookie == "DEBUG": - response.set_cookie("_csrf_tk", new_csrf_token, max_age=Config().get_config().fastapi.session_ttl * 60, + response.set_cookie("_csrf_tk", new_csrf_token, max_age=SESSION_TTL * 60, domain=Config().get_config().fastapi.domain) else: - response.set_cookie("_csrf_tk", new_csrf_token, max_age=Config().get_config().fastapi.session_ttl * 60, + response.set_cookie("_csrf_tk", new_csrf_token, max_age=SESSION_TTL * 60, secure=True, domain=Config().get_config().fastapi.domain, samesite="strict") return response diff --git a/apps/dependency/session.py b/apps/dependency/session.py index e83a6a97ebedc03cd5c3f1fb729ebcbadd5ce502..051844c69e6e66691fc014548c0f9fabb8e81cc7 100644 --- a/apps/dependency/session.py +++ b/apps/dependency/session.py @@ -11,6 +11,7 @@ from starlette.middleware.base import BaseHTTPMiddleware, RequestResponseEndpoin from starlette.requests import Request from apps.common.config import Config +from apps.constants import SESSION_TTL from apps.manager.session import SessionManager BYPASS_LIST = [ @@ -68,7 +69,7 @@ class VerifySessionMiddleware(BaseHTTPMiddleware): "httponly": True, "secure": True, "samesite": "strict", - "max_age": Config().get_config().fastapi.session_ttl * 60, + "max_age": SESSION_TTL * 60, }) response.set_cookie(**cookie_params) diff --git a/apps/dependency/user.py b/apps/dependency/user.py index 4699edb47ad19e968262075c8df56139de31fc11..f338935724c9ba130d092a1936f9b2559e41f937 100644 --- a/apps/dependency/user.py +++ b/apps/dependency/user.py @@ -14,6 +14,7 @@ from starlette.requests import HTTPConnection from apps.common.config import Config from apps.common.oidc import oidc_provider +from apps.constants import SESSION_TTL from apps.manager.api_key import ApiKeyManager from apps.manager.session import SessionManager @@ -69,7 +70,7 @@ async def _verify_oidc_auth(request: HTTPConnection, response: Response) -> str: response.set_cookie( "ECSESSION", current_session, - max_age=Config().get_config().fastapi.session_ttl * 60, + max_age=SESSION_TTL * 60, secure=True, domain=Config().get_config().fastapi.domain, httponly=True, diff --git a/apps/entities/config.py b/apps/entities/config.py index bec3718e6fae8cf6f7d0be22449fafda204be311..971f249f41f8e6935e656dc8dda854d9f2181a50 100644 --- a/apps/entities/config.py +++ b/apps/entities/config.py @@ -55,7 +55,6 @@ class FastAPIConfig(BaseModel): """FastAPI配置""" domain: str = Field(description="当前实例的域名") - session_ttl: int = Field(description="用户需要刷新Token的间隔(min)", default=30) csrf: bool = Field(description="是否启用CSRF Token功能", default=False) diff --git a/apps/manager/session.py b/apps/manager/session.py index b143b478fd21b76d8b03f50d6c0f6c5f632719dd..77f034bcb5e14c5665fcc7d0bf25029e9caaf778 100644 --- a/apps/manager/session.py +++ b/apps/manager/session.py @@ -12,6 +12,7 @@ import secrets from datetime import UTC, datetime, timedelta from apps.common.config import Config +from apps.constants import SESSION_TTL from apps.entities.config import FixedUserConfig from apps.entities.session import Session from apps.exceptions import LoginSettingsError, SessionError @@ -35,7 +36,7 @@ class SessionManager: data = Session( _id=session_id, ip=ip, - expired_at=datetime.now(UTC) + timedelta(minutes=Config().get_config().fastapi.session_ttl), + expired_at=datetime.now(UTC) + timedelta(minutes=SESSION_TTL), ) if Config().get_config().login.provider == "disable": login_settings = Config().get_config().login.settings diff --git a/apps/routers/auth.py b/apps/routers/auth.py index d5a78ddf5ace8923935f01178ffd842b501ca406..0665bd4060fec447d7e07f9dd929583b21121348 100644 --- a/apps/routers/auth.py +++ b/apps/routers/auth.py @@ -12,6 +12,7 @@ from fastapi.responses import JSONResponse, RedirectResponse from apps.common.config import Config from apps.common.oidc import oidc_provider +from apps.constants import SESSION_TTL from apps.dependency import get_user, verify_csrf_token, verify_user from apps.entities.collection import Audit from apps.entities.response_data import ( @@ -98,7 +99,7 @@ async def oidc_login(request: Request, code: str, redirect_index: str | None = N response.set_cookie( "_csrf_tk", new_csrf_token, - max_age=Config().get_config().fastapi.session_ttl * 60, + max_age=SESSION_TTL * 60, secure=True, domain=Config().get_config().fastapi.domain, samesite="strict", @@ -106,7 +107,7 @@ async def oidc_login(request: Request, code: str, redirect_index: str | None = N response.set_cookie( "ECSESSION", current_session, - max_age=Config().get_config().fastapi.session_ttl * 60, + max_age=SESSION_TTL * 60, secure=True, domain=Config().get_config().fastapi.domain, httponly=True, @@ -145,7 +146,7 @@ async def logout(request: Request, response: Response, user_sub: Annotated[str, response.set_cookie( "ECSESSION", new_session, - max_age=Config().get_config().fastapi.session_ttl * 60, + max_age=SESSION_TTL * 60, httponly=True, secure=True, samesite="strict", diff --git a/assets/.config.example.toml b/assets/.config.example.toml index 5cf07e0bd2f4900d14efbb3dc80270975a76e4d9..fc54fb5ea5fe2acb7475948859c4890640878029 100644 --- a/assets/.config.example.toml +++ b/assets/.config.example.toml @@ -14,7 +14,6 @@ app_secret = '' [fastapi] domain = 'www.eulercopilot.local' -session_ttl = 30 csrf = false [security]