2013-07-25 103 views
10

我正在開發與安全.net服務器通信的PhoneGap應用程序。問題是,我似乎無法通過任何請求傳遞任何Cookie(W3C)。PhoneGap中的Cookie標題:拒絕設置不安全標題「Cookie」

這就是我正在做的事情(假設「用戶名」和「密碼」工作)。

var token;  
$.ajax({ 
     url: "https://server.com/AuthService/api/account/login", 
     crossDomain: true, 
     type: 'post', 
     async: false, 
     data: { 
      username: "username", 
      password: "password" 
     } 
    }).done(function(response) { 
     token = response.securityToken; 
     success = true; 
    }); 

在這一點上我有,我可以用它來驗證所有後續請求身份驗證令牌。因此,使用該令牌我再拍請求到服務器...

$.ajax({ 
    url: "https://server.com/Service/api/search?query=" + query, 
    headers: { Cookie: 'auth=' + token }, 
    crossDomain: true, 
    withCredentials: true, 
    type: 'POST', 
    async: false, 
    data: ' ' //because we don't want our request to be 0 bytes (the server is picky) 
}).done(function(data) { 
    result = data; 
}); 

鉻只是說:拒絕設定不安全頭「曲奇」(它遵循W3C規範)。該應用程序不會設置標題,因此不會發送請求401,因爲授權cookie不會發送。

我的問題是這樣的:有沒有什麼辦法來顛覆這個,並在PhoneGap上覆蓋Cookie標頭(或另一種方式去完全)?我知道使用授權標題也是一個選項,但我對服務器的訪問受限(不支持它),並希望得到更直接的解決方案。

紅利問題:對AuthService的調用也應該在設備上設置一個httpOnly cookie,但不會(我推測這是因爲它是跨域請求)......我在這個假設中是正確的,還是可以服務器端有問題嗎?

謝謝!

回答

5

簡短的回答是否定的,你不能設置Cookie頭。原因是Chrome是您的用戶代理,因此HTTP規範要求不允許修改具有安全隱患的標頭。

一個解決方案是執行一個操作,允許服務器在您的XmlHttpRequest對象上設置cookie。你說你已經試圖做到這一點,但它不起作用。我懷疑這是因爲您需要在您的ajax請求上設置Credentials。添加xhrFields屬性,如下所示。

var token;  
$.ajax({ 
    url: "https://server.com/AuthService/api/account/login", 
    crossDomain: true, 
    xhrFields: {withCredentials: true}, 
    type: 'post', 
    async: false, 
    data: { 
     username: "username", 
     password: "password" 
    } 
}).done(function(response) { 
    token = response.securityToken; 
    success = true; 
}); 

現在只要響應服務器不發送通配符作爲其CORS允許域(訪問控制允許來源),你應該得到的cookie。

+0

感謝您的回覆。我最終選擇了Authorization標頭,這對我的需求來說工作得很好! – evancohen

+0

謝謝,我正在用'Secure'和'httponly'屬性響應頭文件'Set-Cookie',然後在後續請求中發送正確的'Cookie'。我在兩者之間使用了'nginx'代理,它允許我設置需要Angular'$ http'的適當的'Access-Control'頭文件。 – sampoh

相關問題