【问题标题】:Sharing authenticated users between Django and django-rest-framework in the same project在同一项目中的 Django 和 django-rest-framework 之间共享经过身份验证的用户
【发布时间】:2019-07-26 04:45:10
【问题描述】:

我有一个 Django 项目,最终将包含三个应用程序。其中两个是“普通”的 Django 应用程序,第三个是 djangorestframework 应用程序。我还计划在某个时候为该项目创建一个桌面客户端。
我希望其余应用程序成为与数据库通信的唯一实体。因此,我使用requests 从“普通”Django 应用程序的视图中与其余端点进行通信,我将对桌面客户端执行相同的操作。
我希望所有应用程序都只能供经过身份验证的用户访问,所以我'正在使用 Django 的身份验证后端。

我的问题是,当在视图中使用 requests 时,如何将经过身份验证的用户/会话从纯 Django 应用程序传递到其余端点。

我设法使用requestHTTPBasicAuth 在其余API 上进行身份验证,但这需要我手头有明文形式的用户密码。当然,我可以创建一个技术用户来执行这些请求。但这也意味着每个请求都需要先通过身份验证,这感觉不是最好的方法。

我试图从提供给视图的request 对象中提取会话cookie,并通过requests.get 传递它,但未能以正确的方式将其放入requests.get 调用中。

到目前为止,使用请求和已建立的会话似乎是我最好的选择,尤其是因为桌面客户端也将采用这种方式。因此,我目前正在寻找向requests.get 提供会话cookie 的正确方法,但我当然愿意寻求更好的解决方案。

【问题讨论】:

    标签: python django django-rest-framework python-requests


    【解决方案1】:

    你应该使用令牌。

    基本上,您的 django 项目之外的任何类型的身份验证都应该使用安全令牌进行管理。

    是的,每次发送请求时都应该进行身份验证检查。为了使其更快,您可以将令牌存储在内存中。 (您可以使用 redis,甚至可以将数据库加载到内存或 ...)但这是正确且常见的方法。甚至 django 每次使用它的内置函数都会进行此项检查。

    DRF 文档推荐了一些软件包来管理这些令牌:

    DRF: Third party packages

    我在很多项目中都使用了knox,它非常好。

    基本上,要对您的所有项目或微服务的用户进行身份验证,您必须从用户那里获取令牌,将其设置为标头或 ... 用于您对主数据库或身份验证项目的请求。

    大多数应用都在标头中使用令牌,您可以简单地将其添加到所有 requests 调用中:

    Requests docs: Custom Headers

    【讨论】:

    • 感谢您的回复。我阅读了有关令牌身份验证的信息,但对使用它感到不舒服,因为我还没有充分研究它以完全理解它是如何工作的。我一定会试一试的。是的,每个请求都需要进行身份验证检查。我的意思是,使用 BasicAuth,用户将对每个请求进行(重新)身份验证,而使用会话(或令牌)将归结为检查提供的会话(或令牌)是否有效。
    • 好吧,也许感觉不舒服,但这是每个人都在使用的。您可以查看一些适用于大公司和其他开源项目的 API 以获得更好的想法,但如果不是唯一正确的方法,这也是最好的方法。
    • 是的,似乎正在做我需要做的事情。再次感谢。
    猜你喜欢
    • 2013-04-22
    • 2013-05-03
    • 1970-01-01
    • 2019-03-12
    • 1970-01-01
    • 2014-06-07
    • 2019-07-06
    • 2021-09-09
    • 2019-06-25
    相关资源
    最近更新 更多