Drupal JSON Web Token Authenticationモジュールを試す
概要
DrupalのJSON Web Token Authenticationモジュールを試してみます。
以下のページを参考にしました。
なお、類似するモジュールとして、以下があるようです。
上記モジュールを使ったjwt認証は以下で説明されています。
しかし、以下の記事に記載したように、上記モジュールでjwt認証を使用するには有料プランに加入する必要があるようでした。
そこで、今回は、jwt
モジュールのほうを試してみます。
インストールと有効化
jwt
モジュール
注意点として、jwt
だけでなく、jwt_auth_consumer
やjwt_auth_issuer
も有効化する必要がありました。
composer.phar require 'drupal/jwt:^2.0'
vendor/bin/drush en jwt jwt_auth_consumer jwt_auth_issuer
restui
モジュール
composer.phar require 'drupal/restui:^1.21'
vendor/bin/drush en restui
設定
以下にアクセスして、キーを作成します。
/admin/config/system/keys
Key type
としてJWT HMAC Key
を選択して、JWT Algorithm
としてSHA-256
を選択しました。
次に、以下にアクセスして、JWTの設定を行います。
Algorithm
としてデフォルトのSHA-256
を選択して、Secret
として先ほど作成したキー(ここではjwt
)を選択します。
その後、ログインした状態で、以下にアクセスしてみます。
/jwt/token
すると、以下のようなトークンが得られます。
参考までに、このトークンをjwt.io
で検証してみます。
PAYLOAD
の箇所を見てみると、iat
(Issued A: トークンが発行された時刻)やDrupalの「User ID」を確認することができます。
RESTリソースの設定
以下にアクセスします。
/admin/config/services/rest
ここでは、コンテンツ
に対して、POST
を有効化し、認証プロバイダとしてjwt_auth
を選択します。
Postman
Postmanを使って、コンテンツの作成を試してみます。
まず、Authorization
を指定せずに、コンテンツの作成試してみます。
Body
はraw
を選択して、フォーマットをJSON
とします。以下の最低限のデータで、article
タイプのコンテンツの作成してみます。
{
"type": [
{
"target_id": "article"
}
],
"title": [
{
"value": "新しい記事のタイトル"
}
]
}
POST先のURLは以下です。
{DRUPALをインストールしたパス}/node?_format=json
結果、以下のような結果が返却されます。
{
"status": "error",
"code": "401",
"error_description": "MISSING AUTHORIZATION HEADER"
}
次に、Authorization
でBear Token
を選択して、先ほど取得したトークンを入力してpostしてみます。
結果、以下のようにコンテンツを作成することができました。
{
"nid": [
{
"value": 2890
}
],
"uuid": [
{
"value": "2638690a-e6c3-4723-843a-38c951f5809a"
}
],
"vid": [
{
"value": 2916
}
],
"langcode": [
{
"value": "ja"
}
],
"type": [
{
"target_id": "article",
"target_type": "node_type",
"target_uuid": "974a1b20-9965-45bc-95a6-0466e536040a"
}
],
"revision_timestamp": [
{
"value": "2023-12-31T07:14:33+00:00",
"format": "Y-m-d\\TH:i:sP"
}
],
"revision_uid": [
{
"target_id": 1,
"target_type": "user",
"target_uuid": "fc10b1ef-c493-475d-b206-43b4d61ee171",
"url": "/xxx/user/1"
}
],
"revision_log": [],
"status": [
{
"value": true
}
],
"uid": [
{
"target_id": 1,
"target_type": "user",
"target_uuid": "fc10b1ef-c493-475d-b206-43b4d61ee171",
"url": "/xxx/user/1"
}
],
"title": [
{
"value": "新しい記事のタイトル"
}
],
"created": [
{
"value": "2023-12-31T07:14:33+00:00",
"format": "Y-m-d\\TH:i:sP"
}
],
"changed": [
{
"value": "2023-12-31T07:14:33+00:00",
"format": "Y-m-d\\TH:i:sP"
}
],
"promote": [
{
"value": true
}
],
"sticky": [
{
"value": false
}
],
"default_langcode": [
{
"value": true
}
],
"revision_translation_affected": [
{
"value": true
}
],
"path": [
{
"alias": null,
"pid": null,
"langcode": "ja"
}
],
"body": [],
"field_image": []
}
(参考)JSON:APIの場合
次に、JSON:APIを使った場合の結果も確認してみます。
設定
まずウェブサービスのJSON:API
を有効化します。
次に、/admin/config/services/jsonapi
にアクセスして、すべての操作を許可します。
なお、この設定を行わずに後述するpostを行うと、以下のエラーが返却されます。
{
"jsonapi": {
"version": "1.0",
"meta": {
"links": {
"self": {
"href": "http://jsonapi.org/format/1.0/"
}
}
}
},
"errors": [
{
"title": "Method Not Allowed",
"status": "405",
"detail": "JSON:API is configured to accept only read operations. Site administrators can configure this at xxx/admin/config/services/jsonapi.",
"links": {
"via": {
"href": "xxx/jsonapi/node/article"
},
"info": {
"href": "http://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html#sec10.4.6"
}
},
"source": {
"file": "xxx/core/modules/jsonapi/src/Routing/ReadOnlyModeMethodFilter.php",
"line": 76
},
"meta": {
...
}
}
]
}
Postman
JSON:API
を用いる場合には、以下のようなjsonデータを使ってコンテンツを作成します。
{
"data": {
"type": "node--article",
"attributes": {
"title": "Page Title"
}
}
}
articleタイプのコンテンツを作成する場合のPOST先のURLは以下です。
{DRUPALをインストールしたパス}/jsonapi/node/article
Authorization
を指定せずに、コンテンツの作成を試みます。結果、以下のように、先ほどと同様の結果が得られます。
{
"status": "error",
"code": "401",
"error_description": "MISSING AUTHORIZATION HEADER"
}
Authorization
を指定した場合、以下のようにコンテンツが作成されました。
{
"jsonapi": {
"version": "1.0",
"meta": {
"links": {
"self": {
"href": "http://jsonapi.org/format/1.0/"
}
}
}
},
"data": {
"type": "node--article",
"id": "a4338a64-2f84-4685-9abf-9519a3ceef09",
"links": {
"self": {
...
}
まとめ
DrupalのJWTモジュールを用いたAPIの利用例について紹介しました。
十分に考慮できていない点が多いかと思いますが、本モジュール等の使い方の参考になりましたら幸いです。
Discussion