Laravel 5.8 / VueJs 2 / Axios GET请求未发送cookie(CORS,子域)

时间:2019-11-01 18:42:56

标签: laravel cookies cors axios subdomain

设置

我们有一台服务器,其域为test.de,并且两个应用程序AB在同一服务器上但在子域上运行:

a.test.de
b.test.de

问题

AGET的API发送一个B请求,但是即使没有请求,它总是发送不带Cookie的请求。

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

我们尝试过的事情:

  • withCredentials: true根据请求
  • withCredentials在axios默认值上设置为true
  • laravel-cors软件包配置为尽可能宽松
<?php

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

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

2 个答案:

答案 0 :(得分:1)

似乎我们的服务器上存在权限问题,阻止了前端代码的更新,因此withCredentials选项未通过。

将来有这个问题的人:请阅读问题,您将看到我们尝试的事情。重要的是要了解,对于CORS,需要反复发送某些标头才能发送Cookie。

很抱歉。...

答案 1 :(得分:0)

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

<?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;
    }
}