账号生命周期管理
账户生命周期管理
相关源文件
本章引用的主要源码文件:
api/controllers/console/app/error.pyapi/controllers/console/auth/data_source_oauth.pyapi/controllers/console/auth/email_register.pyapi/controllers/console/auth/error.pyapi/controllers/console/auth/forgot_password.pyapi/controllers/console/auth/login.pyapi/controllers/console/auth/oauth.pyapi/controllers/console/explore/error.pyapi/controllers/console/explore/installed_app.pyapi/controllers/console/feature.pyapi/controllers/console/workspace/account.pyapi/controllers/console/workspace/members.pyapi/controllers/console/workspace/model_providers.pyapi/controllers/console/workspace/models.pyapi/controllers/console/workspace/plugin.pyapi/controllers/console/workspace/workspace.pyapi/controllers/web/error.pyapi/core/errors/error.pyapi/extensions/ext_mail.pyapi/libs/oauth.pyapi/libs/oauth_data_source.pyapi/libs/smtp.pyapi/migrations/versions/2026_01_17_1110-f9f6d18a37f9_add_table_explore_banner_and_trial.pyapi/schedule/mail_clean_document_notify_task.pyapi/services/__init__.pyapi/services/account_service.pyapi/services/errors/__init__.pyapi/services/errors/base.pyapi/services/errors/enterprise.pyapi/services/errors/llm.pyapi/templates/change_mail_confirm_old_template_zh-CN.htmlapi/templates/transfer_workspace_owner_confirm_template_en-US.htmlapi/templates/without-brand/transfer_workspace_owner_confirm_template_en-US.htmlapi/tests/test_containers_integration_tests/services/test_feature_service.pyapi/tests/unit_tests/libs/test_oauth_clients.pyapi/tests/unit_tests/services/test_account_service.pyweb/app/components/header/account-setting/members-page/__tests__/index.spec.tsxweb/app/components/header/account-setting/members-page/index.tsxweb/app/components/header/account-setting/members-page/operation/__tests__/index.spec.tsxweb/app/components/header/account-setting/members-page/operation/index.tsx
本文档描述了 Dify 中用户账户的完整生命周期,从创建到删除。内容涵盖账户注册、激活、认证令牌管理、密码重置流程、邮箱验证以及账户删除。
关于工作空间成员资格和角色的信息,请参见工作空间与成员管理。关于认证方法和会话管理,请参见认证方法与流程。关于多租户数据隔离,请参见租户模型与资源隔离。
概述
账户生命周期管理主要由 AccountService 和 RegisterService 类实现,并辅以令牌管理、速率限制和邮件发送等支持功能。系统支持多种账户创建路径(邮箱/密码、OAuth、基于邀请),并实现了全面的安全措施,包括速率限制、两阶段验证令牌以及带有冻结期的软删除。
来源: api/services/account_service.py:114-140, api/services/account_service.py:239-289
账户状态与转换
来源: api/services/account_service.py:161-194, api/models/account.py:37-46, api/controllers/console/workspace/account.py:250-251
Account 模型使用 AccountStatus 枚举,包含四种状态:
- 待激活(PENDING):账户已创建但尚未激活(未设置
initialized_at)。api/models/account.py:40 - 活跃(ACTIVE):账户已完全初始化并可正常使用。
api/models/account.py:40 - 封禁(BANNED):账户被阻止认证;
load_user会抛出Unauthorized异常。api/services/account_service.py:166-168 - 已关闭(CLOSED):账户被软删除,进入计费冻结期。
api/models/account.py:40
账户创建流程
邮箱/密码注册
注册由 RegisterService.register() 处理,该方法会校验密码强度、使用唯一盐值进行哈希处理,并创建基础的 Account 及其初始 Tenant。
来源: api/services/account_service.py:507-539, api/libs/password.py:11-34, api/controllers/console/auth/email_register.py:53-111
关键实现细节:
- 通过
valid_password()进行密码校验。api/libs/password.py:11-16 - 使用
secrets.token_bytes(16)生成盐值。api/libs/password.py:21 - 使用
hash_password()进行密码哈希,该函数采用hashlib.pbkdf2_hmac算法,迭代次数为 100,000 次。api/libs/password.py:19-31 - 哈希结果以 base64 编码字符串形式存储在
Account.password和Account.password_salt字段中。api/models/account.py:116-117
OAuth 注册
OAuth 注册通过 open_id 或 email 解析账户。如果账户不存在,则会生成新账户并关联集成信息。
来源: api/controllers/console/auth/oauth.py:82-173, api/libs/oauth.py:15-101, api/services/account_service.py:780-802
OAuth 提供商通过环境变量 GITHUB_CLIENT_ID 和 GOOGLE_CLIENT_ID 进行配置。api/controllers/console/auth/oauth.py:34-54 AccountIntegrate 模型存储与提供商 open_id 关联的 OAuth 链接信息。api/models/account.py:145-156
基于邀请的注册
邀请功能允许现有成员添加用户。如果用户不存在,则会创建一个 PENDING 状态的账户。
来源: api/services/account_service.py:1071-1235, api/controllers/console/workspace/members.py:99-168
邀请令牌存储在 Redis 中,有效期为 72 小时。api/services/account_service.py:1071-1075
账户激活
激活令牌校验
激活流程采用两步验证过程:
- 令牌检查(
GET /activate/check):通过RegisterService.get_invitation_with_case_fallback()校验令牌。为了向后兼容,该方法支持不区分大小写的邮箱匹配。api/controllers/console/auth/activate.py:46-88 - 账户激活(
POST /activate):校验令牌,将Account状态更新为ACTIVE,设置initialized_at,并配置用户偏好设置,如interface_language和timezone。api/controllers/console/auth/activate.py:90-127
不区分大小写的邮箱处理
Dify 通过将输入统一转换为小写,同时使用原始字符串和规范化字符串搜索现有记录,从而保持与大小写不同账户的兼容性。
来源: api/services/account_service.py:780-792
密码管理
密码重置流程
密码重置采用两阶段令牌系统,以防止重放攻击并确保一次性授权。
来源: api/controllers/console/auth/forgot_password.py:60-193, api/services/account_service.py:473-505
两阶段令牌系统
| 阶段 | 令牌数据 | 目的 | 有效操作 |
|---|---|---|---|
| 验证 | {email, code} | 验证邮箱所有权 | validity 检查 |
| 重置 | {email, code, phase: "reset"} | 授权密码更改 | resets 更新 |
来源: api/controllers/console/auth/forgot_password.py:139-144, api/controllers/console/auth/forgot_password.py:168-173
令牌管理
访问令牌(JWT)
由 AccountService.get_account_jwt_token() 生成,访问令牌是由 PassportService 签名的 JWT。api/services/account_service.py:182-194
刷新令牌生命周期
刷新令牌是存储在 Redis 中的随机字符串,用于支持令牌撤销和会话管理。
来源: api/services/account_service.py:426-467, api/services/account_service.py:141-160
账户删除
异步删除过程
账户删除是一个软删除过程,通过 Celery 异步处理。
- 验证:用户必须提供发送到其邮箱的验证码。
api/controllers/console/workspace/account.py:401-432 - 企业同步:如果启用,
sync_account_deletion()会通知关联的工作空间。api/services/account_service.py:312-343 - 任务执行:
delete_account_task将账户状态设置为CLOSED,并在适用时启动 30 天的计费冻结期。api/tasks/delete_account_task.py:14-43
来源: api/services/account_service.py:345-358, api/tasks/delete_account_task.py:14-43
速率限制与安全
Dify 使用多个 RateLimiter 实例来保护敏感流程。
| 限流器名称 | 最大尝试次数 | 时间窗口 | 键前缀 |
|---|---|---|---|
reset_password_rate_limiter | 1 | 60s | reset_password_rate_limit |
email_register_rate_limiter | 1 | 60s | email_register_rate_limit |
email_code_login_rate_limiter | 3 | 300s | email_code_login_rate_limit |
change_email_rate_limiter | 1 | 60s | change_email_rate_limit |
来源: api/services/account_service.py:124-133, api/libs/helper.py:246-281
RateLimiter 类使用 Redis 的 setex 命令在指定时间窗口内跟踪尝试次数。api/libs/helper.py:270-281