10

我打算用Django Rest Framework构建一个应用程序。我对使用Django-Rest-Framework-JWT身份验证机制比使用SessionToken身份验证机制更感兴趣。

但是所有其他包,如Django-Rest-AuthDjoser(有助于注册过程)都使用会话和令牌身份验证系统。

如何使用Django-Rest-Framework-JWT覆盖DjoserDjango-Rest-Auth中的令牌身份验证机制?

4

1 回答 1

19

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

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

首先,安装djangorestframework-jwtdjoser

pip install djangorestframework-jwt djoser

通过在 Django 项目中添加以下内容JSONWebTokenAuthentication来指定您要使用 JWT 进行身份验证:DEFAULT_AUTHENTICATION_CLASSESsettings.py

REST_FRAMEWORK = {
    'DEFAULT_PERMISSION_CLASSES': (
        'rest_framework.permissions.IsAuthenticated',
    ),
    'DEFAULT_AUTHENTICATION_CLASSES': (
        'rest_framework_jwt.authentication.JSONWebTokenAuthentication',
    ),
}

接下来,将djoser.urlsrest_framework_jwt 的obtain_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/用户名=管理员密码=密码

你应该取回一个令牌:

{
    "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这样的库专注于 Basic、Session 或 Token 身份验证,因为它们包含在 DRF 框中,因此可能是人们对服务器的调用进行身份验证的最常用方法。

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

于 2016-03-22T22:05:50.617 回答