Django REST framework JWT(django官方文档)

网友投稿 654 2022-08-29


Django REST framework JWT(django官方文档)

在用户注册或登录后,我们想记录用户的登录状态,或者为用户创建身份认证的凭证。我们不再使用Session认证机制,而使用Json Web Token认证机制。

JWT的构成

JWT就一段字符串,由三段信息构成的,将这三段信息文本用​​.​​链接一起就构成了Jwt字符串。就像这样:

eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiYWRtaW4iOnRydWV9.TJVA95OrM7E2cBab30RMHrHDcEfxjoYZgeFONFh7HgQ

第一部分我们称它为头部(header),第二部分我们称其为载荷(payload, 类似于飞机上承载的物品),第三部分是签证(signature).

header

jwt的头部承载两部分信息:

完整的头部就像下面这样的JSON:

{ 'typ': 'JWT', 'alg': 'HS256'}

然后将头部进行base64.b64encode()加密(该加密是可以对称解密的),构成了第一部分.

eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9

payload

载荷就是存放有效信息的地方。这个名字像是特指飞机上承载的货品,这些有效信息包含三个部分

iss: jwt签发者sub: jwt所面向的用户aud: 接收jwt的一方exp: jwt的过期时间,这个过期时间必须要大于签发时间nbf: 定义在什么时间之前,该jwt都是不可用的.iat: jwt的签发时间jti: jwt的唯一身份标识,主要用来作为一次性token,从而回避重放攻击。

定义一个payload:

{ "sub": "1234567890", "exp": "3422335555", "name": "John Doe", "admin": true}

然后将其进行base64.b64encode() 加密,得到JWT的第二部分。

eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiYWRtaW4iOnRydWV9

signature

JWT的第三部分是一个签证信息,这个签证信息由三部分组成:

header (base64后的)payload (base64后的)secret密钥

// javascriptvar encodedString = base64UrlEncode(header) + '.' + base64UrlEncode(payload);var signature = HMACSHA256(encodedString, 'secret'); // TJVA95OrM7E2cBab30RMHrHDcEfxjoYZgeFONFh7HgQ

将这三部分用​​.​​连接成一个完整的字符串,构成了最终的jwt:

eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiYWRtaW4iOnRydWV9.TJVA95OrM7E2cBab30RMHrHDcEfxjoYZgeFONFh7HgQ

注意:secret是保存在服务器端的,jwt的签发生成也是在服务器端的,secret就是用来进行jwt的签发和jwt的验证,所以,它就是你服务端的私钥,在任何场景都不应该流露出去。一旦客户端得知这个secret, 那就意味着客户端是可以自我签发jwt了。

jwt的优点:1. 实现分布式的单点登陆非常方便2. 数据实际保存在客户端,所以我们可以分担都武器的存储压力jwt的缺点:1. 数据保存在了客户端,我们服务端只认jwt,不识别客户端。2. jwt可以设置过期时间,但是因为数据保存在了客户端,所以对于过期时间不好调整。

安装配置JWT

pip install djangorestframework-jwt -i = { 'DEFAULT_AUTHENTICATION_CLASSES': ( 'rest_framework_jwt.authentication.JSONWebTokenAuthentication', 'rest_framework.authentication.SessionAuthentication', 'rest_framework.authentication.BasicAuthentication', ),}import datetimeJWT_AUTH = { //设置有效时长 'JWT_EXPIRATION_DELTA': datetime.timedelta(days=1),}JWT_EXPIRATION_DELTA 指明token的有效期

应用路由

from rest_framework_jwt.views import obtain_jwt_tokenurlpatterns = [ path(r'login/', obtain_jwt_token),]

测试

通过postman请求路径: POST请求,参数为用户名和密码,当用户名和密码正确时,会返回token。

-------------------------------------------

个性签名:代码过万,键盘敲烂!!!

如果觉得这篇文章对你有小小的帮助的话,记得“推荐”哦,博主在此感谢!


版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:celery中异步延迟执行任务apply_anysc的用法(celery 异步)
下一篇:Java给PDF加水印并合并多个文件
相关文章

 发表评论

暂时没有评论,来抢沙发吧~