认证概述

认证是任何应用程序的关键部分。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 会自动注入 hashsaltemail 字段。更多详情

以下是可用的配置选项:

选项描述
cookies设置 cookie 选项,包括 securesameSitedomain。适用于高级用户。
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) 也可用于执行认证。令牌在 loginrefreshme 操作时生成,可以附加到后续请求中以认证用户。更多详情

API Keys

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

自定义策略

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