RESTful端点的身份验证 - 基本身份验证和XHR

时间:2014-10-29 21:12:41

标签: django rest django-rest-framework django-authentication

让REST端点支持basic authentication并使用XHR的正确方法是什么?

我正在使用Django REST Framework(DRF)来创建一组REST端点。这些端点将由单页应用程序(SPA)通过一组XHR(AJAX)调用以及C ++应用程序使用。 C ++应用程序目前正在使用Qt框架。在Qt框架内,我使用QNetworkAccessManagerQAuthenticator。只要最终服务器请求身份验证,就会发出authenticationRequired信号"我相信它是由401响应中的WWW-Authenticate标头驱动的(我目前正在使用basic authentication)。

我正在试图弄清楚如何在Django REST中设置身份验证,以使我的SPA和C ++应用程序都满意。我发布了这个问题:Why does SessionAuthentication in Django REST Framework Never Return HTTP401我学到的是如果我将第一个Authentication类设置为WWW-Authenticate,我可以从DRF获得401s(带BasicAuthentication标题)。但是,这会导致浏览器在收到401时弹出模态登录对话框。

让浏览器满意并为401提供WWW-Authenticate标头的最佳方法是什么?一个想法是对来自C ++应用程序的请求使用一个Authentication类,对浏览器的请求使用不同的Authentication类。

Chrome上的

登录框: login_box

2 个答案:

答案 0 :(得分:1)

我最终解决此问题的方法是继承BasicAuthentication并覆盖authenticate_header,只有在设置了某个标头时,才会返回带有401标头的WWW-Authenticate代码请求。任何需要401代码的客户端(例如C ++应用程序)都要确保在它所做的所有请求中设置此标头值。在DRF设置中,我然后将此身份验证类设置为第一个类,然后将SessionAuthentication设置为第二个。

答案 1 :(得分:0)

如果客户端事先知道服务器需要对资源进行基本身份验证,则可以在每个请求中包含Authorization标头,并避免使用WWW-Authorization标头接收401(未授权)响应。

在客户端(javascript和c ++)上,连接客户端标识符(例如,客户端代表用户发出请求时的用户名)和共享密码(例如密码){{1}然后,计算此文本的Base64编码。在客户端请求的Authorization标头中包含结果文本的值:

<identifier>:<secret>