【问题标题】:AngularJS withCredentials Not SendingAngularJS withCredentials未发送
【发布时间】:2014-04-01 17:53:56
【问题描述】:

在 AngularJS 中,我在子域中有我的 Restful API,但我遇到了 cookie/会话没有跨域共享的问题。对于 Angular,我正在这样做:

app.config(['$httpProvider',
function($httpProvider) {
    $httpProvider.defaults.useXDomain = true;
    $httpProvider.defaults.withCredentials = true;
    delete $httpProvider.defaults.headers.common['X-Requested-With'];
}]);

当我使用 $http 发出请求时,我也在做

var object = {};

object.url = '/example'
object.withCredentials = true;

$http(object).success(object.success).error(object.error);

在我的服务器端我有:

if($_SERVER['REQUEST_METHOD']=='OPTIONS') {
    if(isset($_SERVER['HTTP_X_FOWARDED_HOST']) && !empty($_SERVER['HTTP_X_FOWARDED_HOST'])) {
        $origin=$_SERVER['HTTP_X_FOWARDED_HOST'];
    } else {
        $origin=$_SERVER['HTTP_ORIGIN'];
    }
    if(isset($_SERVER['HTTP_ACCESS_CONTROL_REQUEST_METHOD']) && ($_SERVER['HTTP_ACCESS_CONTROL_REQUEST_METHOD']=='POST' || $_SERVER['HTTP_ACCESS_CONTROL_REQUEST_METHOD']=='DELETE' || $_SERVER['HTTP_ACCESS_CONTROL_REQUEST_METHOD']=='PUT')) {
        header('Access-Control-Allow-Origin: '.$origin);
        header('Access-Control-Allow-Credentials: true');
        header('Access-Control-Allow-Headers:  *,X-Requested-With,Content-Type');
        //header('Access-Control-Allow-Headers: Content-Type');
        header('Access-Control-Allow-Methods: POST, GET, OPTIONS, DELETE, PUT');
        // http://stackoverflow.com/a/7605119/578667
        header('Access-Control-Max-Age: 86400');
    }

}

现在我看到服务器说它将允许凭据,但它没有在选项请求中发送。截图如下。

我做错了什么?

【问题讨论】:

    标签: javascript php ajax angularjs cors


    【解决方案1】:

    默认情况下,不会在 CORS 飞行前 OPTIONS 请求中发送凭据。 See here。另见answer。凭据将根据您的实际请求发送。

    此外,useXDomain 和 X-Request-With 标头实际上并未在当前版本的 Angular 中使用,因此这些行在您的 $httpProvider 配置中没有任何作用。所有 CORS 交互都由浏览器本身和您的服务器处理。

    一般来说,要正确实施 CORS,您的服务器不应该在预检请求中要求凭据。 (请注意,有些浏览器无论如何都会发送它们,但不应该发送它们。)这是因为 OPTIONS 请求被认为是“安全的”,并且不应包含任何机密信息。

    您的问题可能出在您尝试跨域共享的 cookie 中。您想将哪些 cookie 发送到哪里?

    【讨论】:

    • 我设置了 SSO cookie 分配。所以我通过在会话 ID 检查之前检查 CORS 选项来解决它。如果是选项,那么它不会为 SSO 运行会话 ID 检查。否则,使用发送的 cookie。
    猜你喜欢
    • 2012-11-24
    • 1970-01-01
    • 2012-12-06
    • 2014-07-16
    • 1970-01-01
    • 2018-04-01
    • 2015-10-24
    • 2012-04-25
    • 2014-09-08
    相关资源
    最近更新 更多