内容简介:JWT(Json Web Token):是目前最流行的跨域身份验证解决方案。此前我们使用的身份验证方式都是基于Session:
JWT(Json Web Token):是目前最流行的跨域身份验证解决方案。
此前我们使用的身份验证方式都是基于Session:
这种方式并没有什么不妥,但其实这里有三个缺点:
- Session一般存储在 redis 中,而redis数据保存在内存中,随着用户的增多,内存消耗太大。
- 扩展性不好,用户每次验证都需要请求session服务器,增大了负载均衡能力,应用扩展受限。
- 因为是基于cookie来进行用户识别的, cookie如果被截获,用户就会很容易受到跨站请求伪造的攻击。
所以,我们需要一种既能实现相同要求并且还要比session存储更有效的身份验证方式。
JWT通过一种加密的方式,将加密后的数据保存返回给用户本地进行保存,我们称为token数据。其数据由三部分组成:
1、header声明类型和加密的算法:
{ 'typ': 'JWT', #固定值 'alg': 'HS256' #加密算法 }
2、payload负载
这是有效信息的存放地方,其分为三部分:标准中注册的声明、公共声明、私有声明(用户信息)
标准中的注册声明(有需要在使用,不强制使用):
iss: jwt签发者
sub: jwt所面向的用户
aud: 接收jwt的一方
exp: jwt的过期时间,这个过期时间必须要大于签发时间
nbf: 定义在什么时间之前,该jwt都是不可用的.
iat: jwt的签发时间
jti: jwt的唯一身份标识,主要用来作为一次性token,从而回避重放攻击。
公共声明:公共的声明可以添加任何的信息,一般添加用户的相关信息或其他业务需要的必要信息.
私有声明:
{ "name": "jim", "id": "111111", "admin": true }
3、signature签名
需要base64加密后的header和base64加密后的payload使用.连接组成的字符串,然后通过header中声明的加密方式进行加盐secret组合加密,然后就构成了jwt的第三部分。由于base64是对称加密算法,所以可以轻松解密:因此我们在负载部分不要将私密信息放置在里面,只需要把能验证唯一的标识信息添加就可以了。
有关base64,请参考: https://www.liaoxuefeng.com/w...
由于目前在学习DRF,所以我介绍一下怎样在DRF项目中使用JWT进行身份验证:
安装djangorestframework-jwt:
pip install djangorestframework-jwt
添加jwt认证类:
REST_FRAMEWORK = { 'DEFAULT_PERMISSION_CLASSES': ( 'rest_framework.permissions.IsAuthenticated', ), 'DEFAULT_AUTHENTICATION_CLASSES': ( 'rest_framework_jwt.authentication.JSONWebTokenAuthentication', 'rest_framework.authentication.SessionAuthentication', 'rest_framework.authentication.BasicAuthentication', ), }
添加jwt路由用于生成token:
from rest_framework_jwt.views import obtain_jwt_token urlpatterns = [ url(r'^自己的路由/', obtain_jwt_token), ]
然后我们就可以通过自己添加的路由并通过post添加username和password来获取到token了,在进行访问页面的时候我们只需要在请求头中添加一个: Authorization: JWT <your_token> ,就可以得到验证了。
以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网
猜你喜欢:- 表单正则验证及文件上传验证功能
- angular 实现同步验证器跨字段验证
- Spring Security验证流程剖析及自定义验证方法
- TensorFlow 推出数据验证函数库 TFDV,用于分析和验证
- TensorFlow 推出数据验证函数库 TFDV,用于分析和验证
- 滑动验证码的原理并利用 Vue 实现滑动验证码
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
HTML 编码/解码
HTML 编码/解码
MD5 加密
MD5 加密工具