认证概述

认证是任何应用程序的关键部分。Payload 提供了一种安全、可移植的开箱即用用户账户管理方案。Payload 认证设计用于管理面板和你自己的外部应用程序,完全消除了对付费第三方平台和服务的需求。

以下是你自己应用程序中认证的一些常见用例:

  • 电商应用的客户账户
  • SaaS产品的用户账户
  • 需要用户登录和管理个人资料的P2P应用或社交网站
  • 需要玩家长期追踪进度的在线游戏

当在Collection上启用认证时,Payload会注入支持完整用户流程所需的所有功能。这包括所有认证相关操作如账户创建、登录登出和密码重置,所有认证相关邮件如邮箱验证和密码重置邮件,以及从管理面板管理用户所需的任何UI。

要在Collection上启用认证,使用Collection配置中的auth属性:

import type { CollectionConfig } from 'payload'

export const Users: CollectionConfig = {
  // ...
  auth: true, // highlight-line
}

认证管理面板功能 启用认证的管理员Collection的管理面板截图

配置选项

任何 Collection 都可以选择启用认证功能。启用后,该 Collection 中创建的每个文档都可以视为一个"用户"。这将为你的 Collection 启用完整的认证流程,包括登录、登出、重置密码等功能。

注意: Payload 默认提供了一个启用认证的 User Collection,用于访问管理后台。更多详情。

要在 Collection 中启用认证功能,请在 Collection Config 中使用 auth 属性:

import type { CollectionConfig } from 'payload'

export const Admins: CollectionConfig = {
  // ...
  // highlight-start
  auth: {
    tokenExpiration: 7200, // 用户保持登录状态的秒数
    verify: true, // 在允许认证前要求邮箱验证
    maxLoginAttempts: 5, // 登录失败X次后自动锁定用户
    lockTime: 600 * 1000, // 允许最大登录尝试次数的时间段
    // 更多选项可用
  },
  // highlight-end
}

提示: 对于默认认证行为,可设置 auth: true。这是大多数应用的理想起点。

注意: 启用认证的 Collection 会自动注入 hash、salt 和 email 字段。更多详情。

以下是可用的配置选项:

选项描述
cookies设置 cookie 选项,包括 secure、sameSite 和 domain。适用于高级用户。
depth创建 JWT 并将 user 绑定到 req 时,user 文档应填充的深度级别。默认为 0,除非绝对必要,否则不应修改,因为这会影响性能。
disableLocalStrategy高级选项 - 禁用 Payload 内置的本地认证策略。仅在你已用自定义认证机制替换 Payload 的认证机制时使用此属性。
forgotPassword自定义 forgotPassword 操作的功能方式。更多详情。
lockTime设置用户因超过 maxLoginAttempts 限制而被锁定的时间(毫秒)。
loginWithUsername允许用户使用用户名/密码登录的功能。更多详情
maxLoginAttempts限制用户登录尝试次数。超过此限制将自动锁定用户认证。设置为 0 可禁用此功能。
removeTokenFromResponses设置为 true 可从登录或刷新等认证 API 响应中移除 token。
strategies高级选项 - 自定义认证策略数组,用于扩展此 Collection 的认证功能。更多详情。
tokenExpiration用户保持登录状态的时间(秒)。JWT 和 HTTP-only cookie 将同时过期。
useAPIKeyPayload 认证支持在每个启用认证的 Collection 用户上设置 API 密钥。更多详情。
verify设置为 true 或传递带有验证选项的对象,要求用户在登录应用前通过邮箱验证。更多详情。

使用用户名登录

你可以通过将 loginWithUsername 属性设置为 true,允许用户使用用户名而非电子邮件地址登录。

示例:

{
  slug: 'customers',
  auth: {
    loginWithUsername: true,
  },
}

或者,你也可以传入一个包含额外选项的对象:

{
  slug: 'customers',
  auth: {
    loginWithUsername: {
      allowEmailLogin: true, // 默认值: false
      requireEmail: false, // 默认值: false
    },
  },
}

allowEmailLogin

如果设置为 true,用户可以使用用户名或电子邮件地址登录。如果设置为 false,用户只能使用用户名登录。

requireEmail

如果设置为 true,创建新用户时需要提供电子邮件地址。如果设置为 false,创建时不需要电子邮件。

自动登录

出于测试和演示目的,你可能希望跳过强制用户登录才能访问应用的步骤。通常情况下,所有用户都应被要求登录,但你可以通过启用自动登录来加快本地开发速度。

要启用自动登录,请在 Payload 配置 中设置 autoLogin 属性:

import { buildConfig } from 'payload'

export default buildConfig({
  // ...
  // highlight-start
  admin: {
    autoLogin:
      process.env.NODE_ENV === 'development'
        ? {
            email: 'test@example.com',
            password: 'test',
            prefillOnly: true,
          }
        : false,
  },

  // highlight-end
})

警告: 推荐的使用方式是通过 环境变量 来控制此功能。这将确保它在生产环境中被禁用。

以下是可用的选项:

选项描述
username要自动登录的用户名
email要自动登录的邮箱地址
password要自动登录的密码。仅在 prefillOnly 设为 true 时需要
prefillOnly如果设为 true,登录凭证将被预填充,但用户仍需点击登录按钮

操作

所有与认证相关的操作都可以通过 Payload 的 REST、Local 和 GraphQL API 进行。当你启用 Authentication 时,这些操作会自动添加到你的 Collection 中。更多详情。

策略

Payload 开箱即用提供了三种强大的认证策略:

这些策略可以协同工作或独立使用。你也可以创建自定义策略以满足特定需求。更多详情。

HTTP-Only Cookies

HTTP-only cookies 是一种高度安全的方法,用于在用户设备上存储可识别数据,使 Payload 能够自动识别返回用户,直到 cookie 过期。与 JWT 不同,它们完全受到保护,不受常见 XSS 攻击的影响,且无法通过浏览器中的 JavaScript 读取。更多详情。

JSON Web Tokens

JWT (JSON Web Tokens) 也可用于执行认证。令牌在 login、refresh 和 me 操作时生成,可以附加到后续请求中以认证用户。更多详情。

API Keys

可以在认证集合上启用 API Keys。当你需要从第三方服务对 Payload 进行认证时,这些特别有用。更多详情。

自定义策略

在某些情况下,这些可能不足以满足你的应用需求。Payload 设计上具有可扩展性,因此你可以在需要时连接自己的策略。更多详情。