DRF:如何将django-rest-framework-jwt与Djoser集成

时间:2015-04-29 09:04:45

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

我打算用 Django Rest Framework 构建一个应用程序。我对使用 Django-Rest-Framework-JWT 认证机制比 Session Token 认证机制更感兴趣。

但所有其他软件包,如 Django-Rest-Auth Djoser (有助于注册过程)都使用会话和令牌认证系统。

如何使用 Django-Rest-Framework-JWT 覆盖 Djoser Django-Rest-Auth 中的令牌认证机制?< / p>

1 个答案:

答案 0 :(得分:13)

我知道这个问题差不多已经有一年了,但我只是想出了如何让 Djoser django-rest-knox 一起玩,当然也是如此技术也适用于 djangorestframework-jwt 。诀窍是知道您可以使用Djoser的帐户端点而不使用其与身份验证相关的端点。您只需将每个库放在自己的端点上。

以下是我如何设置Django Rest Framework以使用JWT登录并对Djoser端点进行身份验证(我将从头到尾接受它):

首先,安装 djangorestframework-jwt djoser

pip install djangorestframework-jwt djoser

通过在Django项目JSONWebTokenAuthentication DEFAULT_AUTHENTICATION_CLASSES中向settings.py添加REST_FRAMEWORK = { 'DEFAULT_PERMISSION_CLASSES': ( 'rest_framework.permissions.IsAuthenticated', ), 'DEFAULT_AUTHENTICATION_CLASSES': ( 'rest_framework_jwt.authentication.JSONWebTokenAuthentication', ), } 来指定您要使用JWT进行身份验证:

djoser.urls

接下来,将obtain_jwt_token和rest_framework_jwt的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

这应该是您开始所需的一切。为了安全起见,运行一个python manage.py migrate (我为这篇文章创建了一个全新的Django Rest Framework实例,并且还没有在此之前运行初始提交):

python manage.py createsuperuser

要测试一下,如果您还没有新用户,请创建一个新用户:

runserver

拥有用户帐户{ "token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOjE0NTg2ODI3MzYsInVzZXJuYW1lIjoiYWRtaW4iLCJlbWFpbCI6IiIsInVzZXJfaWQiOjJ9.JDoVCpfiE0uGhsv9OQfPgPc-wxjjQtcEjwAI6bTLWRM" } ,然后尝试登录以获取JWT:

  

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

你应该回来一个令牌:

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

然后,您可以使用此令牌对Djoser的 / me / 端点进行身份验证,以获取您的个人资料信息。只需将您的令牌包含在您的请求标题中授权:JWT

  

HTTP http://localhost:8000/account/me/&#34;授权:JWT eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOjE0NTg2ODI3MzYsInVzZXJuYW1lIjoiYWRtaW4iLCJlbWFpbCI6IiIsInVzZXJfaWQiOjJ9.JDoVCpfiE0uGhsv9OQfPgPc-wxjjQtcEjwAI6bTLWRM&#34;

这是我得到的:

DEFAULT_AUTHENTICATION_CLASSES

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

所有这一切的美妙之处在于,实现更安全的身份验证方案很容易,因为Djoser并没有与自己的身份验证类紧密耦合 - 它会高兴地尊重您为{设置的任何内容{1}}。