2012-01-16 73 views
2

我有一個需要基本身份驗證的移動Web應用程序。我設法在不同域的服務器上使用Ajax調用基本身份驗證。但是,我的回覆有問題。從其他域返回請求的Ajax時設置cookie

通常情況下,會話ID將在通過設定cookie頭Ajax響應瀏覽器進行設置。我注意到這在成功驗證時不會發生。

我所做的是試圖通過讀取頭被返回的響應時手動設置cookie。我通過jQuerys jqxhr對象實現了這一點。令我驚訝的是,即使服務器指出會話ID已被返回,我也無法通過jqxhr在響應中看到任何設置的cookie頭。

這是跨域請求的預期行爲嗎?有些響應標題會丟失?這是瀏覽器的安全功能嗎?如果是這樣,你會建議如何解決這個問題(例如,返回正文中的會話ID,這是我不想要的,因爲我在支持中使用Shiro安全篩選器來處理此問題,但我不想要需要破解它)?

請幫忙

回答

0

你不能使用ajax來請求跨域uri。您必須實現您自己的服務器端代理,該代理將處理遠程認證服務器的請求/響應。它可以複製/粘貼響應,但必須與客戶端位於同一個域中。

餅乾同樣的事情,他們有他們可以讀/寫的域。

您將被授權只請求此代理。它也可以處理cookie創建過程,然後將cookie ID返回給客戶端。

對於(一個很簡單的)例子,在www.auth.com,你有這樣的web服務:

url : www.auth.com/auth 
@params : string uuid, string password 
@returns : int shiroSessionId // yes it's more complicated, but KISS for the example 

您應該創建,在www.mydomain.com/myAuth其wget的WWW的一類。使用相同的參數auth.com/auth服務,創造本地會話cookie

url : /myAuth 
@params : string uuid, string password 
@returns : int cookieId, -1 if login failed 

最後在www.mydomain.com/login.html,您將有以下JS調用(這裏的jQuery):

$.ajax(function() { 
    url : '/myAuth', 
    date : {uuid: inputUuid, password: inputPassword}, // provided by a form 
    success(cookieId) { 
    if(cookieId > 0) { 
     alert('logged with cookie '+getCookie(cookieId)); 
    } else { 
     alert('login failed'); 
    } 
    } 
}); 

希望它有幫助。

Regards

+0

他可能使用jsonp。 – ThatGuy 2012-01-16 23:31:25

+0

我在服務器端使用Allow-Origin標頭,以允許來自我的應用程序的跨域ajax請求。該應用程序將與手機差距打包並部署到移動設備上。因此,不會有任何服務器爲應用程序提供服務,它只會在移動設備上運行。由於PhoneGap只是將它打包爲在瀏覽器包裝中運行,因此跨域可能仍然適用 – rycfung 2012-01-17 05:05:55

+0

只要您的標頭Access-Control-Allow-Origin不是「*」,也可以使用。 – vaugham 2012-01-17 08:53:07