2014-10-29 262 views
0

什麼是正確支持REST端點basic authentication並使用XHR的方法?RESTful端點的身份驗證 - 基本身份驗證和XHR

我正在使用Django REST框架(DRF)創建一組REST端點。這些端點將由一個單頁面應用程序(SPA)通過一組XHR(AJAX)調用以及一個C++應用程序使用。 C++應用程序目前正在使用Qt框架。在Qt框架中,我使用QNetworkAccessManager以及QAuthenticatorauthenticationRequired信號在401響應中(我目前使用basic authentication)發出「無論何時最終服務器請求身份驗證」,我認爲這是由WWW-Authenticate標頭驅動的。

我想弄清楚如何在Django REST中設置身份驗證,以使我的SPA和C++應用程序開心。我發佈了這個問題:Why does SessionAuthentication in Django REST Framework Never Return HTTP401,我學到的是如果我將第一個認證類設置爲BasicAuthentication,我可以從DRF獲得401s(帶有WWW-Authenticate標頭)。但是,這會導致瀏覽器在收到401時彈出一個模態登錄對話框。

什麼是使瀏覽器很開心並提供帶有WWW-Authenticate標頭的401s的最佳方式?一個想法是對來自C++應用程序的請求使用一個Authentication類,對於來自瀏覽器的請求使用不同的Authentication類。在Chrome

登錄框: login_box

回答

0

如果客戶端知道該服務器需要的資源基本認證先驗,它可以包括與每個請求中的授權報頭,並避免接收與401(未授權)響應WWW授權標頭。

在客戶端(javascript和C++)上,將客戶端標識符(例如,如果客戶端代表用戶發出請求時的用戶名)和共享密鑰(例如密碼)連接爲<identifier>:<secret>,並且然後計算該文本的Base64編碼。包括Authorization頭所產生的文本的客戶端請求的值:

Authorization: Basic <Base64 encoded value> 
0

我最終解決的辦法,這是子類BasicAuthentication,並覆蓋authenticate_headerWWW-Authenticate頭只有在某些頭部返回401碼在請求中設置。任何需要401代碼的客戶端(例如C++應用程序)都要確保在它所做的所有請求中設置此標頭值。在DRF設置中,然後我將這個認證類設置爲第一類,然後把SessionAuthentication秒。