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

时间:2013-06-06 10:59:56

标签: cookies angularjs xmlhttprequest cross-domain laravel

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

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

如何记住请求标头中包含的cookie?


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

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

记忆cookie由laravel在第一个响应头中发送。但是不会通过angular包含在下一个请求的标题中。为什么呢?

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

- chrome中的--disable-web-security选项)

记忆cookie由laravel在第一个响应标头中发送,并将通​​过angular在下一个请求的标头中发送。一切都好。


编辑2:
是否由我将响应标头中的cookie包含在请求标头中?如果是,为什么我不必在chrome中启用“--disable-web-security”选项来执行此操作?


我做错了什么?

谢谢!

1 个答案:

答案 0 :(得分: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;
}

希望有所帮助。