2015-05-29 27 views
0

我目前正在構建基於Cordova和Ionic的移動應用程序。我正在處理第三方API(即它不能,也不會爲了這個應用程序而改變)。在Cordova/Ionic iOS應用程序中使用WWW-Authenticate處理HTTP 401

當應用程序的用戶未認證 - 是,如果他們的會話已過期或以其它方式 - 的API與HTTP響應401,與WWW-Authenticate頭。

在瀏覽器而開發,這是好的,但同時在iPhone上,或者在模擬器它不會出現,並且應用必須達到要求的超時時間。當達到該超時時間時,請求被取消。這意味着在JavaScript中,我們只需取回0的HTTP狀態,而沒有真實的數據來確定是否出現超時或認證問題。

目前,我已經採取了一些有教育意義的猜測,比如在超時發生時檢查手機是否具有連接性等,但這不是一個理想的解決方案,因爲用戶仍然需要等待超時,並且它並不總是正確。

如何檢查時,HTTP 401對話框出現,並期望得到響應?我需要能夠識別何時發生實際的401,以及何時請求超時。

如果在JavaScript中有一個方法可以完成,那就太棒了。本地解決方案也可以工作,無論是插件還是其他方式。

回答

0

好吧,我不知道爲什麼第三方API woudn't送你正常的HTTP錯誤代碼。如果你正在連接的API與使用$http您可以添加響應攔截到它,例如閱讀下一篇文章:

http://codingsmackdown.tv/blog/2013/01/02/using-response-interceptors-to-show-and-hide-a-loading-widget/

在接下來的錯誤處理程序代碼,您可以添加一些代碼來評估HTTP狀態代碼:

function error(response) { 
    // Added code for specific HTTP error codes 
    if (response.status === 401) { 
     console.log('Received 401'); 
    } 

    // get $http via $injector because of circular dependency problem 
    $http = $http || $injector.get('$http'); 
    if($http.pendingRequests.length < 1) { 
     $('#loadingWidget').hide(); 
    } 
    return $q.reject(response); 
} 

另見AngularJS documentation about interceptors

+0

在常規的瀏覽器不正常工作,因爲我已經嘗試過了 - 然而,在手機上,在應用程序內,我們永遠不會提示從401進入細節,因此請求結束達到超時,並被取消。攔截器在請求完成之後纔會觸發。到那個時候,它已經超時了,我們剩下的狀態爲0.狀態0可能來自一個*真實*超時,或者像這樣的認證失敗......或者甚至可能是其他事情。 – Seer

1

我在處理同一個問題。

問題是,當401被返回時,它有一個WWW-Authenticate件,它告訴瀏覽器彈出那個小彈出框讓你再試一次。這不是在iOS Web容器中處理的「正確」(取決於你猜的是誰),這導致Cordova永遠不會看到請求。 該科爾多瓦臭蟲記錄在這裏:https://issues.apache.org/jira/browse/CB-2415

我不明白這樣的重大問題尚未解決如何。但我相信它周圍有一些技術性問題。如果您查看更新,您會發現Tobias Bocanegra(https://github.com/tripodsan/cordova-ios/commit/5f0133c026d6e21c93ab1ca0e146e125dfbe8f7e)增加了一個「快速入侵」來解決問題。也許這會進一步幫助你。在我的情況下,這並沒有幫助我。

我在我的情況下做了一個臨時修復: 我將http請求傳遞給加載模式,它有一個取消按鈕。所以,取決於用戶,還是等待。這太可怕了,但它對我來說很合適。 (內部應用程序等)

相關問題