質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
Laravel

LaravelとはTaylor Otwellによって開発された、オープンソースなPHPフレームワークです。Laravelはシンプルで表現的なシンタックスを持ち合わせており、ウェブアプリケーション開発の手助けをしてくれます。

Redis

Redisは、オープンソースのkey-valueデータストアで、NoSQLに分類されます。すべてのデータをメモリ上に保存するため、処理が極めて高速です。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

Q&A

解決済

1回答

2259閲覧

【Laravel】sessionドライバーをredisにしたところ、cookieが生成されない。

hasshy

総合スコア102

Laravel

LaravelとはTaylor Otwellによって開発された、オープンソースなPHPフレームワークです。Laravelはシンプルで表現的なシンタックスを持ち合わせており、ウェブアプリケーション開発の手助けをしてくれます。

Redis

Redisは、オープンソースのkey-valueデータストアで、NoSQLに分類されます。すべてのデータをメモリ上に保存するため、処理が極めて高速です。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

0グッド

0クリップ

投稿2019/08/04 16:29

sessionドライバーをdatabase(MySQL)からRedisに変えました。
変えたところセッションの処理ができなくなっていました。

例えば、フォーム送信時のCSRF処理です。
セッションにCSRFトークンを保持できないので、フォームのPOST時に処理ができません。

変わったところといえば、cookieが作られなくなっていました。
databaseドライバーを使用していた時は、問題なく作られてセッションの処理ができていました。

Redisにドライバを変えたのが原因なのか、他に原因があるのかご教示ください。

変更内容

ドライバーを変更したいので、.env を下記のように変更して、redisの環境を追加しました。

sh

1-SESSION_DOMAIN=localhost 2-SESSION_DRIVER=database 3+SESSION_DOMAIN=redis 4+SESSION_DRIVER=redis

環境について

環境はDockerで構築しています。
ドライバーを有効にするため、redis用のコンテナを追加しました。

docker-compose

Laravelなので、appイメージはphp-fpmのコンテナです。

version: '3.7' services: app: ## アプリケーション用コンテナ build: ./docker/app volumes: - ./laravel-app:/var/www/ links: - redis redis: build: context: ./docker/redis args: REDIS_PASSWORD: ${REDIS_PROJECT_PASSWORD} command: redis-server --appendonly yes --requirepass (パスワード) ports: - 6379:6379 volumes: - redis-data:/data volumes: redis-data: driver: local

Dockerfile

redisのDockerfileは下記のように設定しています。
特に、特別な設定はしていないと思います。

FROM redis:5.0.5 ENV REDIS_PASSWORD (パスワード) CMD ["sh", "-c", "exec redis-server --requirepass \"$REDIS_PASSWORD\""]

エラーについて

POSTすると、CSRF token mismatchで処理できないことがわかりました。

問題の処理

VerifyCsrfTokenのhandle処理の中で、下記の2トークンを比較する処理があるのですが、
一致していないためでした。

  • sessionに保持している__token
  • Postされたtoken

php

1 protected function tokensMatch($request) 2 { 3 $token = $this->getTokenFromRequest($request); 4 return is_string($request->session()->token()) && 5 is_string($token) && 6 hash_equals($request->session()->token(), $token); 7 } 8

前述しましたが、ドライバーを変えた以外は特に変更していないため、
意図的に、sessionを更新させる処理は追加していません。

確認方法

何故、トークンが一致しないのか下記のようにして確認してみました。
また、redisのレコードが追加されているかも確認しました。

  1. POSTのリクエストをした際にdd($request->session()->token())で処理を止める
  2. リロードをしてトークンを確認

確認したところ、リロードをするたびにRedisにレコードが追加されて、トークン自体も常に変わっていました。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

SESSION_DOMAINはあくまで対象のドメインを指定するものなのでredisとするのは間違いなのでは・・?

投稿2019/08/05 00:12

m.ts10806

総合スコア80765

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

hasshy

2019/08/05 02:20

何時もありがとうございます。 おっしゃる通り、SESSION_DOMAINは対象のドメインですね。 REDIS_HOSTと混同してしまいました。 解決できました。 ご教示いただきありがとうございます。
m.ts10806

2019/08/05 02:22

解決されたようで何よりです。 が、REDIS_HOSTも結局HOSTなのでredisではなくlocalhostなどになるとは思います。
hasshy

2019/08/05 02:37

度々ありがとうございます。 説明不足で恐縮ですが、私の環境はREDIS_HOSTはredisで良さそうです。 docker-composのlinksでredisとしているので、locahostでは接続できませんでした。
m.ts10806

2019/08/05 02:42

了解です。(ちょっと調べた感じだとhost名指定しているところが多かったので、あくまでlocalhost”など”です)
hasshy

2019/08/05 03:09

お調べいただきありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問