Laravel 7:为啥我的会话 cookie 没有在浏览器中设置?

Posted

技术标签:

【中文标题】Laravel 7:为啥我的会话 cookie 没有在浏览器中设置?【英文标题】:Laravel 7: Why isn't my session cookie getting set in a browser?Laravel 7:为什么我的会话 cookie 没有在浏览器中设置? 【发布时间】:2020-12-24 19:50:29 【问题描述】:

即使服务器响应包含正确的 Set-Cookie 标头,我的 Laravel 会话 cookie 也没有在浏览器中设置。 Laravel 服务器运行在 localhost:8000,客户端应用程序是 NuxtJS SPA,运行在 localhost:7000。

包含Set-Cookie的响应头如下:

HTTP/1.1 200 OK
Host: localhost:8000
Date: Sun, 06 Sep 2020 00:50:31 GMT
Connection: close
X-Powered-By: php/7.4.10
Cache-Control: no-cache, private
Date: Sun, 06 Sep 2020 00:50:31 GMT
Content-Type: application/json
Access-Control-Allow-Origin: *
Access-Control-Allow-Methods: POST, GET, OPTIONS, PUT, PATCH, DELETE
Access-Control-Allow-Headers: Access-Control-Allow-Headers, Origin, Accept, X-Requested-With, Content-Type, Access-Control-Request-Method, Authorization, Access-Control-Request-Headers, Set-Cookie
X-RateLimit-Limit: 60
X-RateLimit-Remaining: 59
Set-Cookie: dv_session=ifhSq8WFD2Upltr5v2bzNBgaA5xx3KiDVuMWuBge; expires=Sun, 06-Sep-2020 02:50:31 GMT; Max-Age=7200; path=/

通过邮递员发出同样的请求,cookie被保存:

所以,浏览器似乎忽略了“Set-Cookie”标头。

我的session.php文件如下:

<?php

return [
    'driver' => env('SESSION_DRIVER', 'redis'),
    'lifetime' => env('SESSION_LIFETIME', 120),
    'expire_on_close' => false,
    'encrypt' => false,
    'files' => storage_path('framework/sessions'),
    'connection' => env('SESSION_CONNECTION', null),
    'table' => 'sessions',
    'store' => env('SESSION_STORE', null),
    'lottery' => [2, 100],
    'cookie' => 'dv_session',
    'path' => '/',
    'domain' => "",
    'secure' => false,
    'http_only' => false,
];

为什么 cookie 保存在 Postman 中,却被浏览器忽略?

【问题讨论】:

当你说它没有设置你已经检查了你的 cookie 存储并且它根本不在那里? 正确。我可以在 API 调用的响应标头中看到“set-cookie”的值正确,但检查 cookie 存储时,它不存在。我试过使用 Chrome 和 Firefox。 此外,Chrome 并没有说 cookie 因任何原因被阻止 - 只是默默地失败 单击地址栏左侧的图标(显示“不安全”或带有挂锁图标的图标),然后从那里单击 cookie。确保您的 cookie 不在“阻止”部分。您也可以检查您的浏览器设置以确保您启用“第三方 cookie” 【参考方案1】:

您的问题在 chrome 和 safari 中运行。 Firefox 将与您合作。问题是 chrome 不允许来自 http 域的 cookie,这是您的本地主机。这是他们的最新版本之一。

您在生产中应该没问题,因为您将在那里拥有 https 证书。但是对于开发,您可以使用 firefox。

另一个解决方法是在 session.php 中将“安全”字段设置为 false。

'secure' => env('SESSION_SECURE_COOKIE', false)

起初这可以解决问题,但我个人决定转移到 Firefox,因为该技巧停止工作并且不得不“破解我的方式”解决此问题,因此更改浏览器进行开发更容易。

【讨论】:

我完全停止使用 Chrome。安全没问题。但它甚至不允许您使用不存在的 TLD,例如 .test 或 .dev。我们经常在开发环境中使用的那些。我改用 Pale Moon for dev,一个 Mozilla 的后代。对于 vueJs 开发者,FF 仍然是首选浏览器。 你好 Firefox【参考方案2】:

我在使用 REST api 时遇到了类似的问题。使用邮递员,我可以看到带有 httpOnly 标志的 cookie,但在浏览器中什么也没有。

我的解决方案是为请求正确设置 withCredentials 选项。 以下是更详细讨论的链接: Set-Cookie on Browser with Ajax Request via CORS

并在文件 config/cors.php 中将 laravel 变量 supports_credentials 更改为 true

【讨论】:

【参考方案3】:

就我而言,我在 config/session.php 中错误地设置了域

'domain' =&gt; env('SESSION_DOMAIN', env('APP_URL')),

【讨论】:

以上是关于Laravel 7:为啥我的会话 cookie 没有在浏览器中设置?的主要内容,如果未能解决你的问题,请参考以下文章

没有 cookie 的 Laravel 会话

为啥 jQuery 的 .ajax() 方法不发送我的会话 cookie?

Laravel cookie 会话生命周期

当会话 cookie 在 Laravel 中过期时重新加载站点

无法发送会话 cookie - 标头已发送 PHPUnit / Laravel

为啥 Postman 在我的 React 应用程序中接收到 express 会话 cookie 而不是我的 post 请求