背景
開発時のみフロントエンドを別ホスト・ポートで動作し、クロスサイトでのリクエストを許可したい。本番には適用しない。
実装
CORS ヘッダを設定するミドルウェアを作成する。
クロスサイトで認証情報つき(withCredentials)リクエストをおこないたい場合は Access-Control-Allow-Origin: *
が許可されないため、リクエスト元のホスト名を入れて返している。
参考) Reason: Credential is not supported if the CORS header ‘Access-Control-Allow-Origin’ is ‘*’
namespace App\Http\Middleware;
use Closure;
use Illuminate\Http\Request;
use Symfony\Component\HttpFoundation\Response;
class Cors
{
public function handle(Request $request, Closure $next): Response
{
/** @var Response $response */
$response = $next($request);
if (env('APP_DEBUG') && $request->header('Origin')) {
$response->headers->set('Access-Control-Allow-Credentials', 'true');
$response->headers->set('Access-Control-Allow-Origin', $request->header('Origin'));
$response->headers->set('Access-Control-Allow-Methods', 'GET, POST, PUT, DELETE, OPTIONS');
$response->headers->set('Access-Control-Allow-Headers', 'Origin, Authorization, Accept, Content-Type, X-XSRF-Token');
$response->headers->set('Access-Control-Expose-Headers', 'Authorization');
}
return $response;
}
}
このミドルウェアを有効にする。
namespace App\Http;
use Illuminate\Foundation\Http\Kernel as HttpKernel;
class Kernel extends HttpKernel
{
...
protected $middleware = [
...
\App\Http\Middleware\Cors::class
];
...
}