Laravel8+SanctumでAPI認証その1(インストールから未認証だったら401を返す所まで)
https://reffect.co.jp/laravel/laravel-sanctum-token
1, 普通にlaravelをインストール
1 2 |
composer create-project laravel/laravel laravel8 cd laravel8 |
2. sanctumをインストール
1 |
composer require laravel/sanctum |
3. 適当なユーザレコードをseederで作る
databases/migrations/seeders/DatabaseSeeder.php
1 2 3 4 5 |
public function run() { // \App\Models\User::factory(10)->create(); \App\Models\User::factory(1)->create(); } |
1 |
php artisan migrate:fresh --seed |
phpMyAdminなんかで、作成されたemailを取得。パスワードはpassword固定
4. 自動ログイン→トークン作成→ブラウザに表示
routes/web.php
1 2 3 4 5 6 7 8 |
Route::get('/', function () { // return view('welcome'); $user = Auth::loginUsingId(1); $token = $user->createToken('test'); dd($token); }); |
Laravel\Sanctum\NewAccessToken {#1081 ▼
+accessToken: Laravel\Sanctum\PersonalAccessToken {#1170 ▶}
+plainTextToken: “1|uPlPwEI9YB5Y6RQTUdZx1wx6ko0lkwwyxEEJP24Q”
}
personal_access_tokensテーブルにトークンは保存される。
tokenカラムにある値は、plainTextTokenがハッシュ化され保存されているので文字列が違う
5. laravelのAPIを使ってみる
routes/api.php
1 2 3 4 5 6 7 8 9 |
// APIテスト用 Route::get('/test', function(){ return 'hello, api world!!'; }); // 最初から用意されている認証 Route::middleware('auth:sanctum')->get('/user', function (Request $request) { return $request->user(); }); |
問題なく表示される
http://localhost/laravel8/public/api/test
認証が必要なAPIにアクセスするとRoute [login] not defined.というエラー画面がブラウザ上に表示される・・・。
http://localhost/laravel8/public/api/user
APIアクセスした時に、認証エラー画面を返してもしょうがないので、エラーコードとメッセージを返す
https://laracasts.com/index.php/discuss/channels/laravel/custom-message-for-unauthorized-api-call-in-laravel-8
app/Http/Middleware/Authenticate.php
1 2 3 4 5 |
// 認証されていない状態なら401エラーを返す protected function unauthenticated($request, array $guards) { abort(response()->json(['error' => 'Unauthenticated.'], 401)); } |