前提・実現したいこと
自己学習でブログサービスを開発中。
構成は下記であり、すべてdockerを利用してコンテナ環境で稼働させている
- フロント next.js
- バックエンド Laravel
- db mysql
お手数ですがreadmeを見て、環境構築していただき、下記の問題の解決策を提示いただけると幸いです。
発生している問題・エラーメッセージ
laravel sanctumで認証を実施し、フロントエンドで会員登録、ログイン、ユーザー情報取得まで実施しようとしたところ、下記のような状態である。
- 仮会員登録画面にて会員登録処理を実施
localhost:8025
のメールサーバコンテナにアクセスし、メールのリンクから会員登録画面に飛ぶ- 会員登録画面で登録処理実施
- ログイン画面でログイン処理実施(この認証をlaravel sanctumで実施している)
- ホーム画面で
fetchLoginUser()
関数でapi/user
を叩くと401エラーとなる
会員登録からログインまで実施でき、ユーザー情報を取得しようとしたところエラーとなる。
ゴールとしてはLaravel sanctumを利用してユーザー情報が取得できることを確認したい
コード
api.php
<?php use Illuminate\Http\Request; use Illuminate\Support\Facades\Route; use App\Http\Controllers\TestAPIController; use App\Http\Controllers\PreRegisterUserAPIController; use App\Http\Controllers\VerifyTokenController; use App\Http\Controllers\ArticleAPIController; use App\Http\Controllers\UserAPIController; use App\Http\Controllers\AuthAPIController; use App\Models\Article; Route::get('test', [TestAPIController::class,"index"]); //仮会員登録 Route::post('/user/pre_register', [PreRegisterUserAPIController::class, 'store']); // 仮会員登録のtoken確認 Route::get('/verify/{token}', [VerifyTokenController::class, 'index']); // 認証 Route::post('/login', [AuthAPIController::class, 'login']); Route::post('/logout', [AuthAPIController::class, 'logout']); // 会員情報 Route::post('/user', [UserAPIController::class, 'store']); Route::get('/user/{user_id}', [UserAPIController::class, 'show'])->middleware('auth:sanctum', 'loginUserCheck'); Route::put('/user/{user_id}', [UserAPIController::class, 'update'])->middleware('auth:sanctum', 'loginUserCheck'); Route::delete('/user/{user_id}', [UserAPIController::class, 'destroy'])->middleware('auth:sanctum', 'loginUserCheck'); // ユーザー情報の取得 Route::get('/user', function (Request $request) { return $request->user(); })->middleware('auth:sanctum');
AuthAPIController(ログインログアウト用のコントローラー)
php
1<?php 2 3namespace App\Http\Controllers; 4 5use Illuminate\Http\Request; 6use App\Http\Requests\AuthRequest; 7use App\Repositories\Auth\AuthRepository; 8 9class AuthAPIController extends Controller 10{ 11 private $auth_repository; 12 13 public function __construct(AuthRepository $auth_repository) 14 { 15 $this->auth_repository = $auth_repository; 16 } 17 18 public function login(AuthRequest $request) 19 { 20 return $this->auth_repository->login($request); 21 } 22 23 public function logout(Request $request) 24 { 25 return $this->auth_repository->logout($request); 26 } 27} 28
AuthRepository(ログイン、ログアウト処理)
php
1<?php 2 3namespace App\Repositories\Auth; 4 5use Illuminate\Support\Facades\Auth; 6 7 8class AuthRepository implements AuthInterface { 9 public function login($request){ 10 $credentials = $request->validate([ 11 'email' => ['required', 'email'], 12 'password' => ['required','min:8'], 13 ]); 14 15 if(Auth::attempt($credentials)){ 16 $request->session()->regenerate(); 17 return response()->messageAndStatusCode('ログインが完了しました。', 200); 18 } 19 20 return response()->messageAndStatusCode('ユーザーが見つかりません。', 404); 21 } 22 23 public function logout($request){ 24 Auth::logout(); 25 26 $request->session()->invalidate(); 27 28 $request->session()->regenerateToken(); 29 30 return response()->messageAndStatusCode('ログアウトが完了しました', 200); 31 } 32} 33
試したこと
- laravel sanctumの公式ドキュメントをもとに実装
- qiitaやzennの記事をもとに検証
- youtubeでlaravel sanctumのSPA認証方法を調査
補足情報(FW/ツールのバージョンなど)
laravelのversionは8系です
あなたの回答
tips
プレビュー