【问题标题】:Laravel 5.8 / VueJs 2 / Axios GET request does not send cookies (CORS, subdomain)Laravel 5.8 / VueJs 2 / Axios GET 请求不发送 cookie(CORS,子域)
【发布时间】:2020-02-28 01:11:17
【问题描述】:

设置

我们有一个域为test.de 的服务器和两个应用程序A 和B 在同一台服务器上运行,但在子域上:

a.test.de
b.test.de

问题

A 向B 的API 发送GET-request,但它总是发送不带cookie 的请求,即使它应该发送。

因为端点受到保护,所以我们总是得到401 Unauthorized。对 B 上未受保护的端点的请求不会引起任何问题,因为它们不需要 cookie。

我们尝试过的事情:

  • withCredentials: true 应要求
  • withCredentials 在 axios 默认设置上设置为 true
  • laravel-cors 包配置尽量松散
<?php

return [
    'supportsCredentials' => true,
    'allowedOrigins' => ['*'],
    'allowedOriginsPatterns' => [],
    'allowedHeaders' => ['*'],
    'allowedMethods' => ['*'],
    'exposedHeaders' => [],
    'maxAge' => 0,
];

  • config/session.php 中的same_site 设置为null
  • 两个应用程序上的SESSION_DOMAIN 设置为.test.de
  • 设置 cors 标头的中间件(就像 laravel-cors 一样)
  • 在 Google Chrome、Safari、Firefox 上测试
  • 对站点内受保护端点的请求(因此 A->A 或 B->B)有效,因为发送了 cookie
  • 我们尝试了更多我不记得的东西,但如果它们弹出或在 cmets 中被提及,我们会继续添加

【问题讨论】:

  • 你试过中间件吗?如果你愿意,我可以给你一个答案
  • 你是什么中间件?我们有几个,但没有一个与问题相关。
  • 一个添加标题...(就像 laravel-cors 包一样)
  • 这真的很奇怪。从我的脑海中尝试一些事情:1.“test.de”作为域而不是“.test.de”2.尝试不同的浏览器,看看它是否在那里工作。 3. 如果这没有帮助,请发布 Chrome DevTools cookie 屏幕截图,可能 cookie 本身有问题(日期错误?计算机上的时间错误?)
  • 感谢@PavelLint,我们测试了不同的浏览器。从我读到的应该是.test.de,但我会尝试的。 cookie 设置正确,因为它适用于应用程序本身的受保护路由,但不适用于其他应用程序(我猜是由于 CORS)。

标签: laravel cookies axios cross-domain subdomain


【解决方案1】:

我们的服务器似乎存在权限问题,导致前端代码无法更新,因此withCredentials 选项未通过。

以后遇到此问题的人:请阅读问题,您将看到我们尝试过的事情。重要的是要了解对于 CORS,某些标头需要来回发送才能允许发送 cookie。

抱歉打扰了……

【讨论】:

    【解决方案2】:

    试试下面的中间件...如果没有帮助,我会删除答案;)

    <?php
    
    namespace App\Http\Middleware;
    
    use Closure;
    use Symfony\Component\HttpFoundation\StreamedResponse;
    
    class ModifyHeadersMiddleware
    {
        /**
         * Handle an incoming request.
         *
         * @param  \Illuminate\Http\Request  $request
         * @param  \Closure  $next
         * @return mixed
         */
        public function handle($request, Closure $next)
        {
            $response = $next( $request );
            if($response instanceof StreamedResponse) {
                $response->headers->set('Access-Control-Allow-Origin', '*' );
                $response->headers->set( 'Access-Control-Allow-Headers', 'Origin, X-Requested-With, Content-Type, Authorization, Accept, Application' );
                $response->headers->set( 'Access-Control-Allow-Methods', 'PUT, POST, GET, DELETE, OPTIONS' );
            } else {
                $response->header( 'Access-Control-Allow-Origin', '*' );
                $response->header( 'Access-Control-Allow-Headers', 'Origin, X-Requested-With, Content-Type, Authorization, Accept, Application' );
                $response->header( 'Access-Control-Allow-Methods', 'PUT, POST, GET, DELETE, OPTIONS' );
            }
    
            return $response;
        }
    }
    
    

    【讨论】:

    • 谢谢,但它仍然不发送任何 cookie。
    猜你喜欢
    • 2016-10-18
    • 2021-05-29
    • 2019-09-07
    • 2019-02-11
    • 2011-04-21
    • 2020-05-12
    • 2012-02-10
    • 2014-07-06
    相关资源
    最近更新 更多