JWT認証
Drupal API Authenticationモジュールは、認証のためにAPIリクエストとともにJWTトークンを送信することで機能します。このモジュールは、二者間のやり取り中にユーザーIDを安全に表現するためのオープンスタンダードであるJSON Web Token(JWT)を使用します。
このステップでは、基本的に、Drupalサイトのユーザー名とパスワードを使用して最初にJWTトークンを取得します。ユーザー名とパスワードが検証されると、Drupal REST API Authenticationモジュールが署名付きのJSON Web Tokenを作成します。次に、APIはそのトークンをクライアントアプリケーションに返します。
JWTトークンを受け取ったら、JWTトークンの有効期限が切れるまで、このトークンを使用してDrupalで操作を実行できます。Drupal REST API Authenticationモジュールは、アプリケーションから有効なJWTを受け取った場合のみアクセスを許可します。
JWTは、HSAとRSAという2つのアルゴリズムを使用して署名・検証できます。
DrupalのAPI認証でJWTトークンを使用する方法を見てみましょう。
セットアップ動画:
前提条件:ダウンロードとインストール:
- Drupal REST & JSON API Authentication モジュールをダウンロードしてインストールします。
- REST UI:このモジュールは、RESTモジュールを設定するためのユーザーインターフェースを提供します。
- DrupalサイトのExtendセクション(/admin/modules)から以下のWebサービスモジュールを有効にします:
- REST UI
- RESTful Web Services
- Serialization

JWTベースのAPI認証を設定する手順:
- 理解を深めるため、 /node APIを使用してDrupalで基本ページを作成することにJWTベースの認証を追加する例を見ていきます。
APIを有効にして、メソッドと操作を次のように割り当てます:
- 最初のステップは、APIを有効にし、その特定のAPIで許可されるメソッドと操作を割り当てることです。これはREST UIモジュールを使用して行うか、設定を直接変更することで行えます。
- REST UI モジュールを使用してAPIを有効にするには、REST UIモジュールの Configure ボタンをクリックします(下図参照)

- この例では、コンテンツセクションにある /node APIを有効にする必要があります。その前にあるEnableオプションを使用してこの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 チェックボックスを選択し、Save Settingsをクリックします。
- Save Settingsボタンの下で JWT ラジオボタンを選択します。
-
認証に外部で作成したJWTトークンを使用したい場合は、以下のオプションを設定することで実現できます:
- Username Attribute テキストフィールドに、ユーザー名を受け取る属性名を入力します。
- 外部JWTトークンを使用したい場合は、DrupalでそのJWTトークンを検証するためのJWKS URIを指定することもできます。

Drupalロールにページを作成する権限を付与します:
-
必要であれば、非管理者のDrupalロールにも基本ページを作成する権限を付与できます。Drupalサイトの権限セクション(/admin/people/permissions)にある Basic page: Create new content 権限にDrupalロールを割り当てることで実現できます。

これで完了です!!!
それでは、認証にJWTを使用して、API呼び出しを通じて基本ページを作成してみましょう。
例:
-
まず、JWTを取得するためのAPI呼び出しを行う必要があります。次に、そのトークンを使用して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>'
-
DrupalからJWTを取得するためのPostmanリクエストの画像も参照できます。
リクエスト:

-
成功すると、トークンの有効期限とともにJWTが返されます。(下の画像を参照)

-
レスポンスでエラーが発生した場合は、以下の表を参照してエラーの説明と可能な解決策を確認できます。
| エラー | 説明 |
|
INVALID_CREDENTIALS |
ユーザー名またはパスワードのいずれかが正しくない場合にこのエラーが発生します。 例: |
受け取ったJWTを使用してDrupal REST APIを認証する:
- JWTを使用して認証を行うには、受け取ったJWTをAuthorizationヘッダーにBearerトークンとして追加するだけです。
リクエスト: 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ヘッダーを送信しない場合、または何らかの理由でサーバーによって削除された場合にこのエラーが発生します。 例: |
| INVALID_AUTHORIZATION_HEADER_TOKEN_TYPE |
Authorizationヘッダーを送信したがトークンタイプがBearerでない場合にこのエラーが発生します 例: |
| TOKEN_EXPIRED |
Authorizationヘッダーを送信したがアクセストークンの有効期限が切れている場合にこのエラーが発生します。 例: |
| USER_INFORMATION_NOT_FOUND |
ユーザー情報の取得中にこのエラーが発生します。 例: |
|
INVALID_SIGNATURE |
トークンの署名が無効な場合にこのエラーが発生します。 例: |
Drupal Documentationからの記事。