介绍

Authentication(认证)

AdonisJS 提供了一个强大且安全的认证系统,你可以使用它来登录并验证你的应用程序的用户。无论是服务器端渲染的应用程序、SPA 客户端还是移动应用,你都可以为它们设置认证。

认证包是围绕 guards(守卫)providers(提供者) 构建的。

  • Guards 是特定登录类型的端到端实现。例如,session 守卫允许你使用 cookie 和会话来验证用户身份。同时,access_tokens 守卫将允许你使用令牌来验证客户端。

  • Providers 用于从数据库中查找用户和令牌。你可以使用内置的提供者,也可以实现自己的提供者。

为了确保你应用程序的安全性,我们会对用户密码和令牌进行适当的哈希处理。而且,AdonisJS 的安全机制具有防护能力,可以防止 时序攻击会话固定攻击

Auth 包不支持的功能

auth 包专注于对 HTTP 请求进行认证,以下功能不在其范围内:

  • 用户注册功能,如 注册表单电子邮件验证帐户激活
  • 帐户管理功能,如 密码恢复电子邮件更新
  • 对于角色的分配或权限的验证,应该在你的应用程序中用 bouncer 来进行授权验证。

选择认证守卫

以下内置认证守卫为你提供了最直接的工作流程,用于在不牺牲应用程序安全性的情况下对用户进行身份验证。另外,您也可以根据自己的需求定制认证守卫

Session(会话)

会话守卫使用 @adonisjs/session 包来跟踪会话存储中已登录用户的状态。

会话和 cookie 在互联网上已经存在很长时间,并且适用于大多数应用程序。我们建议使用会话守卫:

  • 如果你正在创建一个服务器端渲染的 Web 应用程序。
  • 也可以是一个 AdonisJS API,其客户端位于同一个顶级域名下。例如,api.example.comexample.com

Access tokens(访问令牌)

访问令牌是登录成功后颁发给用户的加密安全随机令牌(也称为不透明访问令牌)。你可以在 AdonisJS 服务器无法写入/读取 cookie 的应用程序中使用访问令牌。例如:

  • 一个原生移动应用。
  • 一个托管在与 AdonisJS API 服务器不同域名的 Web 应用程序。

当使用访问令牌时,客户端应用程序需要确保安全地存储它们。访问令牌代表用户提供对应用程序的无限制访问,若泄露则可能造成安全隐患。

Basic auth(基本认证)

基本认证守卫是 HTTP 身份验证框架 的一种实现,其中客户端必须通过 Authorization 头传递以 base64 编码的字符串形式的用户凭据。

有比基本认证更好的方法来实现安全的登录系统。然而,在应用程序开发活跃期时,你可以暂时使用它。

选择用户提供者

如本指南前面所述,用户提供者在认证过程中负责查找用户。

不同的守卫有各自的用户提供者;例如,会话守卫的用户提供者负责通过用户 ID 查找用户,而访问令牌守卫的用户提供者则负责验证访问令牌。

我们为内置守卫提供了一个 Lucid 用户提供者,它使用 Lucid 模型来查找用户、生成令牌和验证令牌。

安装

认证系统预配置在 webapi 启动套件中。然而,你可以按照以下步骤在应用程序中手动安装和配置它。

# 使用会话守卫(默认)进行配置
node ace add @adonisjs/auth --guard=session
# 使用访问令牌守卫进行配置
node ace add @adonisjs/auth --guard=access_tokens
# 使用基本认证守卫进行配置
node ace add @adonisjs/auth --guard=basic_auth
  1. 使用检测到的包管理器安装 @adonisjs/auth 包。

  2. adonisrc.ts 文件中注册以下服务提供者。

    {
    providers: [
    // ...其他提供者
    () => import('@adonisjs/auth/auth_provider')
    ]
    }
  3. start/kernel.ts 文件中创建并注册以下中间件。

    router.use([
    () => import('@adonisjs/auth/initialize_auth_middleware')
    ])
    router.named({
    auth: () => import('#middleware/auth_middleware'),
    // 仅在使用 session 守卫时使用
    guest: () => import('#middleware/guest_middleware')
    })
  4. app/models 目录中创建用户模型。

  5. users 表创建数据库迁移。

  6. 为所选守卫创建数据库迁移。

初始化认证中间件

在设置过程中,我们会在你的应用程序中注册 @adonisjs/auth/initialize_auth_middleware。该中间件负责创建 Authenticator 类的实例,并通过 ctx.auth 属性与请求的其余部分共享它。

请注意,初始化认证中间件不会对请求进行认证或保护路由。它仅用于初始化认证器并与请求的其余部分共享。你必须使用 auth 中间件来保护路由。

此外,如果你的应用程序使用 Edge,则相同的认证器实例会与 Edge 模板共享,你可以使用 auth 属性访问它。例如:

@if(auth.isAuthenticated)
<p> Hello {{ auth.user.email }} </p>
@end

创建 users 表

configure 命令会在 database/migrations 目录中为 users 表创建一个数据库迁移。你可以随意打开此文件并根据应用程序需求进行修改。

默认情况下,会创建以下的字段:

import { BaseSchema } from '@adonisjs/lucid/schema'
export default class extends BaseSchema {
protected tableName = 'users'
async up() {
this.schema.createTable(this.tableName, (table) => {
table.increments('id').notNullable()
table.string('full_name').nullable()
table.string('email', 254).notNullable().unique()
table.string('password').notNullable()
table.timestamp('created_at').notNullable()
table.timestamp('updated_at').nullable()
})
}
async down() {
this.schema.dropTable(this.tableName)
}
}

此外,如果你在 users 表中定义、重命名或删除列,请更新 User 模型。

后续步骤