让REST端点支持basic authentication并使用XHR的正确方法是什么?
我正在使用Django REST Framework(DRF)来创建一组REST端点。这些端点将由单页应用程序(SPA)通过一组XHR(AJAX)调用以及C ++应用程序使用。 C ++应用程序目前正在使用Qt框架。在Qt框架内,我使用QNetworkAccessManager和QAuthenticator。只要最终服务器请求身份验证,就会发出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类。
登录框:
答案 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>