2014-09-30 63 views
1

我正在開發一個iOS應用程序,它利用Cordova的Ionic框架並在我的開發週期中遇到了一些障礙。在我的本地開發Web服務器上運行時,即使通過Authorization標頭,任何從$ http服務發生的RESTful調用都將失敗,出現401未授權錯誤。有趣的是,一旦我構建應用程序並部署到iOS模擬器上,調用就可以正常工作。

FWIW,api調用是Atlassian Confluence api。

CORS似乎不是問題,因爲它已被配置,測試和處理未經認證的呼叫。

這裏是在瀏覽器內失敗,但在模擬器上工作使用相同的頭時,非常基本的呼叫:

$http.defaults.headers.common['Accept'] = 'application/json'; 
$http.defaults.headers.common.Authorization = 'Basic xxxxxxxxxxxxxx'; 
$http.get('https://www.example.com/rest/prototype/1/search/site?type=blogpost&spaceKey=TESTSPACE&os_authType=basic') 
    .success(function (data, status) { 
     this.serviceData = data; 
    }) 
    .error(function (data, status) { 
     console.log(status, data.result); 
    }); 

我派了兩個自定義標題:Accept: application/jsonAuthorization: Basic ***如果我運行的應用程序Chrome與上述服務配置,我看到以下請求頭。有一個增加了Access-Control-Request-Headers的提及Accept和Authorization頭,但是這些頭不在那裏。我看到下面的請求頭去跨線:

Accept:*/* 
Accept-Encoding:gzip,deflate,sdch 
Accept-Language:en-US,en;q=0.8,nl;q=0.6 
Access-Control-Request-Headers:accept, authorization <!---- This is added but there is no Authorization Header 
Access-Control-Request-Method:GET 
Cache-Control:no-cache 
Connection:keep-alive 
Host:www.example.com 
Origin:https://local.example-client.com 
Pragma:no-cache 
Referer:https://local.example-client.com/ 
User-Agent:Mozilla/5.0 (Macintosh; Intel Mac OS X 10_9_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/37.0.2062.94 Safari/537.36 

如果我就與授權頭使用Advanced Rest Client Chrome擴展程序相同的調用,它工作正常。

Accept:application/json <!----------- This one is */* when called from $http 
Accept-Encoding:gzip,deflate,sdch 
Accept-Language:en-US,en;q=0.8,nl;q=0.6 
Authorization:Basic *** REMOVED *** <!----------- This one is missing when called from $http 
Cache-Control:no-cache 
Connection:keep-alive 
Cookie: *** REMOVED *** 
Host:www.example.com 
Pragma:no-cache 
User-Agent:Mozilla/5.0 (Macintosh; Intel Mac OS X 10_9_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/37.0.2062.94 Safari/537.36 

有一點需要注意的是,如果我刪除授權頭線(如下圖),然後Accept頭現在看來:

//$http.defaults.headers.common.Authorization = 'Basic ************************'; 

誰能給我提供任何瞭解什麼我可能會丟失這裏?

回答

2

這可能是您的CORS配置的問題。經過身份驗證的請求需要非常具體的配置才能在CORS中正常運行。

確保您

(我不完全確定如果「授權」標題被視爲「憑證」如果你手工設置它,因此最後兩個可能或可能不需要。)

它的工作原理科爾多瓦下的原因是因爲科爾多瓦未實現XHR時出身的限制,因爲你的應用程序沒有按(他們會有點無意義沒有什麼「本地」可以溝通)

+1

我做了很多更多的挖掘和代理請求,並意識到API的實現非常糟糕,完全不符合CORS。我能夠使用[Charles Proxy](http://www.charlesproxy.com/)重新編寫請求和響應標頭,至少我可以在本地進行開發。謝謝你的洞察力,因爲它確實讓我朝着正確的方向前進。 – 2014-09-30 20:34:32

相關問題