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

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

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

HTTPにおけるCookieとは、クライアントのウェブブラウザ上に保存された一時的なデータを指します。クライアント側のJavaScriptでも、サーバー側のHTTPヘッダーでもクッキーの読み書き・修正・削除が可能です。

HTTPS

HTTPS(Hypertext Transfer Protocol Secure)はHypertext Transfer プロトコルとSSL/TLS プロトコルを組み合わせたものです。WebサーバとWebブラウザの間の通信を暗号化させて、通信経路上での盗聴や第三者によるなりすましを防止します。

Laravel

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

SSL

SSL(Secure Sockets Layer)とは、暗号化されたプロトコルで、インターネット上での通信セキュリティを提供しています。

Q&A

0回答

1897閲覧

LaravelシステムのHttps環境でsessionが使えない(session_secure_cookie)は一応書きました

tomoki_at

総合スコア6

Cookie

HTTPにおけるCookieとは、クライアントのウェブブラウザ上に保存された一時的なデータを指します。クライアント側のJavaScriptでも、サーバー側のHTTPヘッダーでもクッキーの読み書き・修正・削除が可能です。

HTTPS

HTTPS(Hypertext Transfer Protocol Secure)はHypertext Transfer プロトコルとSSL/TLS プロトコルを組み合わせたものです。WebサーバとWebブラウザの間の通信を暗号化させて、通信経路上での盗聴や第三者によるなりすましを防止します。

Laravel

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

SSL

SSL(Secure Sockets Layer)とは、暗号化されたプロトコルで、インターネット上での通信セキュリティを提供しています。

0グッド

1クリップ

投稿2021/04/06 11:09

編集2021/04/08 08:26

前提・実現したいこと

現在予約システムの開発中です
laravelで開発したシステムをSSL化したところsessionが使えなくなり下記のエラーが出ました
sessionを使うことがゴールです
http環境では問題なく使えていました
またlaravel/authのloginができないのもこの辺が問題なのかなと思っています

発生している問題・エラーメッセージ

Attempt to read property "変数名" on null
Request URL http://ドメイン名/line Method GET

個人的にhttpに今の挙動がhttps->http->https
というふうになってしまっているのかなと思ってます。そのためsessionがページ遷移ごとにきれ、使えてないということだと思います

該当のソースコード

getController

1$user = session()->get('user'); 2$calendarId = $user->calendar_id; <-ここでエラー発生

putController

1$request->session()->put('user', $user);

env

1APP_NAME=Laravel 2APP_ENV=production 3APP_KEY=******** 4APP_DEBUG=true 5APP_URL=https://ドメイン名 6 7BROADCAST_DRIVER=log 8CACHE_DRIVER=file 9QUEUE_CONNECTION=sync 10SESSION_DRIVER=file 11SESSION_LIFETIME=120 12SESSION_SECURE_COOKIE=true

session

1use Illuminate\Support\Str; 2return [ 3 'driver' => env('SESSION_DRIVER', 'file'), 4 'expire_on_close' => true, 5 'encrypt' => false, 6 'files' => storage_path('framework/sessions'), 7 'connection' => env('SESSION_CONNECTION', null), 8 'table' => 'sessions', 9 'store' => env('SESSION_STORE', null), 10 'lottery' => [2, 100], 11 'cookie' => env( 12 'SESSION_COOKIE', 13 Str::slug(env('APP_NAME', 'laravel'), '_').'_session' 14 ), 15 'path' => '/', 16 'domain' => env('SESSION_DOMAIN', null), 17 'secure' => env('SESSION_SECURE_COOKIE',true), 18 'http_only' => false, 19 'same_site' => 'none', 20]; 21

route

web

1//カレンダー ここではgoogleカレンダーの情報の取得とuser情報をデータベースから取得=>sessionとして保存 2Route::get('profile/{name?}/{id?}', 'calendar\CalendarController@calendar')->name('calendar'); 3 4//確認画面 ここでは予定のID,予約開始時間をsessionとして保存 5Route::post('/info/{name?}/{id?}','CheckController@check')->name('check'); 6 7//決算画面用 ここでは前のところで保存した、userと予定のIDをsessionから取得 8Route::get('/line','payController@pay')->name('getpay');

view

profile

1<form class="form" id="form" name="form" method="post" action="{{ route('check',[ 'name' => $user->name, 'id' => $user->id ]) }}"> 2 @csrf 3 <input type="hidden" value="{{ $end_time }}" name="start_date" /> 4 <input type="hidden" value="{{ $hour }}" name="start" /> 5 <input type="hidden" value="{{ $end_hour_array[$end_time] }}" name="finish" /> 6 <input type="hidden" value="{{ $calendar_Id[$end_time] }}" name="id" /> 7 <button>◎</button> 8</form>

info

1 <form method="get" action="{{ route('getpay') }}"> 2 @csrf 3 <input id="name" type="text" name="name" autocomplete="name" required> 4 <input id="tel" type="tel" name="tel" required> 5 <textarea id="comment" class="comment" name="comment" placeholder="その他記入欄"></textarea>

controller

CalendarController

1$user = User::where('id', $id)->first(); 2$request->session()->put('user', $user);

checkController

1$start = $request->input('start'); 2$finish = $request->input('finish'); 3$start_date = $request->input('start_date'); 4$scheduleId = $request->input('id'); 5$request->session()->put('start_date', $start_date); 6$request->session()->put('scheduleId', $scheduleId);
$user = session()->get('user'); $scheduleId = session()->get('scheduleId'); $request->session()->put('lesson_time', $request->input('lesson_time')); $request->session()->put('name', $request->input('name')); $request->session()->put('tel', $request->input('tel')); $request->session()->put('radio', $request->input('radio')); $request->session()->put('worry_comment', $request->input('comment')); $check = $this->CalendarCheck($user, $scheduleId);

Provider

AppServiceProvider

1public function boot(UrlGenerator $url) 2 { 3 // 4 $url->forceScheme('https'); 5 }

sessionが正しく機能した場合

_token xQaztDCWvbQ07VK4jZOjCiEOALg3rilSELE7MJ2e _previous { "url": "http://hogehoge/line?_token=xQaztDCWvbQ07VK4jZOjCiEOALg3rilSELE7MJ2e&comment=&name=a&radio=%E3%82%A2%E3%82%A4%E3%82%A2%E3%83%B3%E3%81%AE%E7%B2%BE%E5%BA%A6%E3%82%92%E3%81%82%E3%81%92%E3%81%9F%E3%81%84&rules=on&tel=0000000000" } _flash { "old": [], "new": [] } user { ユーザー情報(id,nameなどなど...) } start_date 2021-04-07-09-00 scheduleId ************** lesson_time 1 name 打ち込まれた名前 tel 打ち込まれた電話番号 worry_comment commentの内容

こんな感じになるはず(http環境ではなっていた)

現在sessionをみると

_token stv7ebsBna4fSyPq0uuJplS9FASEE1t8YNobygSU lesson_time name tel radio worry_comment

値は全部nullその前に保存してたものは項目すらない

アクセスログをchromeの開発者モードのnetwork>referを見るとちゃんとhttpsからになっている
またcookiesを見たがlaravel_session等はそもそも発行されていないor保存できていない
tinkerでファイルが動くかやると正常に動く
つまりサーバ間で何か起こってそう

確かにエラー画面でrequestを見るとhttp://ドメイン名/lineになっている
てかgetなのになんで?*******みたいになってないん?

またcsrf対策をすると419エラーが出てしまうため419対策を抜いてみたら、sessionが保存されていないことに気がついた

試したこと

SESSION_SECURE_COOKIE=true
を追加していなかったので追加
これでいけると思ったのが束の間できずに苦戦してます

AppServiceProvider.phpのbootに$url->forceScheme('https');を記述

補足情報(FW/ツールのバージョンなど)

laravel 6
PHP 8.0.3
docker 20.10.5
docker-compose 1.28
https://qiita.com/ucan-lab/items/5fc1281cd8076c8ac9f4#%E4%BD%BF%E3%81%84%E6%96%B9
基本的にこちらの記事を参考に作成

aws
lightsailを使用
OS ubuntu

よろしくお願いします

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

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

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

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

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

kyoya0819

2021/04/06 12:39

どのようにSSL/TLS化しましたか?
Lulucom

2021/04/07 00:01 編集

「発生している問題・エラーメッセージ」と「該当のソースコード」が合っていない気がしています。 そのエラーメッセージに続いて、エラー発生箇所等たくさんの情報が出力されていると思うのですが、正確なエラー発生箇所のコードを掲載可能でしょうか?
tomoki_at

2021/04/07 00:17

コメントありがとうございます 変数で使用していたところはsessionの値で、session確認してみると何一つとして保持されていなかったのでこのように書かせていただきました。 また現在の調べたところの僕の考え、これまでやったこと、少ないながらも書かせていただきました よろしくお願いします
Lulucom

2021/04/07 00:23 編集

> https->http となってしまっている箇所の詳しい情報も掲載されると良いかもしれません。例えばリンクでの遷移ならそのリンクを作成している箇所のコードとかでしょうか。
tomoki_at

2021/04/07 00:34

コメントありがとうございます 確かにそうですね!ご丁寧にありがとうございます 見にくいかもしれませんが、web.php , 情報を送信したform追記させていただきました
Lulucom

2021/04/07 01:50

.envファイルやconf/配下のファイルを変更後は、php artisan config:clear を実行したほうが良いと思いますが、それでも変わらないでしょうか。
tomoki_at

2021/04/07 02:04

php artisan config:clear php artisan config:cache ブラウザのキャッシュの削除 こちら試してみましたが変化なしです
Lulucom

2021/04/07 02:12 編集

そうですか・・・ありがとうございます。 ちなみに、php artisan config:cache はクリアだけでなくキャッシュを行いますので、設定が確定しないうちは実行しない方が良いと思います。クリアだけなら php artisan config:clear にしておきましょう。
tomoki_at

2021/04/07 02:37

そうなんですね、ありがとうございます ちなみにこれは他にエラーの原因を考えた方がいいのでしょうか?
Lulucom

2021/04/07 02:40

うーん・・・他の問題が絡んでそうでよくわからないですね。 > csrf対策をすると419エラーが出てしまうため419対策を抜いてみたら CSRF対策をしないのはまずいとは思います。
tomoki_at

2021/04/07 02:55

Csrfで、419がでていたのでとりあえず原因の切り分けのために抜いただけなのでこの問題解決したら戻す予定です
Lulucom

2021/04/07 03:11

フローがわかるように、実際のクラス名やファイル名で書く等もう少し具体的に書いたほうが良いのではないでしょうか。 例えば、掲載されているformのコメントでは「ここのformで投げた情報をsessionに記録して使いたい」と書かれていますが、リクエスト先のルート getpay のコントローラ(それがgetControllerと書かれているコントローラのことかと思うのですが)のコードではセッションから値を取得しており、コメントと合っていない気がしています。
tomoki_at

2021/04/07 03:46

長くなってしまいましたが、一通りフローを掲載しました それなりに詳しく書いたので、よろしければご確認お願いします
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだ回答がついていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問