Laravel8 API認証 / Laravel Sanctum
APIで認証が必要。調べるとLaravel Sanctumってヤツを使うらしい
作成日:2023-09-04, 更新日:2023-09-05
基本
APIでの認証にはいくつかある。あるけど、Laravel8だと「Laravel Sanctum」ってのが用意されているとのコト。
「Laravel Sanctum」ってのを使ってAPIでの認証を実装する場合、「ステートレス認証」という方式になるそうだ。
私の環境
WIN+Docker+Ubuntuでlaravelを使うための作業メモ
流れ
参照: codelikes.com/use-laravel-sanctum
- Laravel Sanctumのインストールと有効化
- ルーティング設定
- コントローラー作成: 登録
- コントローラー作成: ログイン
- 確認(postmanってのを使う)
※ルーティング設定とコントローラー作成はどっちを先にしても良いと思う
Laravel Sanctumのインストールと有効化
Laravel Sanctumのインストール
すでにインスト済みなので、無視(未調査)
artisanコマンド叩いて、マイグレーション実行…という流れっぽい
Laravel Sanctumの有効化
すでに記載済みだったので内容の確認だけ。コメントされていたらコメント解除
▼app/Http/Kernel.php
~省略~
'api' => [
\Laravel\Sanctum\Http\Middleware\EnsureFrontendRequestsAreStateful::class, // ← 追加
~省略~
]
~省略~
▼app/Models/User.php
~省略~
use Laravel\Sanctum\HasApiTokens; // ← 追加
~省略~
class User extends Authenticatable
{
use HasApiTokens, HasFactory, Notifiable; // ← 「HasApiTokens」を追加
~省略~
ルーティング設定
▼routes/api.php
~省略~
use App\Http\Controllers;
~省略~
// ▼消しても良いけど、ひとまずコメント
// Route::middleware('auth:sanctum')->get('/user', function (Request $request) {
// return $request->user();
// });
Route::middleware('auth:sanctum')->group(function () { // 認証中のみ有効なページたち
// Route::post('/logout', [Controllers\Api\LogoutController::class, 'do']); // ログアウト ← APIだからいらないかな?
// Route::prefix('profile')->group(function(){ // ← いずれ作る予定だから下準備だけしておく
// Route::get('/', [Controllers\Api\ProfileController::class, 'index']);
// Route::post('do', [Controllers\Api\ProfileController::class, 'do']);
// });
});
Route::post('/register', [Controllers\Api\RegisterController::class, 'do']);// ユーザー登録
Route::post('/login', [Controllers\Api\LoginController::class, 'do']);// ログイン
~省略~
コントローラー作成: 登録
ubuntuからartisanコマンドを叩く
xxxx$ ./vendor/bin/sail php artisan make:controller Api/RegisterController
→「app/Http/Controllers/Api/RegisterController.php」が作られる
app/Http/Controllers/Api/RegisterController.phpの修正
~ 省略 ~
// ▼追加分
use App\Providers\RouteServiceProvider;
use App\Models\User;
use Illuminate\Http\RedirectResponse;
use Illuminate\Support\Facades\Hash;
use Illuminate\Support\Facades\Validator;
use \Symfony\Component\HttpFoundation\Response;
class RegisterController extends Controller
{
public function do(Request $request)
{
/** @var Illuminate\Validation\Validator $validator */
$validator = Validator::make($request->all(), [
'name' => 'required',
'email' => 'required|email',
'password' => 'required'
]);
if ($validator->fails()) {
return response()->json($validator->messages(), Response::HTTP_UNPROCESSABLE_ENTITY); // バリデーションエラーで422
}
User::create([
'name' => $request->name,
'email' => $request->email,
'password' => Hash::make($request->password),
]);
return response()->json('User registration completed', Response::HTTP_OK); // 200で返す
}
}
コントローラー作成: ログイン
ubuntuからartisanコマンドを叩く
xxxx$ ./vendor/bin/sail php artisan make:controller Api/LoginController
→「app/Http/Controllers/Api/LoginController.php」が作られる
app/Http/Controllers/Api/LoginController.phpの修正
~ 省略 ~
// ▼追加分
use Illuminate\Support\Facades\Auth;
use Illuminate\Validation\ValidationException;
use App\Models\User;
use \Symfony\Component\HttpFoundation\Response;
class LoginController extends Controller
{
public function do(Request $request)
{
$credentials = $request->validate([
'email' => 'required|email',
'password' => 'required'
]);
if (Auth::attempt($credentials)) { // ログイン成功
// 既存のトークンを削除
$user = User::whereEmail($request->email)->first();
$user->tokens()->delete();
// トークンの生成して返す
$token = $user->createToken("login:user{$user->id}")->plainTextToken;
return response()->json(['token' => $token ], Response::HTTP_OK);
}
// ===============================
// 以下、ログイン失敗時の処理
return response()->json('User Not Found.', Response::HTTP_INTERNAL_SERVER_ERROR);
}
}
確認(postmanってのを使う)
localhostで確認が面倒なので「postman」ってのを使う
ログイン後の確認
APIでログインしたらトークンが返ってくるのでそのトークンを使ってログインしている人用のAPIを叩いてみる
- ルーティング設定
- ubuntuからartisanコマンドを叩く
- コントローラーファイルの修正
- POSTMANで実行
ルーティング設定
▼routes/api.php
~ 省略 ~
Route::middleware('auth:sanctum')->group(function () { // 認証中のみ有効なページたち
Route::post('/test', [Controllers\Api\TestController::class, 'index']); // テスト用に追加
~ 省略 ~
});
~ 省略 ~
ubuntuからartisanコマンドを叩く
コントローラーファイルを作成
xxxx$ ./vendor/bin/sail php artisan make:controller Api/TestController
→「app/Http/Controllers/Api/TestController.php」が作られる
コントローラーファイルの修正
▼app/Http/Controllers/Api/TestController.php
~ 省略 ~
// ▼追加分
use \Symfony\Component\HttpFoundation\Response;
class TestController extends Controller
{
public function index(Request $request)
{
$response = array(
'hoge' => '丸ごとシマウマ',
);
return response()->json($response, Response::HTTP_OK);
}
}
~ 省略 ~
POSTMANで実行
ログインAPIを叩いたときのトークンを「authorization」の「Bearer」ってトコにセットしてアクセス

メモ
バリデーションエラー時はlaravelの標準設定としてTOPにリダイレクトしているとか…
後でバリデーションは自作するからカスタマイズはひとまず放置