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

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

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

Vue.jsは、Webアプリケーションのインターフェースを構築するためのオープンソースJavaScriptフレームワークです。

Laravel

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

PHP

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

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

Q&A

解決済

1回答

4213閲覧

Laravel リクエスト時にCookie内のlaravel_sessionが変更されてしまう

hiroki88

総合スコア66

Vue.js

Vue.jsは、Webアプリケーションのインターフェースを構築するためのオープンソースJavaScriptフレームワークです。

Laravel

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

PHP

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

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

0グッド

1クリップ

投稿2021/01/05 02:31

(各バージョン)
laravel:6.18.40
PHP:7.2.31
nginx:1.19.0"

(やりたいこと)
apiを呼び出した時にlaravel_sessionの値が変更されないようにしたい。
ショッピングサイトを作成しているのですが会員登録をしていなくても購入できるように
sessionIDで購入者か判断したいのでsessionIDが変更されないようにしたいです。

(現状)
フロント側でaxiosでapiを呼び出しコントローラーで処理が行われレスポンスが返って来ています。
デベロッパーツールで確認してみるとリクエストとレスポンスで共にcookieはあるのですがcookieの中身が変わってしまっています。(全てのapi)
イメージ説明
以下に例として実装しているコードを記載します。内容としてはテーブルに登録されている商品を取得してページに反映させています。

↓フロント

vue

1<template> 2 ...省略 3</template> 4<script> 5 6export default{ 7 data(){ 8 return { 9 products: [] 10 } 11 }, 12 methods: { 13 async fetchProduct(){ 14 const response = await axios.get(`/api/product/?page=${this.page}`); 15 16 this.products = response.data.data; 17 } 18 }, 19 watch: { 20 $route: { 21 async handler(){ 22 await this.fetchProduct(); 23 }, 24 immediate: true 25 } 26 } 27} 28</script>

↓routes

php

1<?php 2 3use Illuminate\Http\Request; 4 5/* 6|-------------------------------------------------------------------------- 7| API Routes 8|-------------------------------------------------------------------------- 9| 10| Here is where you can register API routes for your application. These 11| routes are loaded by the RouteServiceProvider within a group which 12| is assigned the "api" middleware group. Enjoy building your API! 13| 14*/ 15 16// Route::middleware('auth:api')->get('/user', function (Request $request) { 17// return $request->user(); 18// }); 19 20//トップページ(商品一覧) 21Route::get('/product', 'Auth\ProductController@GetProductList')->name('product');

↓コントローラー(テーブルからデータの一覧を取得しjsonで返却しています。paginate使用しています。)

php

1<?php 2 3namespace App\Http\Controllers\Auth; 4 5use App\Http\Controllers\Controller; 6use Illuminate\Http\Request; 7use App\Models\Product; 8use Illuminate\Support\Facades\Auth; 9 10class ProductController extends Controller 11{ 12 /** 13 * Display a listing of the resource. 14 * 15 * @return \Illuminate\Http\Response 16 */ 17 public function GetProductList(Product $product) 18 { 19 $getData = null; 20 if(Auth::check()){ 21 $getData = $product 22 ->leftjoin('favorites', function($join){ 23 $join->on('product.id', '=', 'favorites.product_id') 24 ->where('favorites.login_id', '=', Auth::user()->login_id); 25 }) 26 ->select('product.*','favorites.login_id') 27 ->orderBy('product.created_at', 'asc') 28 ->paginate(); 29 }else{ 30 $getData = $product->orderBy('created_at', 'asc') 31 ->paginate(); 32 } 33 return $this->jsonResponse($getData); 34 } 35}

↓kernel.php

php

1<?php 2 3namespace App\Http; 4 5use Illuminate\Foundation\Http\Kernel as HttpKernel; 6 7class Kernel extends HttpKernel 8{ 9 /** 10 * The application's global HTTP middleware stack. 11 * 12 * These middleware are run during every request to your application. 13 * 14 * @var array 15 */ 16 protected $middleware = [ 17 \App\Http\Middleware\TrustProxies::class, 18 \App\Http\Middleware\CheckForMaintenanceMode::class, 19 \Illuminate\Foundation\Http\Middleware\ValidatePostSize::class, 20 \App\Http\Middleware\TrimStrings::class, 21 \Illuminate\Foundation\Http\Middleware\ConvertEmptyStringsToNull::class, 22 ]; 23 24 /** 25 * The application's route middleware groups. 26 * 27 * @var array 28 */ 29 protected $middlewareGroups = [ 30 'web' => [ 31 \App\Http\Middleware\EncryptCookies::class, 32 \Illuminate\Cookie\Middleware\AddQueuedCookiesToResponse::class, 33 \Illuminate\Session\Middleware\StartSession::class, 34 // \Illuminate\Session\Middleware\AuthenticateSession::class, 35 \Illuminate\View\Middleware\ShareErrorsFromSession::class, 36 \App\Http\Middleware\VerifyCsrfToken::class, 37 \Illuminate\Routing\Middleware\SubstituteBindings::class, 38 ], 39 40 'api' => [ 41 'throttle:60,1', 42 'bindings', 43 ], 44 ]; 45 46 /** 47 * The application's route middleware. 48 * 49 * These middleware may be assigned to groups or used individually. 50 * 51 * @var array 52 */ 53 protected $routeMiddleware = [ 54 'auth' => \App\Http\Middleware\Authenticate::class, 55 'auth.basic' => \Illuminate\Auth\Middleware\AuthenticateWithBasicAuth::class, 56 'bindings' => \Illuminate\Routing\Middleware\SubstituteBindings::class, 57 'cache.headers' => \Illuminate\Http\Middleware\SetCacheHeaders::class, 58 'can' => \Illuminate\Auth\Middleware\Authorize::class, 59 'guest' => \App\Http\Middleware\RedirectIfAuthenticated::class, 60 'signed' => \Illuminate\Routing\Middleware\ValidateSignature::class, 61 'throttle' => \Illuminate\Routing\Middleware\ThrottleRequests::class, 62 'verified' => \Illuminate\Auth\Middleware\EnsureEmailIsVerified::class, 63 ]; 64 65 /** 66 * The priority-sorted list of middleware. 67 * 68 * This forces non-global middleware to always be in the given order. 69 * 70 * @var array 71 */ 72 protected $middlewarePriority = [ 73 \Illuminate\Session\Middleware\StartSession::class, 74 \Illuminate\View\Middleware\ShareErrorsFromSession::class, 75 \App\Http\Middleware\Authenticate::class, 76 \Illuminate\Routing\Middleware\ThrottleRequests::class, 77 \Illuminate\Session\Middleware\AuthenticateSession::class, 78 \Illuminate\Routing\Middleware\SubstituteBindings::class, 79 \Illuminate\Auth\Middleware\Authorize::class, 80 ]; 81} 82

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

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

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

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

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

guest

回答1

0

ベストアンサー

セッション保持の方法がCookieになっているのではないでしょうか?

HTTPセッション 8.x (再翻訳中)Laravel

この場合、laravel_sessionが変化するのは避けられないと思います。fileセッションドライバーなどに変更したらどうでしょうか。

しかしながら、「sessionIDで購入者か判断したいのでsessionIDが変更されないようにしたいです」というコメントには違和感があります。購入者か否かの判断はセッションの中身を使って判断するもので、sessionIDによって判断するものではありません。

投稿2021/01/05 04:56

ockeghem

総合スコア11701

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

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

hiroki88

2021/01/05 12:44

ご回答ありがとうございます。 まだLaravelを触ったばかりで間違った質問かもしれませんがご容赦ください。 デフォルトでセッションドライバはfileになっていたのでstorage/framework/sessions配下にsessionが 保存されているのは分かっていたのですがcookieにもsessionIdが保存されていたのでどちらも同じものとして認識してしまっていました。 今挙動を確認したらstorage/framework/sessions配下に保存されたsessionはapiを叩いても変更されませんでした。 storage/framework/sessions配下に保存されたsessionはapiを叩いても変わらない認識でよろしいのでしょうか? またcookie側は毎回sessionIdは変更されstorage/framework/sessions側に登録されるsessionは変更されないのか教えて頂きたいです。
ockeghem

2021/01/05 13:20

セッションの中身は、アプリケーションから明示的に変更しない限り変更されません
hiroki88

2021/01/05 15:36

そうなんですね、理解いたしました。 ちなみにですがcookieの中のlaravel_sessionが毎回変更されるのはLaravel独自の挙動になるのでしょうか?
ockeghem

2021/01/06 00:13

Laravelあまり詳しくないのですが、以下の説明があるということは、毎回勝手に変更されるわけではない(変更されるとは限らない)と思います。 -- セッションIDの再生成は多くの場合、悪意のあるユーザーからの、アプリケーションに対するsession fixation攻撃を防ぐために行います。 Laravel Jetstream(和訳)を使用していれば、認証中にセッションIDは自動的に再生成されます。しかし、セッションIDを任意に再生成する必要があるのでしたら、regenerateメソッドを使ってください。 https://readouble.com/laravel/8.x/ja/session.html#regenerating-the-session-id
hiroki88

2021/01/06 01:22

かしこまりました。とても分かりやすく説明して頂きありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問