【问题标题】:Authentication of RESTful Endpoints - Basic Authentication and XHRRESTful 端点的身份验证 - 基本身份验证和 XHR
【发布时间】:2014-12-25 18:32:40
【问题描述】:

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

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

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

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

Chrome 上的登录框:

【问题讨论】:

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


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

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

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

      Authorization: Basic <Base64 encoded value>
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-01-28
        • 1970-01-01
        • 2018-10-15
        • 1970-01-01
        • 2012-10-02
        • 2021-06-20
        • 1970-01-01
        • 2011-01-12
        相关资源
        最近更新 更多