Drupal 8/9:为RESTful API定制身份验证提供程序 - Medium

作者:API传播员 · 2025-11-01 · 阅读时间:4分钟
本文详细介绍了在Drupal 8/9中为RESTful API实现自定义身份验证提供程序的步骤,包括定义REST端点、配置服务、创建RestAuth类实现AuthenticationProviderInterface接口,以及通过rest_ui模块附加身份验证器。示例用例验证特定HTTP头值,增强API安全性,并支持JWT令牌和Webhook等灵活身份验证逻辑。

Drupal 8/9:为RESTful API定制身份验证提供程序

在Drupal 8中,RESTful Web Services API是一个全新的功能。通过它,我们可以为每个资源指定支持的HTTP谓词(如GET、POST、PUT等),定义响应格式,并配置身份验证插件。在本文中,我们将探讨如何为REST API实现自定义身份验证提供程序(AuthenticatorProvider),以验证传入的请求。本文的示例用例是验证所有包含特定header=value对的REST调用。


实现自定义身份验证提供程序

以下是实现自定义身份验证提供程序的步骤:

定义REST API端点

假设我们有一个REST端点,它返回系统中所有车辆的列表,格式为JSON:

GET /vehicles : 获取所有车辆的列表

为了成功调用该API,客户端必须在请求中包含以下HTTP头信息:

x-API-key=app-key

我们的身份验证提供程序将拦截传入的请求,检查是否包含上述头信息及其值。如果头信息不存在或值不匹配,将返回错误响应。


配置服务

在模块中创建一个名为rest_auth.services.yml的文件,并通过以下配置注册身份验证类:

services:
  rest_auth.authentication:
    class: Drupalrest_authAuthenticationRestAuth
    tags:
      - { name: authentication_provider, provider_id: 'rest_auth', priority: 10 }
  • class:指定身份验证类的路径。
  • tags:将服务标记为authentication_provider,以便Drupal核心能够识别并调用该类进行身份验证。
  • priority:定义调用顺序,数值越大,优先级越高。

创建RestAuth类

接下来,我们需要创建一个名为RestAuth的类,并实现Drupal核心提供的AuthenticationProviderInterface接口。该接口包含两个关键方法需要实现。

方法1:applies

applies方法用于判断当前的身份验证提供程序是否适用于传入的请求。以下是方法的实现:

public function applies(Request $request): bool {
    // 检查请求是否包含特定的HTTP头信息
    return $request->headers->has('x-API-key');
}

如果请求头中包含x-API-key,则返回true,否则返回false。当返回false时,客户端将收到HTTP 403 Forbidden错误。

方法2:authenticate

authenticate方法用于验证请求并返回一个有效的用户对象。以下是方法的实现:

public function authenticate(Request $request): AccountInterface {
    // 从请求头中提取用户信息
    $apiKey = $request->headers->get('x-API-key');

    // 使用JWT解码用户信息
    $userInfo = JWT::decode($apiKey, $secretKey, ['HS256']);

    // 验证用户信息并返回用户对象
    $user = $this->loadUserByEmail($userInfo->email);
    if (!$user) {
        throw new AuthenticationException('无效的用户信息');
    }

    return $user;
}
  • 从请求头中提取x-API-key
  • 使用JWT解码工具解析用户信息。
  • 验证用户信息是否有效,并返回对应的用户对象。如果验证失败,则抛出异常。

将身份验证器附加到REST路由

如果已安装rest_ui模块,可以通过以下步骤将自定义身份验证器附加到REST资源:

  1. 编辑已启用的REST资源。
  2. 在身份验证提供程序列表中选择新添加的rest_auth
  3. 保存配置。

通过这种方式,您可以为REST API端点启用自定义身份验证器。


其他用例

自定义身份验证提供程序的应用场景非常广泛,例如:

  • 验证JWT令牌。
  • 授权第三方应用程序通过Webhook调用发布数据。
  • 基于HTTP头中其他指令进行验证。

通过灵活的配置,您可以根据实际需求实现多种身份验证逻辑。


通过本文的介绍,您已经了解了如何在Drupal 8/9中为RESTful API定制身份验证提供程序。通过这种方式,您可以增强API的安全性,并根据具体需求实现灵活的身份验证机制。

原文链接: https://medium.com/@vishwa.chikate/drupal-8-9-custom-authentication-provider-for-restful-apis-e3ded58d7e2a