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のレコードが追加されているかも確認しました。
- POSTのリクエストをした際に
dd($request->session()->token())
で処理を止める - リロードをしてトークンを確認
確認したところ、リロードをするたびにRedisにレコードが追加されて、トークン自体も常に変わっていました。
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2019/08/05 02:20
2019/08/05 02:22
2019/08/05 02:37
2019/08/05 02:42
2019/08/05 03:09