前提・実現したいこと
現在LaravelとVue.jsを使ってAPI認証の学習をしているのですが、「CORSポリシーによってブロックされています」とのエラーが発生し一向に前に進めないため質問させていただきます。
laravel側でアクセス許可するオリジンを定義していてもずっと以下のエラーが発生しております。
解決方法をご存知の方、お手数ですがお力添えをお願いいたします。
発生している問題・エラーメッセージ
Access to XMLHttpRequest at 'http://localhost:8000/api/login' from origin 'http://localhost:8080' has been blocked by CORS policy: Response to preflight request doesn't pass access control check: The 'Access-Control-Allow-Origin' header has a value 'http://localhost:8000' that is not equal to the supplied origin.
該当のソースコード
Vue.js
Login.vue
javascript
1<template> 2 <div class=""> 3 {{ id }} 4 <from> 5 <input type="email" v-model="email"> 6 <input type="password" v-model="password"> 7 <button value="send" @click="login()">login</button> 8 </from> 9 <button value="send" @click="hoge()">hoge</button> 10 </div> 11</template> 12 13<script> 14import axios from 'axios' 15 16export default { 17 data () { 18 return { 19 id: 'hoge', 20 email: '', 21 password: '' 22 } 23 }, 24 methods: { 25 login: function () { 26 let param = {email: this.email, password: this.password} 27 28 const axiosPost = axios.create({ 29 xsrfHeaderName: 'X-CSRF-Token' 30 }) 31 const options = {headers: { 32 'mode': 'cors' 33 }} 34 35 axiosPost.post('http://localhost:8000/api/login', param, options 36 ).then(response => { 37 console.log(response) 38 }).catch(error => { 39 console.log(error) 40 }) 41 },
Laravel
api.php
php
1Route::group(['middleware' => ['cors']], function () { 2 Route::match(["post", "options"], "/hoge", "HomeController@hoge"); 3 Route::match(['post', 'options'], '/login', 'Api\V1\Auth\LoginController@login'); 4});
Cors.php
php
1<?php 2 3namespace App\Http\Middleware; 4 5use Closure; 6 7class Cors 8{ 9 /** 10 * Handle an incoming request. 11 * 12 * @param \Illuminate\Http\Request $request 13 * @param \Closure $next 14 * @return mixed 15 */ 16 public function handle($request, Closure $next) 17 { 18 return $next($request) 19 ->header('Access-Control-Allow-Origin', 'http://localhost:8080') 20 ->header('Access-Control-Allow-Methods', 'GET, POST, PUT, DELETE, OPTIONS') 21 ->header('Access-Control-Allow-Headers', 'Origin, X-Requested-With, Content-Type, Accept') 22 ->header('Access-Control-Allow-Credentials', 'true'); 23 } 24} 25
LoginController.php
<?php namespace App\Http\Controllers\Api\V1\Auth; use App\Http\Controllers\Controller; use Illuminate\Http\Request; use Illuminate\Support\Facades\Auth; use Illuminate\Http\JsonResponse; class LoginController extends Controller { public function login(Request $request): JsonResponse { $credentials = $request->only('email', 'password'); if (Auth::attempt($credentials)) { $user = Auth::user(); $token = $user->createToken('Laravel Password Grant Client')->accessToken; return new JsonResponse(['token' => $token], 200); } return new JsonResponse([ 'message' => 'Unauthenticated.' ], 401); } }
試したこと
####ログイン以外のAPI通信
レスポンスを返すだけのリクエストを行ったところ、正常に200が返ってきました
javascript
1 hoge: function () { 2 const axiosPost = axios.create({ 3 xsrfHeaderName: 'X-CSRF-Token' 4 }) 5 axiosPost.post('http://localhost:8000/api/hoge', { 6 headers: { 7 mode: 'cors' 8 } 9 }).then(response => { 10 console.log('hoge') 11 console.log(response) 12 })
php
1 public function hoge(Request $request) { 2 return response()->json($request); 3 }
axiosのヘッダー
以下の認証情報をリクエストするヘッダーを
axiosに追加しましたが、こちらは同様のエラーとなりました。
const axiosPost = axios.create({ xsrfHeaderName: 'X-CSRF-Token', withCredentials: true })
補足情報(FW/ツールのバージョンなど)
フロント
- Vue-cli
- axios
サーバー
- Laravel
- Laravel Passport
参考
あなたの回答
tips
プレビュー