"""identity 域的请求/响应模型(T4:双令牌会话,FR-ACC-05)。 ``apps/api/schemas.py`` 是本批次的共享禁改文件,refresh/logout 的契约模型 放在域内这里,由 ``apps/api/routers/auth.py`` 引用;wire 响应仍只是统一 信封 (架构文档 §9.2) 里的 ``data`` 部分。 """ from __future__ import annotations from pydantic import BaseModel, Field #: 生成端 token_urlsafe(48) 恒为 64 字符;上限放宽到 128 容忍未来换编码。 _REFRESH_TOKEN_MAX_LENGTH = 128 class RefreshRequest(BaseModel): refresh_token: str = Field(min_length=1, max_length=_REFRESH_TOKEN_MAX_LENGTH) class LogoutRequest(BaseModel): refresh_token: str = Field(min_length=1, max_length=_REFRESH_TOKEN_MAX_LENGTH) class TokenPairResponse(BaseModel): """dev-token 与 /auth/refresh 共用的双令牌响应。 旧字段名 ``access_token/token_type/expires_in/user_id`` 保持不变 (smoke.sh 与既有测试依赖),新增 ``refresh_token/refresh_expires_in``。 """ access_token: str refresh_token: str token_type: str = "Bearer" expires_in: int = Field(description="access token 有效期(秒)") refresh_expires_in: int = Field(description="refresh token 有效期(秒)") user_id: str = Field(description="雪花 ID 以字符串返回,避免 JS 精度丢失")