AngularJS的withCredentials未发送

5
在AngularJS中,我的Restful API在子域中,但是我遇到了一个问题,即cookie/session不能在不同的域之间共享。对于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');
        // https://dev59.com/yHVC5IYBdhLWcg3wbgdS#7605119
        header('Access-Control-Max-Age: 86400');
    }

}

现在我看到服务器说它将允许凭据,但在选项请求中没有发送。如下屏幕截图所示。 我做错了什么吗?
1个回答

11

默认情况下,在CORS预检OPTIONS请求中不会发送凭据。 请参见此处。 另请参阅answer。 凭证将在实际请求中发送。

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

一般来说,为了正确实现CORS,您的服务器不应要求在预检请求中提供凭据。(请注意,某些浏览器仍会发送它们,但不应该这样做。)这是因为OPTIONS请求被认为是“安全”的,不应包含任何机密信息。

可能问题出在您正在尝试跨域共享的cookie上。您试图在哪里发送哪些cookie?


我已经设置了SSO cookie分配。因此,我通过在会话ID检查之前进行CORS选项检查来解决了这个问题。如果是选项,则不会运行SSO的会话ID检查。否则,使用发送的cookie。 - Devin Dixon

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接