Laravel 10 入門トップページ


目次

  1. API とプロジェクトの概要
  2. プロジェクトの作成と初期設定
  3. データベースのマイグレーション
  4. シーダによるコメントデータの登録
  5. モデルの生成
  6. リソースの生成
  7. GETメソッドを利用した個別コメント取得のAPI作成
  8. 日本語文字列の表示と日時の調整
  9. GETメソッドを利用したコメント一覧取得のAPI作成
  10. データのラップ
  11. POSTメソッドを利用したコメントの新規投稿APIの作成
  12. PUTメソッドを利用したコメント更新APIの作成
  13. DELETEメソッドを利用したコメント削除APIの作成
  14. シーダの拡張
  15. ページネーションの実装
  16. 個別コメントをコントローラで取得
  17. Postman の利用
  18. ユーザ情報を登録する
  19. Sanctum によるユーザ認証
  20. ログインとトークン
  21. コメントとユーザのリレーションシップ
  22. 新規投稿時にユーザIDを記録する
  23. コメントからユーザ名を表示するリレーションシップ
  24. ユーザからコメント一覧を取得するリレーションシップ
  25. 更新と削除の権限設定
  26. 発行済みトークンの取得
  27. トークンの有効期限
  28. レート制限
  29. 閲覧権限の緩和

Laravel で API を開発する

トークンの有効期限

これまでの作業では,ログインする度に新たなトークンが発行され,そのトークンには有効期限が設定されていないので,過去に発行したどのトークンでも認証が可能であることを確認しました.ここでは発行したトークンに有効期限を設定し,トークンを発行した日時から一定時間経過後にはそのトークンが無効になる様な仕組みを導入します.

トークンの有効期限は config/sanctum.php で設定します.デフォルトでは 'expiration' => null, になっているため,有効期限の設定が無効になっています.

config/sanctum.php (抜粋)
    /*
    |--------------------------------------------------------------------------
    | Expiration Minutes
    |--------------------------------------------------------------------------
    |
    | This value controls the number of minutes until an issued token will be
    | considered expired. This will override any values set in the token's
    | "expires_at" attribute, but first-party sessions are not affected.
    |
    */

    'expiration' => null,

データベースを検索すると,expires_at フィールドの値が NULL になっていることも分かります.

sqlite> SELECT id, tokenable_id, last_used_at, expires_at, created_at, updated_at FROM personal_access_tokens; ⏎
id|tokenable_id|last_used_at|expires_at|created_at|updated_at
1|1|2023-12-18 12:28:52||2023-12-18 11:21:08|2023-12-18 12:28:52
2|2|2023-12-18 11:54:45||2023-12-18 11:21:13|2023-12-18 11:54:45
3|3|2023-12-18 11:22:32||2023-12-18 11:21:19|2023-12-18 11:22:32
4|1|2023-12-18 12:33:47||2023-12-18 12:28:20|2023-12-18 12:33:47
5|1|2023-12-18 12:36:22||2023-12-18 12:28:21|2023-12-18 12:36:22
sqlite>

有効期限を例えば60分に書き換えます.

config/sanctum.php (抜粋)
    /*
    |--------------------------------------------------------------------------
    | Expiration Minutes
    |--------------------------------------------------------------------------
    |
    | This value controls the number of minutes until an issued token will be
    | considered expired. This will override any values set in the token's
    | "expires_at" attribute, but first-party sessions are not affected.
    |
    */

    'expiration' => 60,

有効期限を設定した後にログインしてトークンを発行します.

C:\Users\Rinsaka>curl -X POST -d "email=a@sample.com" -d "password=abc" http://192.168.56.101:8000/api/login/ ⏎
{"user":{"id":1,"name":"A. Sample","email":"a@sample.com","email_verified_at":null,"created_at":"2023-11-02T15:01:01.000000Z","updated_at":"2023-11-02T15:01:01.000000Z"},"token":"6|wQ0rRUauXuM5y7HfujzvQwdiWceGvvjjBw5IhWIy15219cb3"}
C:\Users\Rinsaka>

データベースで検索しても,テーブルには有効期限は設定されませんでした.

sqlite> SELECT id, tokenable_id, last_used_at, expires_at, created_at, updated_at FROM personal_access_tokens; ⏎
id|tokenable_id|last_used_at|expires_at|created_at|updated_at
1|1|2023-12-18 12:28:52||2023-12-18 11:21:08|2023-12-18 12:28:52
2|2|2023-12-18 11:54:45||2023-12-18 11:21:13|2023-12-18 11:54:45
3|3|2023-12-18 11:22:32||2023-12-18 11:21:19|2023-12-18 11:22:32
4|1|2023-12-18 12:33:47||2023-12-18 12:28:20|2023-12-18 12:33:47
5|1|2023-12-18 12:36:22||2023-12-18 12:28:21|2023-12-18 12:36:22
6|1|||2023-12-18 12:39:56|2023-12-18 12:39:56
sqlite>

データベースのテーブルに有効期限は設定されませんでしたが,config/sanctum.php に設定することで作成日時 (created_at) からの経過時間が利用時に検証されます.(この方式を採用することで,有効期限が登録されていないトークンであっても有効期限の検証ができるので,より柔軟な運用ができることが予想されます.)実際に実験を行います.(1) ID=5 のトークンは新規発行後に1時間を経過していないので利用が可能です.(2) ID=1 のトークンは発行からすでに1時間以上が経過している状態なので,エラーになることが確認できます.

C:\Users\Rinsaka>curl -H "Authorization: Bearer 5|EKxCQ0KbIDIofZ0CglUgYxL8oeHPOzu7t43HJk9Bfdb5c692" http://192.168.56.101:8000/api/comments/5/ ⏎ # (1) 有効期限内
{"comment":{"id":5,"title":"松本 あすか","body":"8643910  長崎県西之園市西区石田町青田2-4-4 ハイツ井上103号 \/ yosuke68@example.net","owner":"B. Sample","updated_at":"2023-11-04T23:59:21.000000Z"}}
C:\Users\Rinsaka>curl -H "Authorization: Bearer 1|fzYV0EEfaDBGy5sifY9V3A6LWZBPmZklpWy4Auxd018912e0" http://192.168.56.101:8000/api/comments/5/ ⏎ # (2) 有効期限切れ
<!DOCTYPE html>
<html lang="en" class="auto">
<!--
Symfony\Component\Routing\Exception\RouteNotFoundException: Route [login] not defined. in file /home/vagrant/Documents/laravel/CommentAPI/vendor/laravel/framework/src/Illuminate/Routing/UrlGenerator.php on line 479

...(以下略)...

なお,Laravel がデバッグモードになっているので,エラー時には多くの情報が表示されます.本番環境で利用する場合はデバッグモードを無効にします.

.env (抜粋)
APP_NAME=Laravel
APP_ENV=local
APP_KEY=base64:s1FXiNVBIvnYMSy5NyLPPnwnpT/Ki/GUnxWNaFhEIWk=
APP_DEBUG=false
APP_URL=http://localhost

本番モードでの出力結果も確認してみます.

C:\Users\Rinsaka>curl -H "Authorization: Bearer 5|EKxCQ0KbIDIofZ0CglUgYxL8oeHPOzu7t43HJk9Bfdb5c692" http://192.168.56.101:8000/api/comments/5/ ⏎ # (3) 有効期限内
{"comment":{"id":5,"title":"松本 あすか","body":"8643910  長崎県西之園市西区石田町青田2-4-4 ハイツ井上103号 \/ yosuke68@example.net","owner":"B. Sample","updated_at":"2023-11-04T23:59:21.000000Z"}}
C:\Users\Rinsaka>curl -H "Authorization: Bearer 1|fzYV0EEfaDBGy5sifY9V3A6LWZBPmZklpWy4Auxd018912e0" http://192.168.56.101:8000/api/comments/5/ ⏎ # (4) 有効期限切れ
<!DOCTYPE html>
<html lang="en">
    <head>
        <meta charset="utf-8">
        <meta name="viewport" content="width=device-width, initial-scale=1">

        <title>Server Error</title>
...(以下略)...

目次に戻る