【Laravel】SSL通信に設定する/419エラーになったら確認すること
もくじ
cookieの確認
SSL通信に設定するとhttpsでのアクセスに限定し、cookieのsecure属性にチェックがつきます。
例えばLaravelの公式ドキュメントもSSL通信なので参考にしてcookieを見てみます。デベロッパーツールで確認できます。今回はChromeなのでF12
を押すかOption + ⌘ + i
を押します。
- Applicationタブを開きます
- cookieのURLを選択します
- secure属性を確認します
チェックがついていますね。SSL通信でありセキュアなことがわかります。
SSL通信の設定
LaravelをSSL通信の設定をします。下記のように追記または変更します。どちらか一方だけで大丈夫です。
パターンA:/config/session.php
を変更
'secure' => true,
開発環境だろうが本番環境だろうが、いついかなる時もSSL通信だ!って場合はこちらですね。
まぁローカルだとSSL通信は叶いませんが。
パターンB:.env
ファイルに追記
SESSION_SECURE_COOKIE=true
.env
ファイルを更新したらキャッシュをクリアします。
$ php artisan config:clear
本番環境ではSSL通信にするけど開発環境(ローカル)ではSSLにしないよ!って場合は環境変数で設定する必要があるので.env
ファイルを変更します。
その理由についてはこちら。
https
でアクセス
開発中だとhttps
にアクセスできないので、ここではngrokというサービスを利用します。
419エラーが返ってくる
IDパスワードを入力してログインするようなサイトの場合、SSLでアクセスすると419
エラーになります。
Laravelで419が返ってくる要因は、POST通信の際のCSRF(クロスサイトリクエストフォージェリ)対策ができていないことです。しかし、私の場合きちんと対策していたためなぜこのエラーになるのか不明でした。
信頼できるプロキシを指定
調べていくと、どうやらIPアドレスに対してプロキシの信頼が得られていないためにエラーとなって返ってくるようです。
全プロキシを指定
App\Http\Middlewar\TrustProxies.php
のTrustProxies
クラスで設定を変更します。
class TrustProxies extends Middleware { /** * The trusted proxies for this application. * * @var array|string */ protected $proxies = '*'; // ここ /** * The headers that should be used to detect proxies. * * @var int */ protected $headers = Request::HEADER_X_FORWARDED_ALL; }
全てのプロキシを信用するために*
を使います。
個別でプロキシを指定
信用できるプロキシが限定されていれば、IPアドレスで指定してもOKです。
class TrustProxies extends Middleware { /** * このアプリケーションで信用するプロキシ * * @var string|array */ protected $proxies = [ '192.168.1.1', '192.168.1.2', ]; /** * プロキシを検出するために使用するヘッダ * * @var int */ protected $headers = Request::HEADER_X_FORWARDED_ALL; }
これによりエラーもなく無事SSL通信になりました。
どなたかのお役に立てれば幸いです。
参考URL
Laravelでセッションの Cookie をセキュアに配信する - Larapet
HerokuにデプロイしたLaravelアプリのアセットのURLをhttpsにする手順 – hrendoh's tech memo