ここまでの作業で,コメントの閲覧,投稿,編集,削除の全てでトークンによる認証を必要とすることができました.また,コメントの所有者に対してのみ編集や削除の権限を与えることができました.ここではその権限を緩和し,一覧表示と個別表示,つまり閲覧にはトークンによる認証を求めないようにします.なお,閲覧してもデータベース内容を変更しないので,これらは安全なメソッドであると認識できます.
現在のルートの定義を確認します.コメントの一覧取得(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 で接続するようなサービスを提供すると,レート制限が働いてサービスが中断する可能性があることを認識しておく必要があります.例えば数百人が受講する講義の出席登録を受け付けるような場合などが想定されます.そのようなサービスを開発する場合はレート制限の調整が必要になりそうです.