Laravel

Laravel でSession cookie が設定できない – .env のSESSION_DOMAIN設定を修正

皆さまこんにちは、ウチイダです。

先日、新規開発でLaravelの初期セットアップをしていた時につまづいた内容をメモします。

今回の開発は、LaravelをバックエンドのAPI サーバーとして、React で作られたSPAをフロントエンドに配置する構成でした。

Vite で起動したローカルのReactアプリケーション(localhost:5173) から、Laravelが動いているDockerコンテナ(localhost:80)に向けてリクエストをしたところ、警告が発生しました。

ResponseのSet-Cookie で警告が表示

レスポンス自体はちゃんと受け取れているようですが、Set-Cookieのところに警告アイコンが表示されています。

⚠️のアイコンにマウスオンしてみると、以下のようなメッセージが。

This attempt to Set-Cookie header was blocked because its domain attribute was invalid with regards to the current host url

現在のURLに対して、Set-Cookie のドメイン指定が不正なので、Cookieが保存できない、といった警告です。

レスポンスの内容をよく見ると、Set-Cookieのドメインプロパティが確かにおかしいです。

domain=.localhost

localhostの先頭に、. がついています。.env ファイルでSESSION_DOMAIN=.localhost と設定していることが原因でした。

以下のように修正したところ、解消しました。

# SESSION_DOMAIN=.localhost . がついているとNG
SESSION_DOMAIN=localhost

本番環境では、ReactとLaravelをサブドメインに分けて配置して運用する想定だったので、CORS対策としてドメインの先頭に.をつけていました。

Set-Cookie ヘッダーのdomain プロパティで、先頭に . をつけてドメイン指定すると、サブドメイン間でCookieを共有できるようになります。

この先頭の . を、ローカル用の .env からとり忘れていたのが原因でした。

localhost の指定では、.がついているとドメインを正しく認識できず、動かなくなってしまうのです。

ローカル用とサーバーにデプロイして使う.env の内容を分けて管理しておく必要がありますね。

以上です。あなたのお役に立てればうれしいです。

Laravel sail で外部APIアクセスエラーする

こんばんは、ウチイダです。

先日お引き受けした案件で、Laravelから外部APIを利用する実装が必要になりました。

いつものように、ローカル環境のSailで動作確認しつつ実装していきます。

しかし、Httpファサードで外部APIにアクセスしようとするとResolving タイムアウトが発生してしまいました。

どうやら、名前解決に失敗しているみたいです。

Dockerネットワーク外のドメインの名前解決をするDNSが設定されていないことが原因だったので、Docker-compose.ymlに、dnsを設定しました。

# For more information: https://laravel.com/docs/sail
version: '3'
services:
    laravel.test:
				# (略)

        # 外部DNSを指定する
        dns: 8.8.8.8

いったんコンテナを再起動してDNSを認識できるようにしてからリトライ。

APIサーバを見つけて、レスポンスを取ることができました。

ちなみに、これに苦労してあれこれコントローラのアクションメソッドに書き散らかしてしまったので、その後サービスクラスに切り出すのにそこそこ苦労しました(現在進行形でしてます)。

思いがけない沼にはまると、設計やクラス分解がおろそかになりがちなので気を付けたいです。

以上です。

あなたのお役に立てれば幸いです。