Drupal 8/9:为RESTful API定制身份验证提供程序 - Medium
Drupal 8/9:为RESTful API定制身份验证提供程序
在Drupal 8中,RESTful Web Services 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资源:
- 编辑已启用的REST资源。
- 在身份验证提供程序列表中选择新添加的
rest_auth。 - 保存配置。
通过这种方式,您可以为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