启用、停用和使用密码政策

本文档介绍了如何使用密码政策来提高新用户和现有用户的密码强度。

概览

借助密码政策,您可以强制实施密码复杂度要求,从而提高账号安全性。密码政策支持以下密码要求:

  • 必须包含小写字符
  • 必须包含大写字符
  • 必须包含数字字符
  • 必须包含非字母数字字符
  • 最小密码长度(介于 6 到 30 个字符之间;默认为 6)
  • 最大密码长度(上限为 4096 个字符)

以下字符(如果已配置)符合非字母数字字符要求:

^ $ * . [ ] { } ( ) ? " ! @ # % & / \ , > < ' : ; | _ ~ `

准备工作

强制执行模式

您可以通过两种模式启用密码政策强制执行:

  • 要求:除非用户将密码更新为符合您的政策的密码,否则尝试注册会失败。
  • 通知:允许用户使用不符合要求的密码登录。系统会返回所有未达标的条件(达标后才能满足政策要求)。返回的条件包括:

    • MISSING_LOWERCASE_CHARACTER
    • MISSING_UPPERCASE_CHARACTER
    • MISSING_NUMERIC_CHARACTER
    • MISSING_NON_ALPHANUMERIC_CHARACTER
    • MINIMUM_PASSWORD_LENGTH
    • MAXIMUM_PASSWORD_LENGTH

    您可以将此信息发送给用户,告知他们更新密码。以下示例显示了包含缺少密码条件的响应:

    {
      "kind": "identitytoolkit#VerifyPasswordResponse",
      "localId": "CJL1i2",
      "email": "cloudysanfrancisco@gmail.com",
      "displayName": "",
      "idToken": "ID_TOKEN",
      "registered": true,
      "userNotifications": [
        {
          "notificationCode": "MISSING_NUMERIC_CHARACTER",
          "notificationMessage": "Password must contain a numeric character"
        },
        {
          "notificationCode": "MISSING_NON_ALPHANUMERIC_CHARACTER",
          "notificationMessage": "Password must contain a non-alphanumeric character"
        }
      ]
    }
    

新用户必须选择符合您政策的密码。如果您有活跃用户,我们建议您不要启用“登录时强制升级”,除非您打算立即强制执行密码政策。请改用通知模式,让用户使用当前密码登录,并发送通知,详细说明其密码不符合哪些要求。

启用强制执行后,将 forceUpgradeOnSignin 设置为 true 即可在“必需”模式下启用强制执行。将其设置为 false 可在通知模式下启用强制执行。

启用强制执行

如需强制执行密码政策,请执行以下操作:

  1. 如果您尚未配置电子邮件和密码登录,请执行此操作。
  2. 如需在项目级强制执行密码政策,请运行以下命令:

    import { getAuth } from 'firebase-admin/auth';
    
    // Update project config with password policy config
    getAuth().projectConfigManager().updateProjectConfig({
      passwordPolicyConfig: {
        enforcementState: 'ENFORCE',
        forceUpgradeOnSignin: true,
        constraints: {
          requireUppercase: true,
          requireLowercase: true,
          requireNonAlphanumeric: true,
          requireNumeric: true,
          minLength: MIN_PASSWORD_LENGTH,
          maxLength: MAX_PASSWORD_LENGTH,
        },
      },
    })
    

    替换以下内容:

    • MIN_PASSWORD_LENGTH:所需的最小密码长度
    • MAX_PASSWORD_LENGTH:所需的最大密码长度
  3. 如需在租户级强制执行密码政策,请运行以下命令:

    import { getAuth } from 'firebase-admin/auth';
    
    // Update project config with password policy config
    getAuth().tenantManager().createTenant({
      displayName: "admin-tenant",
      passwordPolicyConfig: {
        enforcementState: 'ENFORCE',
        forceUpgradeOnSignin: true,
        constraints: {
          requireUppercase: true,
          requireLowercase: true,
          requireNonAlphanumeric: true,
          requireNumeric: true,
          minLength: MIN_PASSWORD_LENGTH,
          maxLength: MAX_PASSWORD_LENGTH,
        },
      },
    })
    

停用强制执行

  1. 如需在项目级停用密码政策强制执行,请运行以下命令:

    import { getAuth } from 'firebase-admin/auth';
    
    // Update project config with password policy config
    getAuth().projectConfigManager().updateProjectConfig({
      passwordPolicyConfig: {
        enforcementState: 'OFF',
      },
    })
    
  2. 如需在租户级别停用密码政策强制执行,请运行以下命令:

    import { getAuth } from 'firebase-admin/auth';
    
    // Update tenant config with password policy config
    getAuth().tenantManager().updateTenant(TENANT-ID, {
      passwordPolicyConfig: {
        enforcementState: 'OFF',
      },
    })
    

    TENANT-ID 替换为您要为其停用密码政策的租户 ID。

在客户端强制执行

您可以在提交前在客户端根据项目或租户的密码政策对密码进行验证。

import { getAuth, validatePassword } from 'firebase/auth';

const auth = getAuth();
auth.tenantId = TENANT-ID;

const status = await validatePassword(auth, 'password').catch((error) => {
  // Password could not be validated.
});
const policy = status.passwordPolicy;

// Use the status and policy to show what requirements are met and which are missing.