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

Posted

技术标签:

【中文标题】DRF:如何将 django-rest-framework-jwt 集成到 Djoser【英文标题】:DRF: how to integrate django-rest-framework-jwt to Djoser 【发布时间】:2015-07-08 11:05:22 【问题描述】:

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

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

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

【问题讨论】:

【参考方案1】:

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

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

首先,安装 djangorestframework-jwtdjoser

pip install djangorestframework-jwt djoser

通过在 Django 项目的 settings.py 中添加 JSONWebTokenAuthenticationDEFAULT_AUTHENTICATION_CLASSES 来指定您要使用 JWT 进行身份验证:

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

接下来,将djoser.urls 和rest_framework_jwt 的obtain_jwt_token 视图添加到您的网址:

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

你应该取回一个令牌:


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

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

HTTP http://localhost:8000/account/me/ “授权:JWT eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOjE0NTg2ODI3MzYsInVzZXJuYW1lIjoiYWRtaW4iLCJlbWFpbCI6IiIsInVzZXJfaWQiOjJ9.JDoVCpfiE0uGhsv9OQfPgPc-wxjjQtcEjwAI6bTLWRM” P>

这是我得到的结果:


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

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

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

【讨论】:

Djoser 最近获得了对基于 djangorestframework-jwt - djoser.readthedocs.io/en/latest/… 和 djoser.readthedocs.io/en/latest/… 的 JWT 的支持 @IAmKale 我正在尝试使用 Knox 令牌身份验证来实现 Djoser,但要努力使用 URL 和视图以使它们协同工作。有什么教程或指南可以帮助我。 @gagan 不幸的是,我没有好的线索,自从我最初发布这个答案以来,我还没有接触过这些库。你评论的这个其他答案到底是不是没用?这是我在快速搜索后唯一想将您链接到的内容:***.com/a/54961526/2133271 @IAmKale 我评论的帖子给了我一个想法,我可以如何合并 2 个包。我从 Djoser 开始,成功创建了一个用户,安装了 Knox->做了一些 Knox 配置,然后 Djoser 停止了工作。现在我无处可去。我试图弄清楚这两个包是如何相互影响的,以及使它们一起工作的强制性依赖项/实现/配置是什么(我可能错过了)。

以上是关于DRF:如何将 django-rest-framework-jwt 集成到 Djoser的主要内容,如果未能解决你的问题,请参考以下文章

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

ReactJS 和 DRF:如何将 JWT 令牌存储在 HTTPonly cookie 中?

如何使DRF串行器与大写字母兼容

DRF:自定义权限被拒绝消息

如何在 DRF 中使用身份服务器 4 验证 JWT 令牌?

drf自定义异常处理