我正在開發一個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/json
和Authorization: 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 ************************';
誰能給我提供任何瞭解什麼我可能會丟失這裏?
我做了很多更多的挖掘和代理請求,並意識到API的實現非常糟糕,完全不符合CORS。我能夠使用[Charles Proxy](http://www.charlesproxy.com/)重新編寫請求和響應標頭,至少我可以在本地進行開發。謝謝你的洞察力,因爲它確實讓我朝着正確的方向前進。 – 2014-09-30 20:34:32