feat(vault): 凭据库(密码+2FA 动态码)与 MASTER_KEY 密钥托管
credentials 表为登录凭据唯一事实源(站点×登录方式,含 oauth/2FA);账号密码读写重定向凭据层并幂等迁移历史数据;TOTP 按 RFC6238 零依赖自实现,绑定需当前动态码校验;Key Escrow 防 MASTER_KEY 遗失;前端新增凭据库视图与账号 2FA 联动。64 pytest + 16 浏览器端到端验证通过。
This commit is contained in:
+7
-2
@@ -206,7 +206,8 @@ class Account(SQLModel, table=True):
|
||||
|
||||
资产的 Asset.account_id 字段外键引用本表,重命名账号不影响资产归属。
|
||||
唯一性:(platform, name) 联合唯一——同一邮箱/用户名可跨平台复用。
|
||||
凭证层:登录用户名/密码(网站登录)+ API 配置 JSON(SDK 同步用),
|
||||
凭证层:登录凭据(用户名/密码/2FA)统一存 credentials 表(唯一事实源),
|
||||
本表通过 credential_id 关联;API 配置 JSON(SDK 同步用)仍留在本表。
|
||||
平台本身不再持有凭证(Provider.api_config_encrypted 已弃用,仅留历史值)。
|
||||
"""
|
||||
|
||||
@@ -222,7 +223,11 @@ class Account(SQLModel, table=True):
|
||||
remark: Optional[str] = Field(default=None, description="备注")
|
||||
login_user: Optional[str] = Field(default=None, description="登录用户名/邮箱")
|
||||
login_password_encrypted: Optional[str] = Field(
|
||||
default=None, description="加密的登录密码(Fernet)"
|
||||
default=None, description="(已弃用)登录密码已迁至 credentials 表,仅留历史值"
|
||||
)
|
||||
credential_id: Optional[int] = Field(
|
||||
default=None, foreign_key="credentials.id", index=True,
|
||||
description="关联登录凭据 ID(登录密码唯一事实源在 credentials 表)"
|
||||
)
|
||||
api_config_encrypted: Optional[str] = Field(
|
||||
default=None, description="加密的 API 配置 JSON(access_key/secret/api_key 等,供 SDK 同步)"
|
||||
|
||||
Reference in New Issue
Block a user