从 Django Rest Framework SIMPLE JWT 令牌(第 3 方)获取中间件中的用户名

Posted

技术标签:

【中文标题】从 Django Rest Framework SIMPLE JWT 令牌(第 3 方)获取中间件中的用户名【英文标题】:Get username in a middleware from Django Rest Framework SIMPLE JWT token (3rd party) 【发布时间】:2019-07-23 13:24:33 【问题描述】:

我正在使用 Django Rest Framework,并且包含一个名为 REST framework simple JWT Auth 的第 3 方包,它是引用的新框架, 还有这个REST framework JWT Auth,是旧的(我想象一下),因为github上很久没有更新,可能不支持新版本。

我正在寻找一种方法,例如 link on ***-3rd answer,通过中间件获取每个请求的用户信息,以便在需要时使用 django 信号在我的模型中应用/保存用户对象. 我检查了文档和互联网,但我没有找到任何东西。所以,如果你已经有了这个案例,我会很感激你的帮助。

谢谢

【问题讨论】:

【参考方案1】:

要从用户模型中获取用户名,您应该使用 request.user。这将为您提供经过身份验证的用户的请求信息。但是如果你使用simple_jwt,就不能直接在中间件中使用request.user,因为鉴权机制在view函数中起作用。

因此,您应该在中间件中手动进行身份验证,然后您可以使用 request.user 从用户模型中获取任何数据。

from rest_framework_simplejwt import authentication


class MyMiddleware():
    def __init__(self, get_response):
        self.get_response = get_response

    def __call__(self, request):
        response = self.get_response(request)
        return response

    def process_view(self, request, view_func, view_args, view_kwargs):
        request.user = authentication.JWTAuthentication().authenticate(request)[0]  # Manually authenticate the token

        print(request.user)  # Use the request.user as you want

【讨论】:

赞成成为唯一真正将用户置于请求对象上的人(因此是唯一正确的答案,IMO)。但是,值得注意的是,这应该被视为一种解决方法,因为它最终导致身份验证代码被调用两次......因此最好更改代码以在实际视图中而不是在中间件中执行所需的操作。

以上是关于从 Django Rest Framework SIMPLE JWT 令牌(第 3 方)获取中间件中的用户名的主要内容,如果未能解决你的问题,请参考以下文章

从 Django Rest Framework 响应中删除空字段

如何从 django-rest-framework 中的文件列表中过滤图像

Django - Rest Framework 多个模型

如何为 django-rest-framework api 编写单元测试?

使用 Django Rest Framework 将输入文件从 Vue.js 发送到 Django 时出现问题

Django Rest Framework:序列化程序响应错误