Laravelでクロスオリジン(CORS)に対応するために「barryvdh/laravel-cors」を使ってみましょう。この記事では「barryvdh/laravel-cors」の導入方法と適切な設定について解説します。
Contents
barryvdh/laravel-corsを導入
comoserでインストール
comoserで「barryvdh/laravel-cors」を入れていきます。
1 | $ composer require barryvdh/laravel-cors |
Laravelのバージョンが5.5未満の場合にはバージョンを指定します。
1 | $ composer require barryvdh/laravel-cors:0.11.0 |
Middlewareに追加
「app/Http/Kernel.php」の「$middleware」に「\Barryvdh\Cors\HandleCors::class」を追加します。
16 17 18 19 20 21 22 23 | protected $middleware = [ \App\Http\Middleware\TrustProxies::class, \App\Http\Middleware\CheckForMaintenanceMode::class, \Illuminate\Foundation\Http\Middleware\ValidatePostSize::class, \App\Http\Middleware\TrimStrings::class, \Illuminate\Foundation\Http\Middleware\ConvertEmptyStringsToNull::class, \Barryvdh\Cors\HandleCors::class, ]; |
APIのみにCORSを設定する場合などは$middlewareGroupsのapiに追加します。
configファイルを作成
下記コマンドを実行します。
1 | $ php artisan vendor:publish --provider="Barryvdh\Cors\ServiceProvider" |
「vendor/barryvdh/laravel-cors/config/cors.php」を元に「config/cors.php」が作成されます。
CORSのための設定
生成された「config/cors.php」はデフォルトの設定なので編集していきます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 | <?php return [ /* |-------------------------------------------------------------------------- | Laravel CORS |-------------------------------------------------------------------------- | | allowedOrigins, allowedHeaders and allowedMethods can be set to array('*') | to accept any value. | */ 'supportsCredentials' => false, 'allowedOrigins' => ['*'], 'allowedOriginsPatterns' => [], 'allowedHeaders' => ['*'], 'allowedMethods' => ['*'], 'exposedHeaders' => [], 'maxAge' => 0, ]; |
supportsCredentials
Cookie、承認ヘッダー、または TLS クライアント証明書などの許可設定です。
デフォルトは無効になります。
allowedOrigins
許可するアクセス元の指定です。デフォルトは全てになっているので注意!
1 | 'allowedOrigins' => env('APP_ENV', 'production') === 'production' ? [env('APP_FRONT_URL')] : ['*'] |
上記のように本番環境以外では全て許可などにすると開発しやすいかも?その場合には.envに許可するURLを入れておきます。
allowedOriginsPatterns
allowedOriginsをパターン(正規表現)で指定することができます
allowedHeaders
許可するヘッダーを指定します。
allowedMethods
許可するHTTPメソッドを指定します。デフォルトは全て許可(*)です。
配列で複数を指定になっています。
1 | 'allowedMethods' => ['GET', 'PUT'], |
exposedHeaders
レスポンスに含めるカスタム HTTP ヘッダ (デフォルトは含まれるヘッダ無し)
maxAge
キャッシュの有効期限の設定です。
秒数で指定します。
動作を確認
curlでリクエストして確認を行いましょう。
Originの指定で許可しているドメインからのアクセスを確認することができます。
アクセスできる場合
許可されているリクエストだった場合 200 OKが返ります。
1 2 3 4 5 6 7 8 9 10 11 | $ curl -X GET -I -H "Origin: http://example.com" http://localhost:8000 HTTP/1.1 200 OK Host: localhost:8000 Date: Sun, 06 Oct 2019 01:20:12 +0000 Connection: close X-Powered-By: PHP/7.2.11 Cache-Control: no-cache, private Date: Sun, 06 Oct 2019 01:20:12 GMT Content-Type: text/html; charset=UTF-8 Access-Control-Allow-Origin: http://example.com Vary: Origin |
アクセスできない場合
許可されてないリクエストだった場合 403 Forbiddenが返ります。
1 2 3 4 5 6 7 8 9 | $ curl -X GET -I -H "Origin: http://example.jp" http://localhost:8000 HTTP/1.0 403 Forbidden Host: localhost:8000 Date: Sun, 06 Oct 2019 01:34:17 +0000 Connection: close X-Powered-By: PHP/7.2.11 Cache-Control: no-cache, private Date: Sun, 06 Oct 2019 01:34:17 GMT Content-type: text/html; charset=UTF-8 |