JSON:APIが行わないこと
JSON:APIは完全にエンティティベースです。つまり、ビジネスルールを処理したり、「CRUD」として考えられないことを行ったりすることはできません。新しいアカウントの登録、ユーザーのログイン、新しいパスワードの要求といったビジネスロジックは、JSON:APIの一部ではありません。これらの多くはDrupalコアによってすでに提供されています。
以下に、一般的なニーズと解決策の完全ではないリストを示します。
関連するパスは次のとおりです:
- /session/token
- /user/register
- /user/login
- /user/login_status
- /user/logout
セッショントークンを取得する
トークンを取得する
curl \
--request GET http://drupal.d8/session/token
トークンはレスポンスボディにプレーンテキスト(JSONではない)として返されます。
トークンを使用する
ログインすると、セッショントークンに加えてcsrf_tokenとlogout_tokenが取得できます。ユーザーをシステムからログアウトさせるにはlogout_tokenが必要です(下記参照)。可変リクエスト(例:POST、PATCH、DELETE)にはcsrf_tokenまたはセッショントークンが必要です。
ユーザー登録
コアが提供するJSON:APIは新しいユーザー登録をサポートしていませんが、JSON:API User Resourcesモジュールをインストールすると、登録、パスワードのリセット、パスワードの更新のためのエンドポイントを含む、ユーザー関連のJSON:APIエンドポイントを追加できます。
あるいは、コアのRESTモジュールを使用することもできます。ユーザーがREST経由でアカウントを登録できるようにするには、user_registration RESTリソースを有効にする必要があります(下記のREST UIの例を参照してください)。
curl \
--header "Content-Type: application/json" \
--header "X-CSRF-Token: 57sTS-KS7UoYAWAPyzt0iJmo300CFct3jdKyWM-UiiQ" \
--request POST "https://drupal.d9/user/register?_format=json" \
--data '{"name": {"value": "thename123"}, "pass": {"value": "thepass"}, "mail": {"value": "someone@example.com"}}'
X-CSRF-Tokenヘッダーにはセッショントークンの値を使用します。成功したレスポンスには、新しく作成されたユーザーのUUIDを含む、いくつかのユーザーフィールド値が含まれているはずです。
{
"uuid" : [ { "value" : "3e75b757-831e-4bf7-bbb6-25b8c50c7ac0" } ]
}
また、訪問者が自分でアカウントを作成できる場合でも、レスポンスに「Set-Cookie」ヘッダーは含まれないことに注意してください。そのため、承認や確認が必要ない場合は、登録が成功した後、同じnameとpassの値を使用してユーザーをログインさせることができます。
ユーザーログイン
curl \
--header "Content-type: application/json" \
-c cookie.txt \
--request POST "http://drupal.d8/user/login?_format=json" \
--data '{"name":"admin", "pass":"admin"}'
-c cookie.txtは、curlにクッキーを保存するよう指示します。レスポンスは次のような形になるはずです。
{
"csrf_token" : "57sTS-KS7UoYAWAPyzt0iJmo300CFct3jdKyWM-UiiQ",
"logout_token" : "zzRaD8ZgLT1TkG804mYpVVTyM-pgoDm4h9XZ9JHSoCw",
"current_user" : {
"roles" : [
"authenticated",
"administrator"
],
"name" : "admin",
"uid" : "1"
}
}
ユーザーステータス
curl \
--header "Content-type: application/json" \
-b cookie.txt \
--request GET "http://drupal.d8/user/login_status?_format=json"
-b cookie.txtは、前回のリクエストのクッキーを(保存ではなく)送信するようcurlに指示します。ログインしている場合は、レスポンスボディにプレーンテキスト形式(JSONではない)で1が返されます。それ以外の場合は0が返されます。
ユーザーログアウト
curl \
--header "Content-type: application/json" \
-b cookie.txt \
--request POST "http://drupal.d8/user/logout?_format=json&token=zzRaD8ZgLT1TkG804mYpVVTyM-pgoDm4h9XZ9JHSoCw"
cookie.txtで認証されたユーザーをログアウトします。tokenクエリパラメーターにはlogout_tokenの値を使用します。
認証メカニズム
上記の例は、利用可能な数多くの認証メカニズムのうちのひとつにすぎません。自分のニーズに最適なメカニズムを検討してください。
Drupal OAuthモジュールはsimple_oauthとして利用できます。
参考資料
詳細については、次の変更記録を参照してください。
- https://www.drupal.org/node/2720655 (login、login_status、ログアウト)
- https://www.drupal.org/node/2752071 (登録)
認証には、他の認証プロトコルを使用することも検討できます。
フロントエンドにJavaScriptアプリケーション、バックエンドにDrupalを使用する「クッキー」方式を選択した場合、ブラウザがクッキー保存のすべての処理を行ってくれます。ただし、JSアプリとDrupalサイトのドメイン名が異なる場合は、SameSiteクッキーパラメーターを「None」に変更して、ブラウザがユーザーのセッションクッキーを保存できるようにする必要があることを忘れないでください。これを行うには、services.ymlファイルを編集して、次のパラメーターを追加します。
parameters:
session.storage.options:
cookie_samesite: None
REST UI
REST UIコントリビュートモジュールを使用すると、コアのRESTモジュールのリソースを設定できます。このモジュールでユーザー登録を有効にする方法を見てみましょう。
- REST UIモジュールをインストールして有効にしたら、/admin/config/services/restにある設定ページに移動し、「User registration(ユーザー登録)」リソースを有効にします。リソースを編集して、たとえばPOSTメソッド、JSON形式、Cookieプロバイダーを有効にします。粒度を「method」に切り替えると、リクエストメソッドごとに形式とプロバイダーを分けることもできます。
- 次に、/admin/people/permissions/module/restで、匿名ユーザーに「Access POST on User registration resource(ユーザー登録リソースへのPOSTアクセス)」パーミッションを付与します。
- 最後に、/admin/config/people/accountsで、訪問者がアカウントを作成できることを確認します。
Drupalドキュメントからの記事です。