JWT 身份验证
Drupal API Authentication 模块通过在 API 请求中发送 JWT 令牌来进行身份验证。该模块使用 JSON Web Token (JWT),这是一种在双方交互中安全表示用户身份的开放标准。
在此步骤中,本质上会使用您的 Drupal 网站的用户名和密码来获取一个 JWT 令牌。一旦用户名和密码验证成功,Drupal REST API Authentication 模块将创建一个已签名的 JSON Web Token。然后,API 会将该令牌返回给客户端应用程序。
一旦您收到 JWT 令牌,就可以使用该令牌在 Drupal 中执行操作,直到 JWT 令牌过期。Drupal REST API Authentication 模块仅在接收到来自应用程序的有效 JWT 时才会授予访问权限。
JWT 可以使用两种算法进行签名和验证 —— HSA 和 RSA。
让我们看看如何在 Drupal 中使用 JWT 令牌进行 API 身份验证。
设置视频:
前提条件:下载与安装:
- 下载并安装 Drupal REST & JSON API Authentication 模块。
- REST UI:该模块为配置 REST 模块提供用户界面。
- 在 Drupal 网站的 Extend 部分 (/admin/modules) 启用以下 Web Services 模块:
- REST UI
- RESTful Web Services
- Serialization
配置基于 JWT 的 API 身份验证的步骤:
- 为了更好理解,我们将举例说明如何为 Drupal 中的 /node API 添加 JWT 身份验证以创建一个基本页面。
启用 API 并分配如下方法和操作:
- 第一步是启用 API,并分配该 API 上允许的方法和操作。这可以通过 REST UI 模块完成,或者您也可以直接修改配置。
- 要使用 REST UI 模块启用 API,请点击 REST UI 模块的 Configure 按钮(如下所示)。
- 在我们的例子中,我们要启用内容部分下的 /node API。通过前方的启用选项来启用该 API。
- 由于我们的目标是在 Drupal 中创建一个基本页面,请选择以下配置:
- 方法:POST
- 格式:json
- 身份验证提供者:rest_api_authentication
- 选择 rest_api_authentication 将允许 miniOrange REST API Authentication 模块验证您的 API。点击 Save Configuration 按钮继续。
设置基于 JWT 的 API 身份验证:
-
在此步骤中,我们将设置 JWT 作为 API 身份验证方法。为此,请导航到 REST API Authentication 模块的 API Authentication 选项卡 (/admin/config/people/rest_api_authentication/auth_settings)
- 选中 Enable Authentication 复选框并点击保存设置。
- 在保存设置按钮下方选择 JWT 单选按钮。
-
如果您希望使用外部创建的 JWT 令牌进行身份验证,可以通过配置以下选项来实现:
- 在 Username Attribute 文本框中,输入接收用户名的属性名称。
- 如果您希望使用外部 JWT 令牌,也可以提供 JWKS URI 以便在 Drupal 中验证该 JWT 令牌。
授予 Drupal 角色创建页面的权限:
-
如果需要,您还可以授予非管理员 Drupal 角色创建基本页面的权限。您可以在 Drupal 网站的权限部分 (/admin/people/permissions) 中为 Drupal 角色分配 Basic page: Create new content 权限。
就是这样!!!
现在让我们尝试通过使用 JWT 进行身份验证的 API 调用来创建一个基本页面。
示例:
-
首先,我们需要进行一个 API 调用以获取 JWT。然后我们将使用该令牌来验证 Drupal API,以创建一个基本页面。
-
我们可以通过发出一个包含用户 Drupal 用户名和密码的 POST 请求来获取 JWT。您必须以 base64 编码格式发送用户名和密码。您可以参考以下请求格式。
请求:POST <your_drupal_base_url>/rest_api/id_token
请求头: Authorization: Basic base64encoded <username:password;>
Accept: application/jsonCURL 请求格式:
curl --location --request POST '<your_drupal_base_url>/rest_api/id_token' \
--header 'Accept: application/json' \
--header 'Content-Type: application/json' \
--header 'Authorization: Basic base64encoded <username:password>'
-
您还可以参考 Postman 请求的图片来从 Drupal 获取 JWT。
请求:
-
成功的响应会返回 JWT 以及其过期时间。(请参考下图)
-
如果您收到任何错误响应,可以参考下表中的错误描述和可能的解决方案。
错误 | 描述 |
INVALID_CREDENTIALS |
当用户名或密码错误时,您将收到此错误。 示例: { "status": "error", "error": "INVALID_CREDENTIALS", "error_description": "Invalid username or password." } |
使用接收的 JWT 验证 Drupal REST API:
- 要使用 JWT 进行身份验证,只需将接收到的 JWT 作为 Bearer 令牌添加到 Authorization 请求头中。
请求: POST <drupal_base_url>/node?_format=json
请求头: Authorization: Bearer received_JWT
Accept: application/json
请求体:
{
"type":[{"target_id":"page"}],
"title":[{"value":"Drupal Rest API Authentication"}],
"body":[{"value":"Page created using the JWT Authentication."}]
}CURL 请求格式:
curl --location --request POST '<drupal_base_url>/node?_format=json' \ --header 'Accept: application/json' \ --header 'Content-Type: application/json' \ --header 'Authorization: Bearer <received_JWT>' \ --data-raw '{ "type":[{"target_id":"page"}], "title":[{"value":"Drupal Rest API Authentication"}], "body":[{"value":"Page created using the JWT Authentication."}] }'
使用基于 JWT 身份验证创建页面的示例请求:
- 您还可以参考 Postman 请求:
- 成功的响应类似于:
- 您可以在 Drupal 的内容选项卡中检查已创建的页面。
-
错误响应与可能的解决方案:
错误 | 描述 |
MISSING_AUTHORIZATION_HEADER |
当您未在 API 请求中发送 Authorization 请求头,或由于某些原因服务器移除了该请求头时,您将收到此错误。 { "status": "error", "error":"MISSING_AUTHORIZATION_HEADER", "error_description": "Authorization header not received." } |
INVALID_AUTHORIZATION_HEADER_TOKEN_TYPE |
当您发送了 Authorization 请求头但令牌类型不是 Bearer 时,您将收到此错误。 { "status": "error", "error": "INVALID_AUTHORIZATION_HEADER_TOKEN_TYPE", "error_description": "Authorization header must be the type of Bearer Token." } |
TOKEN_EXPIRED |
当您发送了 Authorization 请求头但访问令牌已过期时,您将收到此错误。 { "status": "error", "error": "TOKEN_EXPIRED", "message": "Invalid request: Token Expired." } |
USER_INFORMATION_NOT_FOUND |
当尝试检索用户信息时,您将收到此错误。 { "status": "error", "error": "USER_INFORMATION_NOT_FOUND", "message": "Could Not Retrieve User Information." } |
INVALID_SIGNATURE |
当令牌签名无效时,您将收到此错误。 { "status": "error", "error": "INVALID_SIGNATURE", "message": "Invalid Token signature." } |
文章来自 Drupal 文档。