在同一项目中的Django和django-rest-framework之间共享经过身份验证的用户

时间:2019-03-04 19:52:27

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

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

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

我设法使用request的{​​{1}}在其余的API上进行了身份验证,但这要求我必须以纯文本形式使用用户密码。当然,我可以创建一个技术用户来执行这些请求。但这也意味着每个请求都必须先通过身份验证,这似乎不是最好的方法。

我尝试从提供给视图的HTTPBasicAuth对象中提取会话cookie,并将其通过request传递,但没有设法将其放入requests.get中调用正确的方法。

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

1 个答案:

答案 0 :(得分:1)

您应该使用令牌。

基本上,django项目中进行的任何身份验证都应使用安全令牌进行管理。

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

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

DRF: Third party packages

我在许多项目中使用了knox,这很好。

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

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

Requests docs: Custom Headers