登录后设置cookie失效,assets子域中间件读取token cookie为空问题
问题原因
- Cookie Domain未正确配置为支持子域名共享:当前设置Cookie时指定的Domain值为
project.test,虽然新浏览器规范下配置根域名默认允许子域名访问,但部分旧浏览器、Laravel默认Cookie配置逻辑可能需要显式声明允许子域名访问;如果config('app.frontend_url')配置错误、解析结果带前缀,也会导致Cookie仅能在project.test下生效,子域名assets.project.test无法读取。 - Cookie的SameSite、Secure属性配置不匹配:Laravel默认Cookie配置的
same_site值为lax,如果静态资源被跨站引用、本地开发用HTTP协议却开启了secure属性,都会导致Cookie不会随请求发送到assets.project.test。 - 跨域请求未开启凭证传输:设置Cookie的接口在
api.project.test域名下,如果前端调用该接口时没有开启withCredentials配置,浏览器会直接拒绝接收跨域响应的Set-Cookie头,导致Cookie根本没有写入浏览器。
解决方案
1. 修正Cookie的Domain配置
修改响应Cookie的代码,显式将Domain设置为开头带点的根域名.project.test,兼容所有浏览器的子域名共享规则:
protected function respondWithToken(string $token): JsonResponse { $expiresIn = auth('api')->factory()->getTTL() * 60; // 显式指定支持所有子域名的根域名 $cookieDomain = '.project.test'; // 如果需要从配置读取可改用下面的写法 // $cookieDomain = '.'.parse_url(config('app.frontend_url'), PHP_URL_HOST); return response() ->json([ "access_token" => $token, "token_type" => "bearer", "expires_in" => $expiresIn ]) ->withCookie('token', $token, $expiresIn, '/', $cookieDomain); }
2. 调整Cookie全局配置
在项目的config/session.php或config/cookie.php中调整配置:
- 本地开发使用HTTP协议时,将
secure设置为false,否则Cookie仅会在HTTPS请求下发送 - 将
same_site设置为lax即可满足同站子域名的Cookie传输需求,如果需要跨站使用可设置为none(注意设置为none时必须同时开启secure属性)
3. 修正跨域请求配置
- 前端调用
api.project.test/auth/login接口时必须开启withCredentials配置,Axios示例如下:
axios.post('http://api.project.test/auth/login', 请求参数, { withCredentials: true })
- 后端
api.project.test的CORS配置中,需要将Access-Control-Allow-Credentials设置为true,且Access-Control-Allow-Origin不能设置为*,必须显式指定允许的域名如http://project.test - 如果是通过JS主动请求
assets.project.test下的资源,也需要在请求配置中开启withCredentials: true,确保Cookie随请求发送
4. 验证Cookie写入状态
可以打开浏览器开发者工具的「Application/应用」面板,查看project.test域名下的Cookie列表,确认tokenCookie是否存在、Domain值是否为.project.test、过期时间是否正常。
内容的提问来源于stack exchange,提问作者thomas paulson
相关产品推荐
相关产品推荐

