AngularJS 和 Laravel - 跨域 CORS / XHR 请求缺少(记住)cookie

Posted

技术标签:

【中文标题】AngularJS 和 Laravel - 跨域 CORS / XHR 请求缺少(记住)cookie【英文标题】:AngularJS and Laravel - crossdomain CORS / XHR requests lacking (remember_) cookies 【发布时间】:2013-06-02 08:42:25 【问题描述】:

当我不使用 chrome 中的 --disable-web-security 选项时,我的 CORS / XHR 请求在请求标头中缺少 remember_xyz cookie。如果我启用该选项,remember_xyz cookie 将包含在请求标头中,并且一切正常。

作为解决方法,我目前正在通过基本身份验证标头发送身份验证凭据。但我认为这不是预期或正确的方式。

我怎样才能获得包含在请求标头中的记忆 cookie?

编辑: 在 chrome 的网络控制台中,我可以看到以下内容:

没有——chrome中的disable-web-security选项)

记住 cookie 由 laravel 在第一个响应头中发送。但不包含在下一个请求的标头中。为什么?

在实际请求触发之前,每个请求都有该 OPTIONS 预检请求。预检请求是否有可能以某种方式删除/破坏 cookie?

(with --disable-web-security chrome 选项)

remember cookie 由 laravel 在第一个响应头中发送,并将在下一个请求的头中通过 angular 发送。一切顺利。 编辑 2: 我是否可以将响应标头中的上述 cookie 包含到请求标头中?如果是,为什么我不必在 chrome 中启用“--disable-web-security”选项来执行此操作?

我做错了什么?

谢谢!

【问题讨论】:

【参考方案1】:

不确定我是否直接回答了你的问题,但我会试一试。您确实需要在客户端和服务器上为 CORS 设置某些标头。

客户端需要知道发送 Cookie 标头,否则会将其剥离。对于 jQuery,这意味着在您的 ajax 调用中设置 withCredentials 参数。查看更多信息here。这听起来像是您正在努力解决的问题。

在服务器端,您可能需要确保设置了pre-flight 请求。

例如,当我在 Laravel 4 中使用 CORS 时,我有一个过滤器来为每个响应添加一些标头:

App::after(function($request, $response)

    // Note that you cannot use wildcard domains when doing CORS with Authorization!
    $response->headers->set('Access-Control-Allow-Origin', 'http://dev.domain.local');
    $response->headers->set('Access-Control-Allow-Credentials', 'true');
    $response->headers->set('Access-Control-Allow-Headers', 'Authorization, X-Requested-With');
);

在控制器中,我还有一个 OPTIONS 请求响应飞行前请求。一个例子是:

public function optionsComplex()

    $response = Response::make(null, 200);
    $response->headers->set('Allow', 'GET, PUT, DELETE');
    $response->headers->set('Access-Control-Allow-Methods', 'GET, PUT, DELETE');
    return $response;

希望对您有所帮助。

【讨论】:

谢谢!毕竟我是这样做的。最近我发现了 barryvdh/laravel-cors,看起来效果很好。

以上是关于AngularJS 和 Laravel - 跨域 CORS / XHR 请求缺少(记住)cookie的主要内容,如果未能解决你的问题,请参考以下文章

AngularJS 中的跨域 HTTP 请求失败

AngularJS的$http的跨域问题

angularjs+webapi2 跨域Basic 认证授权

AngularJS实现跨域请求

跨域$http请求AngularJS

结合 AngularJS 和 Laravel 路由