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

閲覧権限の緩和

ここまでの作業で,コメントの閲覧,投稿,編集,削除の全てでトークンによる認証を必要とすることができました.また,コメントの所有者に対してのみ編集や削除の権限を与えることができました.ここではその権限を緩和し,一覧表示と個別表示,つまり閲覧にはトークンによる認証を求めないようにします.なお,閲覧してもデータベース内容を変更しないので,これらは安全なメソッドであると認識できます.

現在のルートの定義を確認します.コメントの一覧取得(2行目)と個別取得(3行目)のルートも auth:sanctum のミドルウェアのグループに含まれています.

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');
});

したがって,現時点ではトークンがないとサーバエラーとなります.

C:\Users\Rinsaka>curl http://192.168.56.101:8000/api/comments/5/ ⏎
<!DOCTYPE html>
<html lang="en">
    <head>
        <meta charset="utf-8">
        <meta name="viewport" content="width=device-width, initial-scale=1">

        <title>Server Error</title>

閲覧に関する二つのルート定義をミドルウェアの外に出すだけで,認証を不要にすることができます.

routes/api.php (抜粋)
Route::get('/comments', [CommentController::class, 'index']) -> name('comments.index');
Route::get('/comments/{comment_id}', [CommentController::class, 'show']) -> name('comments.show');

Route::group(['middleware' => 'auth:sanctum'], function(){
    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');
});

トークンを付与することなく,URI さえ分かれば誰でも利用できるようになりました.(実際上はまだ本番環境ではありませんが...)

C:\Users\Rinsaka>curl http://192.168.56.101:8000/api/comments/5/ ⏎
{"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>

なお,前のページのとおり送信元 IP アドレスでもレート制限が適用されるので,1分間に60回を超えるリクエストがあると「Too Many Requests」のエラーが表示されます.

C:\Users\Rinsaka>curl http://192.168.56.101:8000/api/comments/5/ ⏎ # 59回目
{"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 http://192.168.56.101:8000/api/comments/5/ ⏎ # 60回目
{"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 http://192.168.56.101:8000/api/comments/5/ ⏎ # 61回目
<!DOCTYPE html>
<html lang="en">
    <head>
        <meta charset="utf-8">
        <meta name="viewport" content="width=device-width, initial-scale=1">

        <title>Too Many Requests</title>

つまり,同じ大学(あるいは組織など)から多くの学生が一斉に API で接続するようなサービスを提供すると,レート制限が働いてサービスが中断する可能性があることを認識しておく必要があります.例えば数百人が受講する講義の出席登録を受け付けるような場合などが想定されます.そのようなサービスを開発する場合はレート制限の調整が必要になりそうです.

目次に戻る