在 Django(drf 和 simplejwt)中究竟应该如何实现基于 JWT 的身份验证?

     2023-03-10     139

关键词:

【中文标题】在 Django(drf 和 simplejwt)中究竟应该如何实现基于 JWT 的身份验证?【英文标题】:How exactly should JWT-based authentication be implemented in Django (drf and simplejwt)? 【发布时间】:2021-05-07 09:05:16 【问题描述】:

我很难准确理解在 Django 中应该如何实现基于 JWT 的身份验证(我使用的是 simplejwt)。我只是一个初学者,所以请为一些愚蠢的问题做好准备。 rest-framework-simplejwt 文档非常少,没有为像我这样的新手提供足够的细节。

path('token/obtain', jwt_views.TokenObtainPairView.as_view(), name='token_create'),
path('token/refresh', jwt_views.TokenRefreshView.as_view(), name='token_refresh'),

所以,我按照官方文档的建议在 urls.py 中创建了路径。我从这里去哪里?我想我的困惑来自这样一个事实,即我不确定我必须在代码中的确切位置发布我的令牌。假设我正在登录用户。那么,为了获得令牌,我是否必须从视图内部向“token_create”端点发送请求?还是我必须以某种方式在我的序列化程序之一中指出它? 'refresh_token' 端点呢?有没有我需要使用的特定方法?

那么,令牌发行后我该怎么办?显然,我不应该将它保存在数据库中,因为它首先破坏了使用 JWT 的全部目的。据我了解,我应该将其附加到标头中,以便用户的后续请求包含标头中的令牌。

前端将用 ReactJS 编写,与我的 Django 后端 API 位于不同的服务器上,两者之间的通信将通过 CORS 进行配置。

在这种情况下,我如何将令牌附加到标头并使其使用户的浏览器在每个请求中发送令牌?是否有某种包可能对此有用?

【问题讨论】:

这有帮助吗? simpleisbetterthancomplex.com/tutorial/2018/12/19/… @HosseinHeydari,感谢您的回复,但不幸的是,它没有 :( 他们在该教程中为发布令牌所做的是直接向“token_create”和“token_refresh”发送请求' 我上面通过命令行描述的端点。我已经尝试通过邮递员发出直接请求以发出令牌并使用它们来访问受保护的视图,并且它有效。但是,我感到困惑的是如何在我的 Django 应用程序,例如我是否需要使用“请求”模块从视图中发送请求,如何设置客户端标头等。 【参考方案1】:

我认为你只是把一切都搞混了,我会解释一切,但你可能已经知道一些东西。

JWT 只是一种授权用户的方式,您通常创建一个端点来为用户创建一个令牌,该端点可以命名为logincreate_token、'generate_token' 或任何名称!没关系!

但是,如果您使用特定的库,可能会迫使您使用特定的端点,但在 Flask 中,这确实是您喜欢的。

这个login(不管你怎么称呼它)端点将接受一个用户名和密码并检查它是否存在并且它是正确的,然后生成一个JWT 与PyJWT 之类的库,您可以将JWT 配置为例如在 20 分钟或更长时间后过期,然后您加密一个 通常 包含您从数据库查询的 user_iddictionary(JSON?)。您提供给用户的 JSON 示例:


  "user_id": something,
  "role": something,
  ...

然后会被加密成一个长字符串。

现在当用户发送请求时,他/她需要将那个长字符串作为请求的Authorization 标头。

postman --> Authorizations 中,选择Bearer Authorization,然后插入那个长字符串。

我们还给用户一个refresh_token

这是您在用户调用login 端点时向用户提供的 JSON 示例:


 token: some_long_string,
 refresh_token: some_long_string,


那么什么是刷新令牌?

只是主令牌过期时的令牌,而不是让用户再次输入用户名和密码,他只是发送我们在他调用login时给他的刷新令牌。

还有一点:这是您需要实现的整个流程和逻辑。随心所欲,图书馆或任何你喜欢的东西,都无所谓。

【讨论】:

感谢您的回答!我正在为我的项目使用 simplejwt 库,安装指南要求我创建包含在原始问题中的端点。因此,我对如何从 LoginView 内部发出令牌的技术细节感到困惑,因为似乎 login 和 token_obtain 端点需要不同。 另外,如果我发出带有令牌的纯 JSON 作为对用户请求的响应,那会不会不安全? 不,它不是不安全的,因为稍后,它必须使用 HTTPS 协议并且它是安全的。 最后一个问题如下:您提到了如何通过邮递员设置我的授权标头并在其中包含我的令牌以访问受保护的视图。我明白了。我认为我感到困惑的是,在现实生活中,用户显然不需要通过浏览器将令牌复制并粘贴到标题中:一切都会自动运行。所以我想知道如何启用此功能。是否有设置标头的特定包/框架? JWT 令牌如何从 JSON 响应转到标头? 知道了!非常感谢您的解释!你真的帮我解决了很多我困惑的事情。非常感谢您抽出宝贵时间提供帮助!

如何使用 DRF djangorestframework-simplejwt 包将 JWT 令牌存储在 HttpOnly cookie 中?

】如何使用DRFdjangorestframework-simplejwt包将JWT令牌存储在HttpOnlycookie中?【英文标题】:HowtostoreJWTtokensinHttpOnlycookieswithDRFdjangorestframework-simplejwtpackage?【发布时间】:2021-05-2016:45:47【问题描述】:我已经使用djangorestframework-simplejwt有... 查看详情

DRF SimpleJWT 删除密码并添加日期字段

】DRFSimpleJWT删除密码并添加日期字段【英文标题】:DRFSimpleJWTremovepasswordandadddatefield【发布时间】:2020-09-1520:50:58【问题描述】:我创建了一个从AbstractBaseUser扩展的自定义用户模型,其中我从用户那里获得的唯一数据是用户ID、... 查看详情

使用 simplejwt 模块在 django 中修改 jwt 访问令牌到期时间

】使用simplejwt模块在django中修改jwt访问令牌到期时间【英文标题】:Modifyingjwtaccesstokenexpirytimeindjangousingsimplejwtmodule【发布时间】:2019-05-1923:10:00【问题描述】:fromrest_framework_simplejwt.serializersimportTokenObtainPairSerializerfromrest_frame 查看详情

Django DRF websocket 通道 2 并使用来自 Simple JWT 的令牌进行授权

】DjangoDRFwebsocket通道2并使用来自SimpleJWT的令牌进行授权【英文标题】:DjangoDRFwebsocketchannels2andauthorizewithtokenfromSimpleJWT【发布时间】:2020-10-2314:35:18【问题描述】:我有一个简单的聊天,我使用渠道2。在用户连接到消费者之前,... 查看详情

Django Rest Framework 和 django Rest Framework simplejwt 两因素身份验证

】DjangoRestFramework和djangoRestFrameworksimplejwt两因素身份验证【英文标题】:DjangoRestFrameworkanddjangorestframeworksimplejwttwofactorauthentication【发布时间】:2021-09-0915:10:10【问题描述】:我将django3.2.4版与DjangoRestFramework结合使用。我还将https:... 查看详情

Django 和 DRF 的审计日志

】Django和DRF的审计日志【英文标题】:auditlogwithDjangoandDRF【发布时间】:2017-04-0600:31:59【问题描述】:我需要在使用Django1.8和Django-Rest-Framework3.2.2的项目之一中实现审计日志功能。我已扩展BaseUserManagerclass以创建用户模型,因为... 查看详情

“未提供身份验证凭据。”在 DRF 中

...8-0912:55:50【问题描述】:我在我的DRF后端使用rest_framework_simplejwt身份验证。当我在身份验证和访问预定义的API端点方面使用DRF浏览器时,一切正常。但是,当我想以编程方式访问post/patch方法的端点时 查看详情

何时在 DRF 中的 jwt 中调用 gettoken、刷新令牌和验证令牌?

...我的项目使用内置的tokenauthentication。但现在我正在转向simplejwt。但我对一件事感到困惑。在TokenAut 查看详情

DRF+非DRF联合认证

...ntication【发布时间】:2021-06-0506:03:57【问题描述】:我是Django和基于令牌的身份验证的新手,并且有一个来自django(非DRF)的多页面站点和标准的基于会话的身份验证,以及一个在DRF和JWT身份验证上使用graphQL的反应应用程序。... 查看详情

为 DRF、Django 和 React 前端配置 Nginx 和 Gunicorn

】为DRF、Django和React前端配置Nginx和Gunicorn【英文标题】:ConfiguringNginxandGunicornforDRF,DjangoandReactFrontend【发布时间】:2019-07-2514:37:22【问题描述】:我有一个应用程序,它的前端在React中,后端在Django中,前端使用DRF开发的API。现... 查看详情

为啥我无法在 Django 路由器中注册“.as_view()”(使用 djangorestframework-simplejwt)?

...法在Django路由器中注册“.as_view()”(使用djangorestframework-simplejwt)?【英文标题】:WhyIcannotregister\'.as_view()\'intheDjangorouter(usingdjangorestframework-simplejwt)?为什么我无法在Django路由器中注册“.as_view()”(使用djangorestframework-simplejw 查看详情

Django/DRF - 405 方法不允许删除操作

】Django/DRF-405方法不允许删除操作【英文标题】:Django/DRF-405MethodnotallowedonDELETEoperation【发布时间】:2014-12-2923:24:40【问题描述】:我正在本地机器(node和django)上使用两台开发服务器。我已将django-cors-headers添加到项目中,以允... 查看详情

带有 DRF 的 Django-filter - 如何在使用相同查找应用多个值时执行“和”?

】带有DRF的Django-filter-如何在使用相同查找应用多个值时执行“和”?【英文标题】:Django-filterwithDRF-Howtodo\'and\'whenapplyingmultiplevalueswiththesamelookup?【发布时间】:2017-05-0219:53:48【问题描述】:这是我正在使用的过滤器集的一个稍... 查看详情

使用 django-rest-framework-simplejwt 注册后返回令牌

】使用django-rest-framework-simplejwt注册后返回令牌【英文标题】:returntokenafterregistrationwithdjango-rest-framework-simplejwt【发布时间】:2019-02-0114:52:03【问题描述】:我正在使用django-rest-framework-simplejwt,想知道注册用户后是否可以返回令... 查看详情

Vue axios 不向服务器发送标头(django simplejwt)

】Vueaxios不向服务器发送标头(djangosimplejwt)【英文标题】:Vueaxiosnotsendingheaderstoserver(djangosimplejwt)【发布时间】:2021-12-2015:38:03【问题描述】:它在邮递员中运行良好。但是当我从Vue发出axios请求时出现此错误。:\'Authenticationcr... 查看详情

django&drf重点内容汇总(代码片段)

 Django&DRF重点内容大盘点  本文只是将学习过程中需要深刻记忆,在工作中常用的一些命令或者知识点进行一个罗列并阐释,不会全面的将所有内容进行讲解。大家可以在了解了Django框架和DRF框架之后再来看这边文章。... 查看详情

Django 从 3.2 -> 4.0 和 DRF 路径更新

】Django从3.2->4.0和DRF路径更新【英文标题】:Djangoupdatefrom3.2->4.0andDRFPaths【发布时间】:2022-01-2323:49:57【问题描述】:我想尝试将在django3.2.6上运行良好的django应用升级到下一个版本,但即使在测试中我也遇到了已弃用的url(ht... 查看详情

部署单独的 React 前端和 Django DRF API

】部署单独的React前端和DjangoDRFAPI【英文标题】:DeployingSeprateReactFrontendandDjangoDRFAPI【发布时间】:2019-04-3005:39:46【问题描述】:我有一个用create-react-app制作的反应前端来部署这个我只是在npmrunbuild做的生产版本。我的应用使用Dj... 查看详情