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

発行済みトークンの取得

以前のページで説明したとおり,ログインを実行するたびに新たなトークンが新規に発行されます.ここではユーザが自身で発行した全てのトークンを一覧で取得してみます.

まずルート定義に /tokens の URI を追加します.

routes/api.php (抜粋)
Route::group(['middleware' => 'auth:sanctum'], function(){
    Route::get('/comments', [CommentController::class, 'index']) -> name('comments.index');
    Route::get('/comments/{comment_id}', [CommentController::class, 'show']) -> name('comments.show');
    Route::post('/comments', [CommentController::class, 'store']) -> name('comments.store');
    Route::put('/comments/{comment_id}', [CommentController::class, 'update']) -> name('comments.update');
    Route::delete('/comments/{comment_id}', [CommentController::class, 'destroy']) -> name('comments.destroy');

    Route::get('/user', [UserController::class, 'show']) -> name('user.show');
    Route::get('/tokens', [UserController::class, 'tokens']) -> name('user.tokens');
});

Route::post('login', [UserController::class, 'login']);

続いてコントローラに tokens() 関数を追加します.

app/Http/Controllers/UserController.php
<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;
use Illuminate\Support\Facades\Auth;
use App\Models\User;

class UserController extends Controller
{
    function login(Request $request)
    {
        $user = User::where('email', $request->email)->first();
        if (!$user || !password_verify($request->password, $user->password)) {
            return response([
                'message' => ['認証情報が異なります']
            ], 404);
        }

        $token = $user->createToken('comments-api-token')->plainTextToken;

        $response = [
            'user' => $user,
            'token' => $token
        ];

        return response($response, 201);
    }

    function show()
    {
        $user = Auth::user();
        return ['user' => $user, 'comments' => $user->comments];
    }

    function tokens()
    {
        $user = Auth::user();
        $tokens = $user->tokens;
        return $tokens;
        // return  ["tokens" => $tokens, "user" => $user]; // これでも良い
    }
}

ユーザID = 1 の発行済みトークンで接続してトークンの一覧を確認すると,発行済みトークンは1件であることがわかりました.ただし,トークンそのものはやはり表示されないことに注意してください.

C:\Users\Rinsaka>curl -H "Authorization: Bearer 1|fzYV0EEfaDBGy5sifY9V3A6LWZBPmZklpWy4Auxd018912e0" http://192.168.56.101:8000/api/tokens/ ⏎
[{"id":1,"tokenable_type":"App\\Models\\User","tokenable_id":1,"name":"comments-api-token","abilities":["*"],"last_used_at":"2023-12-18T03:27:14.000000Z","expires_at":null,"created_at":"2023-12-18T02:21:08.000000Z","updated_at":"2023-12-18T03:27:14.000000Z"}]
C:\Users\Rinsaka>

同じユーザで2回続けてトークンを発行します.発行されたトークンの ID は 4 と 5 になりました.

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|pZZRrP4XsvmtsI5dF6gxyxZPa66yR5p43muS4u7obcf94fa6"}
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":"5|EKxCQ0KbIDIofZ0CglUgYxL8oeHPOzu7t43HJk9Bfdb5c692"}
C:\Users\Rinsaka>

トークンの一覧を取得すると,新規に発行したトークン(id = 4, 5)も含まれていることがわかりました.

C:\Users\Rinsaka>curl -H "Authorization: Bearer 1|fzYV0EEfaDBGy5sifY9V3A6LWZBPmZklpWy4Auxd018912e0" http://192.168.56.101:8000/api/tokens/ ⏎
[{"id":1,"tokenable_type":"App\\Models\\User","tokenable_id":1,"name":"comments-api-token","abilities":["*"],"last_used_at":"2023-12-18T03:28:52.000000Z","expires_at":null,"created_at":"2023-12-18T02:21:08.000000Z","updated_at":"2023-12-18T03:28:52.000000Z"},{"id":4,"tokenable_type":"App\\Models\\User","tokenable_id":1,"name":"comments-api-token","abilities":["*"],"last_used_at":null,"expires_at":null,"created_at":"2023-12-18T03:28:20.000000Z","updated_at":"2023-12-18T03:28:20.000000Z"},{"id":5,"tokenable_type":"App\\Models\\User","tokenable_id":1,"name":"comments-api-token","abilities":["*"],"last_used_at":null,"expires_at":null,"created_at":"2023-12-18T03:28:21.000000Z","updated_at":"2023-12-18T03:28:21.000000Z"}]
C:\Users\Rinsaka>

目次に戻る