2012-02-04 261 views
9

我在Safari擴展中遇到以下問題。我要求用戶提供他們的Web服務的用戶名/密碼,併發送一個快速請求來驗證憑據是否正確。如果他們不這樣做,服務會以我認爲應該的方式迴應401。問題在於Safari似乎在我的javascript代碼可以處理它之前攔截此響應,顯示灰色的登錄框而不是讓我處理錯誤。如何防止Safari攔截對Ajax請求的401響應

我能做些什麼嗎?我正在使用js庫進行調用,但它在功能上等同於以下jQuery。

$.ajax({ 
    type: "GET", 
    url: url, 
    username: username, 
    password: password, 
    success: function() { /* handle success */ }, 
    error: function() { /* handle error */ } 
}); 

回答

4

據我所知(後有過這個問題,我自己)沒有辦法,你會得到Safari瀏覽器停止攔截401。如果這些發現是正確的,唯一的方法是創造性(讀取:錯誤)使用另一個錯誤代碼,例如403,或使用自定義的(見下文)。

當然,這裏假定您可以訪問更改從Web服務發送回來的狀態代碼(如果您也開發Web服務,這個問題還不完全清楚)。

403當然,真的說「你已經被認證,但沒有被授權訪問這個資源」,這是不正確的(因此「濫用」),但至少在瀏覽器中沒有副作用我知道。

400有時用作替代方法,但由於該方法(「錯誤請求」)實際上意味着表示HTTP協議錯誤,因此可能會導致副作用(從未見過或聽說過它發生過,但可能是它可能會導致某些未來瀏覽器或反劫持軟件啓動故障排除/診斷的過度幫助嘗試)。

412是我見過的使用(「先決條件失敗」)另一種選擇,但它實際上是爲了表明服務器沒有辜負先決條件要求集。或者你可以自己編寫非標準的4xx錯誤 - 例如: 461 - 這是允許的(注意,Twitter也有一個自定義420狀態代碼,例如)

+0

感謝您的詳細解答!我其實可以訪問該服務,因此我可以創建一個新端點來處理此問題。我想其他處於類似情況的人至少可以做一個超級黑客代理來解決這個問題。 – 2012-02-04 17:42:02

3

更正確的方法是繼續使用401作爲錯誤代碼,但不發送WWW-Authenticate頭球時憑據已發送但他們不正確。

不再觸發瀏覽器對話框,並允許您直接處理401

+2

未發送「WWW-Authenticate」標頭是錯誤的!將自定義值發送給瀏覽器無法解釋的「WWW-Authenticate」。這樣,瀏覽器將不會顯示登錄窗口。請參閱:http://stackoverflow.com/questions/1748374/http-401-whats-an-closed-www-authenticate-header-value – SimonSimCity 2014-04-10 07:34:15