会话管理
会话管理
相关源文件
本章引用的主要源码文件:
backend/alembic/versions/74379b447d4c_add_paste_as_tile_to_user.pybackend/ee/onyx/main.pybackend/ee/onyx/server/auth_check.pybackend/ee/onyx/server/enterprise_settings/api.pybackend/ee/onyx/server/enterprise_settings/store.pybackend/onyx/auth/schemas.pybackend/onyx/auth/users.pybackend/onyx/db/enums.pybackend/onyx/db/models.pybackend/onyx/db/user_preferences.pybackend/onyx/main.pybackend/onyx/server/auth_check.pybackend/onyx/server/manage/get_state.pybackend/onyx/server/manage/models.pybackend/onyx/server/manage/users.pybackend/onyx/server/runtime/onyx_runtime.pybackend/onyx/server/saml.pybackend/onyx/utils/file.pybackend/static/images/logo.pngbackend/tests/api/test_api.pybackend/tests/unit/onyx/auth/test_single_tenant_jwt_strategy.pybackend/tests/unit/onyx/server/scim/test_admin.pydeployment/aws_ecs_fargate/cloudformation/services/onyx_nginx_service_template.yamldeployment/aws_ecs_fargate/cloudformation/services/onyx_web_server_service_template.yamlweb/src/app/auth/saml/callback/route.tsweb/src/hooks/useTokenRefresh.test.tsxweb/src/hooks/useTokenRefresh.tsweb/src/lib/redirectSS.tsweb/src/providers/UserProvider.tsx
目的与范围
本文档描述了 Onyx 中的会话管理系统,该系统负责处理跨 HTTP 请求的用户认证状态。系统支持多种后端存储选项(Redis、PostgreSQL 和 JWT),使用仅 HTTP 的 Cookie 传输会话令牌,并通过 SESSION_EXPIRE_TIME_SECONDS 实现可配置的令牌过期策略。
关于认证方法(OAuth、OIDC、SAML)的信息,请参见认证方法。关于用户角色和权限,请参见用户角色与权限。关于多租户架构和租户隔离,请参见多租户架构。
会话架构总览
Onyx 利用 fastapi-users 库管理用户会话。系统通过 AUTH_BACKEND 配置支持可插拔的后端存储,允许部署选择 Redis(默认)、PostgreSQL 或 JWT 进行会话持久化 backend/onyx/auth/users.py:86。
会话生命周期图
来源: backend/onyx/auth/users.py:45-53, backend/onyx/configs/app_configs.py:86-101
后端存储选项
会话后端通过 AUTH_BACKEND 环境变量进行配置 backend/onyx/configs/app_configs.py:86。系统支持 AuthBackend 枚举中定义的三种后端实现 backend/onyx/auth/schemas.py:76-80:
| 后端 | 存储位置 | 使用场景 | 配置 |
|---|---|---|---|
| Redis(默认) | 内存键值存储 | 高性能部署、水平扩展 | AUTH_BACKEND=redis |
| PostgreSQL | 数据库中的 AccessToken 表 | 简化基础设施、单数据库部署 | AUTH_BACKEND=postgres |
| JWT | 无状态客户端 | 数据库查询开销较大的微服务场景 | AUTH_BACKEND=jwt |
后端选择架构
来源: backend/onyx/auth/schemas.py:76-80, backend/onyx/auth/users.py:45-53, backend/onyx/db/models.py:126
令牌过期与生命周期
会话持续时间由 SESSION_EXPIRE_TIME_SECONDS 控制 backend/onyx/configs/app_configs.py:99。该值决定了 Redis 键的 TTL 以及数据库支持令牌的有效期窗口。
关键配置变量
SESSION_EXPIRE_TIME_SECONDS:会话长度的主要控制参数(默认值:1 天或 86400 秒)backend/onyx/configs/app_configs.py:99。AUTH_COOKIE_EXPIRE_TIME_SECONDS:专门控制认证 Cookie 的Max-Age属性backend/onyx/configs/app_configs.py:87。
令牌创建追踪
系统会追踪当前会话令牌的创建时间,通过 UserInfo 模型为前端提供安全上下文 backend/onyx/server/manage/models.py:123-140。UserInfo.from_model 工厂方法会填充这些字段 backend/onyx/server/manage/models.py:141-153。
get_current_token_creation 的实现因后端而异:
- PostgreSQL:通过
get_latest_access_token_for_user查询特定用户的AccessToken模型backend/onyx/db/user_preferences.py:115-131。 - 前端使用:
UserInfo对象包含current_token_created_at和current_token_expiry_length,允许客户端处理会话警告或自动刷新backend/onyx/server/manage/models.py:133-134。
来源: backend/onyx/configs/app_configs.py:87-99, backend/onyx/server/manage/models.py:123-153, backend/onyx/db/user_preferences.py:115-131
PostgreSQL 后端实现
PostgreSQL 后端使用 AccessToken 模型持久化会话。这对于不希望为认证单独管理 Redis 实例的部署场景非常有用。
数据模型:AccessToken
定义在 backend/onyx/db/models.py 中,它继承自 SQLAlchemyBaseAccessTokenTableUUID backend/onyx/db/models.py:126。
| 字段 | 类型 | 描述 |
|---|---|---|
token | 字符串 | 会话标识符(主键) |
user_id | UUID | 指向 User 表的外键 |
created_at | 日期时间 | 会话创建的时间戳 |
策略实现
DatabaseStrategy 通过 get_access_token_db 初始化,该方法会生成一个链接到 AccessToken 模型的 AccessTokenDatabase backend/onyx/db/auth.py:116。
来源: backend/onyx/db/models.py:126, backend/onyx/db/auth.py:116, backend/onyx/auth/users.py:52-53
其他令牌类型
除了标准 Web 会话外,Onyx 还通过专用令牌支持程序化访问:
个人访问令牌(PAT)
用于特定用户的长期 API 访问。
- 验证:
fetch_user_for_pat验证哈希令牌并检查过期状态backend/onyx/db/pat.py:130。
API 密钥
用于服务账户风格的访问。
- 验证:
fetch_user_for_api_key查找关联的虚拟用户backend/onyx/db/api_key.py:115。
令牌验证流程
来源: backend/onyx/auth/users.py:74-81, backend/onyx/db/pat.py:130, backend/onyx/db/api_key.py:115
会话销毁
会话通过 /auth/logout 端点(由 FastAPIUsers 提供)销毁。
- Redis:与
REDIS_AUTH_KEY_PREFIX关联的键会被失效backend/onyx/auth/users.py:97。 - PostgreSQL:从
accesstoken表中删除具有匹配token的行backend/onyx/db/auth.py:116。 - Cookie:浏览器被指示清除
FASTAPI_USERS_AUTH_COOKIE_NAMEbackend/onyx/configs/constants.py:110。
来源: backend/onyx/auth/users.py:45-53, backend/onyx/configs/constants.py:110, backend/onyx/configs/app_configs.py:97