Laravel 5.8 / VueJs 2 / Axios GET 请求不发送cookies(CORS,子域)
Laravel 5.8 / VueJs 2 / Axios GET request does not send cookies (CORS, subdomain)
设置
我们有一个域为 test.de
的服务器和两个应用程序 A
和 B
运行 在同一台服务器上但在子域上:
a.test.de
b.test.de
问题
A
向 B
的 API 发送一个 GET
请求,但它总是发送没有 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的中间件header(像laravel-cors应该)
- 在 Google Chrome、Safari、Firefox
上测试
- 对站点内受保护端点的请求(因此 A->A 或 B->B)有效,因为已发送 cookie
- 我们尝试了更多我不记得的东西,但如果它们弹出或在评论中提到,我们会继续添加
试试下面的中间件...如果没有帮助我会删除答案;)
<?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;
}
}
我们的服务器似乎存在权限问题,导致前端代码无法更新,因此 withCredentials
选项未通过。
以后谁有这个问题:请阅读问题,你会看到我们已经尝试过的东西。请务必了解,对于 CORS,某些 Headers 需要来回发送才能允许发送 cookie。
抱歉打扰了....
设置
我们有一个域为 test.de
的服务器和两个应用程序 A
和 B
运行 在同一台服务器上但在子域上:
a.test.de
b.test.de
问题
A
向 B
的 API 发送一个 GET
请求,但它总是发送没有 cookie 的请求,即使它应该发送。
因为端点是受保护的,所以我们总能得到 401 Unauthorized
回来。对 B
上不受保护的端点的请求不会导致任何问题,因为它们不需要 cookie。
我们尝试过的事情:
withCredentials: true
根据请求withCredentials
在 axios 默认值上设置为 truelaravel-cors
包配置尽可能松散
<?php
return [
'supportsCredentials' => true,
'allowedOrigins' => ['*'],
'allowedOriginsPatterns' => [],
'allowedHeaders' => ['*'],
'allowedMethods' => ['*'],
'exposedHeaders' => [],
'maxAge' => 0,
];
config/session.php
中的same_site
设置为null
- 两个应用程序上的
SESSION_DOMAIN
都设置为.test.de
- 设置cors的中间件header(像laravel-cors应该)
- 在 Google Chrome、Safari、Firefox 上测试
- 对站点内受保护端点的请求(因此 A->A 或 B->B)有效,因为已发送 cookie
- 我们尝试了更多我不记得的东西,但如果它们弹出或在评论中提到,我们会继续添加
试试下面的中间件...如果没有帮助我会删除答案;)
<?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;
}
}
我们的服务器似乎存在权限问题,导致前端代码无法更新,因此 withCredentials
选项未通过。
以后谁有这个问题:请阅读问题,你会看到我们已经尝试过的东西。请务必了解,对于 CORS,某些 Headers 需要来回发送才能允许发送 cookie。
抱歉打扰了....