Next.js Larvelを使用してSPAを開発しています。
LaravelはAPIサーバーとしてREST APIでの値受け渡しをしております。
GETでの値取得はできましたが、POST、PUT、DELETEといった処理がうまく動作しません。
Laraveはのバージョンは8.1を使用しています。
また、ログイン認証関連でsanctumを使用しました。
この辺も影響しているのかな?とも思います。
ご教授いただけますと幸いです。
Next側
front/pages/top.js
1const Axios = axios.create({ 2 xsrfHeaderName: 'X-CSRF-Token', 3 withCredentials: true, 4 headers: { 5 'content-type': 'application/json' 6 } 7}) 8 await Axios 9 .put('http://127.0.0.1:8000/api/test/000001', data) 10 .then((res) => { 11 console.log(res.data) 12 }) 13 .finally(()=>{ 14 setRegister(false) 15 setOpen(false) 16 }) 17
Laravel側
routes/api.php
1Route::apiResource('test', TestController::class); 2
controllers/TestController.php
1public function update(EmployeeRequest $request, $id) 2 { 3 // 更新 4 $test = Test::find($id); 5 $test->update($request->all()); 6 return new TestResource($test); 7 } 8
php artisan route:list | PUT|PATCH | api/test/{test} | test.update | App\Http\Controllers\TestController@update | api
kernel.php
1'api' => [ 2 \App\Http\Middleware\VerifyCsrfToken::class, ⇦追加 ※追加する前は419エラーが出ていた(内容:csrf token mismatch) 3 \Laravel\Sanctum\Http\Middleware\EnsureFrontendRequestsAreStateful::class, ⇦sanctum使用時に追加 4 'throttle:60,1', 5 \Illuminate\Routing\Middleware\SubstituteBindings::class, 6 ],
Controllers/Auth/Logincontroller.php
1 public function login(Request $request): JsonResponse 2 { 3 $credentials = $request->validate([ 4 $this->username() => 'required', 5 'password' => 'required', 6 ]); 7 8 $credentials = $request->only($this->username(), 'password'); 9 10 if (Auth::attempt($credentials)) { 11 $request->session()->regenerate(); 12 return response()->json(Auth::user()); 13 } 14 15 throw new Exception('ログインに失敗しました。再度お試しください'); 16 }
当初のエラー
local.ERROR: Session store not set on request. {"exception":"[object] (RuntimeException(code: 0): Session store not set on request
現在のエラー(ブラウザのコンソール)
{message: "CSRF token mismatch."} message: "CSRF token mismatch."
記事
- sanctum導入時
https://yutaro-blog.net/2021/09/07/nextjs-laravel-sanctum-spa/
- 419のtoken mismatch が出た時
LoginController.php
1public function login(Request $request): JsonResponse 2 { 3 $credentials = $request->validate([ 4 'id => 'required', 5 'password' => 'required', 6 ]); 7 8 $credentials = $request->only('EM_FIKSID', 'password'); 9 10 if (Auth::attempt($credentials)) { 11 $request->session()->regenerate(); 12 return response()->json(Auth::user()); 13 } 14 15 throw new Exception('ログインに失敗しました。再度お試しください'); 16 }
pages/login.js
1const handleClick = () => { 2 const Data = { params: { 'id': id, 'password': password }} 3 axios 4 // CSRF保護の初期化 5 .get('http://127.0.0.1:8000/sanctum/csrf-cookie') 6 .then((res) => { 7 // ログイン処理 8 console.log(res) 9 axios 10 .post( 11 'http://127.0.0.1:8000/login', 12 Data, 13 ) 14 .then((res) => { 15 console.log(res) 16 }) 17 .catch((err) => { 18 console.log(err) 19 }) 20 }) 21 }
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
退会済みユーザー
2022/03/09 09:02
退会済みユーザー
2022/03/09 12:46
2022/03/11 10:51
退会済みユーザー
2022/03/11 12:49 編集
2022/03/11 13:53
退会済みユーザー
2022/03/13 12:55 編集
退会済みユーザー
2022/03/14 06:09 編集
2022/03/14 08:38