1. 基础

jwt   json   web  token
原理:
1. jwt 分为三段式 head,payload,sign
2. 头和体是可逆加密,让服务器可以反解成user对象,签名是不可逆加密,保证整个token的安全性
3.head,payload,sgin三部分,店铺是采用json格式的字符串进行加密,可逆加密一般采用base64算法,不可逆加密
一般采用hash md5算法
4 头中的内容是基本信息,公司信息等
5. 体中的内容是关键信息 用户信息
6.sgin的内容是安全信息,:head的加密结果+payload加密结果+服务器不对外公开的安全码,进行md5加密

校验
1. 将token按 . 拆分成三段字符串,第一段,head 加密字符串 一般不需要处理
2. 第二段 payload加密字符串要反解出用户keyword 校验信息等
3. 再用第一段,第二段+ 服务器安全码 不可逆hash 加密,与第三段签名进行校验 通过后才能确认
第二段的用户是合法用户

drf项目的jwt认证开发流程
1.用账号密码访问接口,登录接口逻辑中调用签发token算法,得到token 返回给客户端
2.校验token的算法应该写在认证类中, 全局配置认证组件 ,都会进行认证校验,所以请求带了token,就会反解,
3. 登录接口局部禁用认证

2.基本使用
基于django的auth表实现的
1.1 得到token
from
rest_framework_jwt.views import ObtainJSONWebToken,VerifyJSONWebToken
jwt 提供的视图类 urlpatterns
= [ path('admin/', admin.site.urls), path('login/',ObtainJSONWebToken.as_view()) ]
post 请求携带json数据 返回token
{
    "username":"dcm1",
    "password": "123"
}
1.2 其他视图类内使用
from rest_framework_jwt.authentication import JSONWebTokenAuthentication
class JwtTest(GenericAPIView):

authentication_classes = [JSONWebTokenAuthentication]
def get(self,request,*args,**kwargs):

return Response('GET请求')
请求头内增加Authorization  属性  value值为JWT+空格+token

jwt项目在django内的settings
JWT_AUTH={
'JWT_EXPIRATION_DELTA': datetime.timedelta(seconds=300),
'JWT_AUTH_HEADER_PREFIX': 'JWT',
}


3. 基于jwt自己写认证

3.1 自己写的

 

from rest_framework_jwt.authentication import BaseAuthentication,JSONWebTokenAuthentication,jwt_decode_handler
class NewAuthToken(JSONWebTokenAuthentication):
def authenticate(self, request):
token = request.META.get('HTTP_AUTHORIZATION')
     这块,postman内配的是Authorization属性,不是HTTP_AUTHORIZATION 这个属性
        #  拿用户信息
payload = jwt_decode_handler(token)
print(payload)
user = self.authenticate_credentials(payload)
return user, None

 

posted on 2023-04-19 11:21  阿勒泰的鱼  阅读(40)  评论(0)    收藏  举报