密码策略
Logto 会根据密码的创建或更新方式以不同方式应用密码策略:
- 终端用户流程,如开箱即用的登录体验、体验 API 和 Account API 总是强制执行当前的密码策略。
- 管理员通过 Management API
patch /api/users/{userId}/password的操作不受限制,允许你在需要时无需策略检查即可预配或重置凭据。 - 若要根据当前规则审计现有密码,请调用
POST /api/sign-in-exp/default/check-password并根据返回的验证结果采取行动。阅读密码合规性检查了解更多信息。
设置密码策略
对于新用户或正在更新密码的用户,你可以设置密码策略以强制执行密码强度要求。访问 控制台 > 安全 > 密码策略 配置密码策略设置。
- 最小密码长度:设置密码所需的最小字符数。(NIST 建议至少使用 8 个字符)
- 最少所需字符类型数:设置密码所需的最少字符类型数。可用的字符类型有:
- 大写字母:
(A-Z) - 小写字母:
(a-z) - 数字:
(0-9) - 特殊字符:
(!"#$%&'()\*+,-./:;<>=?@[]^\_`|{}~ )
- 大写字母:
- 泄露历史检查:启用此设置可拒绝在数据泄露中已暴露过的密码。(由 Have I Been Pwned 提供支持)
- 重复字符检查:启用此设置可拒绝包含重复字符的密码。(例如,“11111111”或“password123”)
- 用户信息检查:启用此设置可拒绝包含用户名、邮箱地址或手机号等用户信息的密码。
- 自定义词汇:提供你希望在密码中拒绝的自定义词汇列表(不区分大小写)。
密码过期
密码过期要求用户在设定的天数后重置密码。你也可以手动让某个用户的密码过期,例如当你知道其已被泄露时。
该策略仅在用户通过密码登录并输入正确密码后才会检查。通过验证码、社交登录、SSO 或密钥登录的用户不受影响。
启用密码过期
前往 控制台 > 安全 > 密码策略,找到 密码过期 卡片:
- 打开 启用密码过期。
- 设置 密码有效期(天),范围为 1 到 9999 天。
- 保存更改。
在登录体验至少有一种忘记密码方式(邮箱或手机)且有可用连接器之前,开关保持禁用状态,因为用户只能通过该流程重置过期密码。出于同样原因,启用策略后,你无法删除支持忘记密码的最后一个邮箱或短信连接器。如果你的注册流程不要求邮箱地址或手机号,部分用户可能无法收到重置码,因此建议在注册时收集其中之一。
Logto 会记录用户密码的最后设置或更改时间。当该密码达到有效期时,用户下次通过密码登录会被阻止,直到他们重置密码。没有记录密码更改日期的用户,从你启用策略的时间开始计算,因此启用策略不会让所有用户的密码同时过期。关闭再重新开启策略会重置起始时间。
当用户通过忘记密码、Account API 或 Management API 设置新密码时,密码年龄会重置,任何手动过期状态也会被清除。
手动让用户密码过期
启用密码过期策略后,你可以强制某个用户在下次登录时重置密码:
-
控制台:前往 控制台 > 用户管理,打开用户详情页,点击用户密码旁的 过期 按钮,然后确认操作。仅当用户有密码时按钮可用。
-
Management API:调用
PATCH /api/users/{userId}/password/expiration并传递如下内容:{"isExpired": true}
如果策略未启用,API 会返回 400,错误码为 sign_in_experiences.password_expiration_not_enabled,控制台中的 过期 按钮也会被禁用。
常见场景是密码已知被泄露。让其过期后,用户需通过验证码证明其拥有邮箱或手机号,才能设置新密码并重新登录。如果你只想手动让密码过期,而不想强制所有用户定期轮换密码,可以将有效期设置为较长时间,例如 3650 天。
让密码过期不会使用户现有会话退出。若需立即切断访问,还需撤销用户的活跃会话和已授权的第三方应用。
终端用户看到的内容
当用户使用过期密码登录时,在输入正确密码后,登录页面会弹出提示:“你的密码已过期,必须重置后才能登录。”点击 重置密码 会将用户带到忘记密码流程,并自动填充其标识符。用户通过邮箱或手机收到验证码并设置新密码后,即可重新登录。
如果你使用 体验 API 自定义登录界面,密码验证请求会以错误码 password.expired(HTTP 422)失败。你需要处理该错误,将用户引导至密码重置流程。
密码合规性检查
在你更新 Logto 中的密码策略后,现有用户仍可使用当前密码登录。只有新创建的账户才会被要求遵循更新后的策略。
为提升安全性,你可以使用 POST /api/sign-in-exp/default/check-password API 检查用户密码是否符合默认登录体验下定义的当前策略。如果不符合,你可以通过自定义流程和 Account API 提示用户更新密码。