2014-02-28 40 views
5

在AngularJS中,我在一個子域中使用了我的Restful API,但我遇到了Cookie /會話未在域間共享的問題。對於角度我這樣做:AngularJS withCredentials不發送

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'); 
    } 

} 

現在我看到服務器說它會允許憑證,但它不會在選項請求中發送。下面的截圖。

enter image description here 我在做什麼錯?

回答

11

默認情況下,憑證不會在CORS預購前的OPTIONS請求中發送。 See here。另見answer。憑據將根據您的實際要求發送。

另外,useXDomain和X-Request-With頭文件在當前版本的angular中並不實際使用,所以這些行在你的$ httpProvider配置文件中什麼也不做。所有的CORS交互都由瀏覽器本身和你的服務器來處理。

通常爲了正確地實現CORS,您的服務器不應要求預檢請求上的憑據。 (請注意,有些瀏覽器無論如何發送它們,但不應該)。這是因爲OPTIONS請求被認爲是「安全的」,絕不應包含任何機密信息。

這可能是你的問題是你試圖跨域分享的cookies。你想要發送什麼餅乾到哪裏?

+0

我有一個SSO cookie分配設置。所以我通過在會話ID檢查前檢查CORS Option來解決這個問題。如果是選項,則它不會運行會話ID檢查SSO。否則,請使用發送的cookie。 –