DRF: 如何将django-rest-framework-jwt集成到Djoser中?

10

我计划使用 Django Rest Framework 构建一个应用程序。我更喜欢使用 Django-Rest-Framework-JWT 身份验证机制,而不是 SessionToken 身份验证机制。

但其他所有的包,如 Django-Rest-AuthDjoser(用于注册过程),都使用 Session 和 Token 身份验证系统。

我该如何使用 Django-Rest-Framework-JWT 重写 DjoserDjango-Rest-Auth 中的 Token 身份验证机制呢?

1个回答

20

我知道这个问题已经有一年了,但是我刚刚想到如何让 Djoserdjango-rest-knox 协同工作,并且确实同样的技巧也适用于 djangorestframework-jwt。 诀窍是知道您可以在不使用其认证相关端点的情况下使用Djoser的帐户端点,您只需要将每个库放在其自己的端点上。

这里是我如何设置Django Rest Framework使用JWT登录并对Djoser端点进行身份验证的方式(我将从头开始):

首先,安装 djangorestframework-jwtdjoser

pip install djangorestframework-jwt djoser
在Django项目的settings.py中将JSONWebTokenAuthentication添加到DEFAULT_AUTHENTICATION_CLASSES以指定您想要使用JWT进行身份验证:
REST_FRAMEWORK = {
    'DEFAULT_PERMISSION_CLASSES': (
        'rest_framework.permissions.IsAuthenticated',
    ),
    'DEFAULT_AUTHENTICATION_CLASSES': (
        'rest_framework_jwt.authentication.JSONWebTokenAuthentication',
    ),
}

接下来,将djoser.urlsrest_framework_jwtobtain_jwt_token视图添加到您的URL中:

from django.conf.urls import url, include
from rest_framework_jwt import views as jwt_views

urlpatterns = [
    url(r'^account/', include('djoser.urls')),
    url(r'^auth/login/', jwt_views.obtain_jwt_token, name='auth'),
]

这应该是你开始的所有内容。为了安全起见,请运行 migrate(我为这篇文章创建了一个全新的Django Rest Framework实例,并且在此之前尚未运行初始提交):

python manage.py migrate

如果您还没有创建用户,请创建一个新用户以测试功能:

python manage.py createsuperuser

一旦您拥有用户账户,运行runserver,然后尝试登录以获取您的JWT:

http POST http://localhost:800/auth/login/ username=admin password=password

您应该会得到一个令牌:

{
    "token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOjE0NTg2ODI3MzYsInVzZXJuYW1lIjoiYWRtaW4iLCJlbWFpbCI6IiIsInVzZXJfaWQiOjJ9.JDoVCpfiE0uGhsv9OQfPgPc-wxjjQtcEjwAI6bTLWRM"
}

接下来,您可以使用此令牌对Djoser的/me/端点进行身份验证,以获取您的个人资料信息。只需将您的令牌包含在请求头中,如Authorization: JWT

http http://localhost:8000/account/me/ "Authorization: JWT eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOjE0NTg2ODI3MzYsInVzZXJuYW1lIjoiYWRtaW4iLCJlbWFpbCI6IiIsInVzZXJfaWQiOjJ9.JDoVCpfiE0uGhsv9OQfPgPc-wxjjQtcEjwAI6bTLWRM"

这是我得到的结果:

{
    "email": "",
    "id": 2,
    "username": "admin"
}

正如您所看到的,使用JWT进行身份验证非常容易。 我猜测像djoserdjango-rest-auth这样的库专注于基本、会话或令牌身份验证,是因为它们已经包含在DRF框架中,因此可能是人们在服务器上进行调用身份验证最常见的方法。

所有这些美妙之处在于,实现更安全的身份验证方案很容易,因为Djoser并没有紧密耦合自己的身份验证类 - 它将乐意尊重您设置的DEFAULT_AUTHENTICATION_CLASSES


1
Djoser最近增加了对基于djangorestframework-jwt的JWT的支持 - http://djoser.readthedocs.io/en/latest/getting_started.html#installation 和 http://djoser.readthedocs.io/en/latest/authentication_backends.html#json-web-token-authentication - Peter Nimroot
@IAmKale 我正在尝试使用Djoser和Knox令牌认证,但是在URL和视图方面遇到了困难,无法使它们一起正常工作。是否有任何教程或指南可以帮助我? - gagan chhabra
@gagan 很抱歉,我没有好的线索,自从我最初发布这个答案以来,我就没有再接触过这些库了。你评论的另一个答案果然没有用吗?在快速搜索后,这是我唯一想到要链接给你的东西:https://dev59.com/abLma4cB1Zd3GeqPXz0e#54961526 - IAmKale
@IAmKale 我在评论的帖子中得到了一个想法,可以将两个包合并。我从Djoser开始,成功创建了一个用户,安装了Knox->进行了一些Knox配置,然后Djoser停止工作了。现在我不知道该怎么办了。我正在尝试弄清这两个包是如何相互影响的,以及使它们共同工作的强制依赖关系/实现/配置是什么(我可能缺失了其中的一些)。 - gagan chhabra

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接