在前后端分离的项目中,前后端进行身份验证通常用JWT来进行,JWT 提供了一个理想的认证解决方案,用来保护 RESTful API,确保只有经过认证的用户才能访问受保护的资源。基于前端框架(如React, Angular, Vue.js)的单页面应用 (SPA),开发者通过使用 JWT可以获得一种简单、安全、高效的方式来处理用户认证和授权的问题。本文通过django项目的实战来说明如何应用和使用JWT。
一、什么是JWT
JWT信息由3段构成,它们之间用圆点“.”连接,格式如下:
1 |
aaaaaa.bbbbbb.cccccc |
一个典型的JWT如下所示:
1 |
eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJ0b2tlbl90eXBlIjoiYWNjZXNzIiwiZXhwIjoxNzI2OTcyMDc2LCJpYXQiOjE3MjY5NzAyNzYsImp0aSI6IjMyMTFiZjdmZDlhZTRmNTBhMDNmOGM2NjcwNDM2NjFiIiwidXNlcl9pZCI6Mn0.Ej6US4Uk-sSNm9P8kTU_cDAzBpO4I-BLhPstp5sG00Q |
-
头部 (Header):包含了关于 JWT 类型的信息以及所使用的签名算法。 -
负载 (Payload):是 JWT 的主体部分,包含了实际需要声明的数据。这些数据通常包括用户ID、用户名、角色等信息。 -
签名 (Signature):用于验证 JWT 的发送者就是它声称的发送者,同时也确保了 JWT 在传输过程中没有被篡改。
二、为什么使用JWT
-
安全性:JWT 通过签名来保证数据的完整性和防篡改性。如果有人试图修改 JWT 内容,签名会失效,接收方可以检测到这一行为。 -
无状态性:JWT 是自包含的,这意味着不需要在服务器上保存会话状态。每个 JWT 都包含了所有必要的信息,从而减少了对服务器端存储的需求。 -
跨域支持:JWT 可以轻松地在不同的域之间共享,这使得它非常适合微服务架构和分布式系统。 -
性能提升:由于 JWT 是自包含的,所以服务器可以快速地验证 JWT,而无需查询数据库来获取用户信息,这提高了应用的响应速度。 -
易于缓存和扩展:JWT 可以被缓存,并且因为它们是无状态的,所以可以很容易地扩展到多个服务器,而无需担心会话复制问题。 -
CSRF 防护:使用 JWT 可以帮助缓解跨站请求伪造(CSRF)攻击的风险,因为 JWT 不依赖于 cookie,也就不会随同 HTTP 请求自动发送。
三、在django项目中如何应用JWT
1、安装djangorestframework-simplejwt库:
1 |
pip install djangorestframework-simplejwt |
2、在settings.py中配置JWT认证:
1 |
INSTALLED_APPS = [ |
添加REST_FRAMEWORK的默认认证类为JWT认证
1 |
REST_FRAMEWORK = { |
添加SIMPLE_JWT的相关配置
1 |
# JWT 相关设置 |
3、在urls.py中配置JWT的获取和刷新路由:
1 |
from django.urls import path |
如下modelviweset中使用,对于查询方法如list,retrieve不做鉴权,对于其他方法需要鉴权。
1 |
def get_permissions(self): |
四、JWT如何使用
通过上面的应用后,使用接口调用遇到需要鉴权的会提示需要认证。
如当我们调用删除接口时,如果没有获得鉴权,接口会返回需要认证的信息。
下面通过postman来应用JWT的使用过程。
1、调用生成JWT的接口获取JWT
2、客户端保存JWT在调用接口时带上获取的JWT
博客地址:http://xiejava.ishareread.com/
“fullbug”微信公众号
关注:微信公众号,一起学习成长!
原文始发于微信公众号(fullbug):django应用JWT(JsonWebToken)实战
免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉。
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论