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 を開発する

ログインとトークン

前のページではあるユーザがログインの POST メソッドを利用して新規のトークンを発行しました.現時点の設定では発行されたトークンに有効期限はありません.したがって,ログインするたびに新たなトークンが発行され,どのトークンでも利用することができます.

確認のために,ユーザ a@sample.com が3度トークンを発行し,ユーザ b@sample.com が2度トークンを発行する操作を行います.

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":"2|DD4eCA11Zhj8XSzfQHhXJs4FHSiFFpZikIO1XonV9457a90c"}
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":"3|kTUo7hb4cSyadIDWLQtqScjuypUiBA7PYFdh0Zwd3078be8b"}
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":"4|f9PXJ1iJ9yvF5qZ3E8a7QMGOmNv8XmTZDtzo3TrEd52f3ef1"}
C:\Users\Rinsaka>curl -X POST -d "email=b@sample.com" -d "password=abc" http://192.168.56.101:8000/api/login/ ⏎
{"user":{"id":2,"name":"B. Sample","email":"b@sample.com","email_verified_at":null,"created_at":"2023-11-02T15:02:01.000000Z","updated_at":"2023-11-02T15:02:01.000000Z"},"token":"5|VPQqgvAQ4qWoWZEgzq7iVPdzPtfff4ueUiGrLFmLa084fa76"}
C:\Users\Rinsaka>curl -X POST -d "email=b@sample.com" -d "password=abc" http://192.168.56.101:8000/api/login/ ⏎
{"user":{"id":2,"name":"B. Sample","email":"b@sample.com","email_verified_at":null,"created_at":"2023-11-02T15:02:01.000000Z","updated_at":"2023-11-02T15:02:01.000000Z"},"token":"6|QRWYkRNgeD0vYpJhI6MDBAQwKGiSqog3RxMFTMk2f636b5d6"}
C:\Users\Rinsaka>

発行されたトークンは ID|48文字の英数字 の形式になっていることを確認してください.

次に,データベースの personal_access_tokens テーブルでもトークンを確認します.tokenable_id にはトークンを発行したユーザのIDが格納されています.まだ利用されたことのないトークン(ID:2〜6)には created_atupdated_at に同じ日時(作成日時)が記録されています.またこれまでに利用されたことのあるトークン(ID:1)には最後に利用された日時が last_used_at に記録され,updated_at にも同じ日時が記録されています.

sqlite> SELECT * FROM personal_access_tokens;
id|tokenable_type|tokenable_id|name|token|abilities|last_used_at|expires_at|created_at|updated_at
1|App\Models\User|1|comments-api-token|0c94ec67889ac45b2963e7876260ce7452c8b3880963f5eb2a72aa1019e11324|["*"]|2023-12-18 10:32:16||2023-12-18 10:18:54|2023-12-18 10:32:16
2|App\Models\User|1|comments-api-token|c5ccb247cc02c22f02bf3686d950a6ccb0b46166a8a5199370bade7ab97b8c2d|["*"]|||2023-12-18 10:40:05|2023-12-18 10:40:05
3|App\Models\User|1|comments-api-token|096f70dbc1595a5baa49804296f635236d03c201455ad02ad065918069f657a5|["*"]|||2023-12-18 10:40:11|2023-12-18 10:40:11
4|App\Models\User|1|comments-api-token|e9923d7abd921bd287a85edffc9263442f906788a44c8529ba53a720aac9a70b|["*"]|||2023-12-18 10:40:13|2023-12-18 10:40:13
5|App\Models\User|2|comments-api-token|4feeb7e6f828143619967b0a214f3c1675041752037cf0a01e52ccdf906839dc|["*"]|||2023-12-18 10:40:20|2023-12-18 10:40:20
6|App\Models\User|2|comments-api-token|fdbb7bde6985c84c7139090bd7cfe5d1177a911e7af220b83fa31f5dbea8b1ce|["*"]|||2023-12-18 10:40:24|2023-12-18 10:40:24
sqlite>

ID = (1, 2, 4, 5) のトークンを順番に利用して,個別コメント情報を取得します.

C:\Users\Rinsaka>curl -H "Authorization: Bearer 1|LKP6Mb8mQQ7d0TJpRoxpsk8NoWFeDJvEPcNPu0gscf82b730" http://192.168.56.101:8000/api/comments/1/ ⏎
{"comment":{"id":1,"title":"最初のコメント","body":"最初のコメントです!","updated_at":"2023-10-02T10:10:10.000000Z"}}
C:\Users\Rinsaka>curl -H "Authorization: Bearer 2|DD4eCA11Zhj8XSzfQHhXJs4FHSiFFpZikIO1XonV9457a90c" http://192.168.56.101:8000/api/comments/1/ ⏎
{"comment":{"id":1,"title":"最初のコメント","body":"最初のコメントです!","updated_at":"2023-10-02T10:10:10.000000Z"}}
C:\Users\Rinsaka>curl -H "Authorization: Bearer 4|f9PXJ1iJ9yvF5qZ3E8a7QMGOmNv8XmTZDtzo3TrEd52f3ef1" http://192.168.56.101:8000/api/comments/1/ ⏎
{"comment":{"id":1,"title":"最初のコメント","body":"最初のコメントです!","updated_at":"2023-10-02T10:10:10.000000Z"}}
C:\Users\Rinsaka>curl -H "Authorization: Bearer 5|VPQqgvAQ4qWoWZEgzq7iVPdzPtfff4ueUiGrLFmLa084fa76" http://192.168.56.101:8000/api/comments/1/ ⏎
{"comment":{"id":1,"title":"最初のコメント","body":"最初のコメントです!","updated_at":"2023-10-02T10:10:10.000000Z"}}
C:\Users\Rinsaka>

その結果データベースが次の様に更新されました.やはりトークンを利用して API にアクセスするとその日時が last_used_atupdated_at に記録されることがわかります.また,有効期限は登録されていないことも確認してください.トークン有効期限の設定は後ほど行います.

sqlite> SELECT * FROM personal_access_tokens; ⏎
id|tokenable_type|tokenable_id|name|token|abilities|last_used_at|expires_at|created_at|updated_at
1|App\Models\User|1|comments-api-token|0c94ec67889ac45b2963e7876260ce7452c8b3880963f5eb2a72aa1019e11324|["*"]|2023-12-18 10:43:45||2023-12-18 10:18:54|2023-12-18 10:43:45
2|App\Models\User|1|comments-api-token|c5ccb247cc02c22f02bf3686d950a6ccb0b46166a8a5199370bade7ab97b8c2d|["*"]|2023-12-18 10:43:52||2023-12-18 10:40:05|2023-12-18 10:43:52
3|App\Models\User|1|comments-api-token|096f70dbc1595a5baa49804296f635236d03c201455ad02ad065918069f657a5|["*"]|||2023-12-18 10:40:11|2023-12-18 10:40:11
4|App\Models\User|1|comments-api-token|e9923d7abd921bd287a85edffc9263442f906788a44c8529ba53a720aac9a70b|["*"]|2023-12-18 10:43:58||2023-12-18 10:40:13|2023-12-18 10:43:58
5|App\Models\User|2|comments-api-token|4feeb7e6f828143619967b0a214f3c1675041752037cf0a01e52ccdf906839dc|["*"]|2023-12-18 10:44:05||2023-12-18 10:40:20|2023-12-18 10:44:05
6|App\Models\User|2|comments-api-token|fdbb7bde6985c84c7139090bd7cfe5d1177a911e7af220b83fa31f5dbea8b1ce|["*"]|||2023-12-18 10:40:24|2023-12-18 10:40:24
sqlite>

目次に戻る