这是我的第一篇博客,记录一下!! 早上看到一篇英文文摘我觉得写的很好:If you're willing to take some risks, if you're willing to really go out and show appreciation and you're willing to really look at ideas, even if they're crazy, through the lens of possibilities, you'll build a bigger and bigger sail to catch the winds of luck.承担风险,心怀感激,越努力越幸运。共勉!!,接下来我要经常记录自己的学习笔记和idea,和大家一起进步。
言归正传,在项目开发中,一般会按照上图所示的过程进行认证,即:用户登录成功之后,服务端给用户浏览器返回一个token,以后用户浏览器要携带token再去向服务端发送请求,服务端校验token的合法性,合法则给用户看数据,否则,返回一些错误信息。
传统token方式和jwt在认证方面有什么差异?
-
传统token方式
用户登录成功后,服务端生成一个随机token给用户,并且在服务端(数据库或缓存)中保存一份token,以后用户再来访问时需携带token,服务端接收到token之后,去数据库或缓存中进行校验token的是否超时、是否合法。
-
jwt方式
用户登录成功后,服务端通过jwt生成一个随机token给用户(服务端无需保留token),以后用户再来访问时需携带token,服务端接收到token之后,通过jwt对token进行校验是否超时、是否合法。
JWT
用户登录:服务器给用户返回一个token(服务器不保存)
以后用户再来访问时,需要携带token,服务器获取token后再取token的校验
JWT实现过程:
用户提交用户名和密码给服务器,如果登陆成功,使用JWT创建一个token,并返回给用户
eyJ0eXAiOiJqd3QiLCJhbGciOiJIUzI1NiJ9.eyJpZCI6MSwidXNlcm5hbWUiOiJsaCIsImV4cCI6MTYyNzQ2MzI0N30.wL4LrFuEwr6WBFk41yOpGtfUaYyePcUjv-gDLMH9mn8
JWT由三段字符串组成并连接起来
第一段字符串。HEADER,内部包括算法/token类型
Json转化成字符串,然后做base64url加密
第二段字符串,palyload自定义值
第三段字符串,首先对第一二部份密文拼接起来
以后用户再来访问时,需要携带token,后端需要对token进行校验
获取token
对token进行切割
对第二段进行解密base64url,获取payload信息,并检测是否超时
对一二部分拼接,再次执行加密
一、DRF-JWT认证(后端实现):
- 1新建jwt_auth.py对token进行encode和decode
#!/usr/bin/env python
# -*- coding:utf-8 -*-
import jwt
import datetime
from jwt import exceptions
JWT_SALT = 'iv%x6xo7l7_u9bf_u!9#g#m*)*=ej@bek5)(@u3kh*72+unjv='