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