其他分享
首页 > 其他分享> > 基于rest_framework的jwt认证

基于rest_framework的jwt认证

作者:互联网

1 认证原理

1 jwt分三段式:头.体.签名 (head.payload.sgin)
2 头和体是可逆加密,让服务器可以反解出user对象;签名是不可逆加密,保证整个token的安全性的
3 头体签名三部分,都是采用json格式的字符串,进行加密,可逆加密一般采用base64算法,不可逆加密一般采用hash(md5)算法
4 头中的内容是基本信息:公司信息、项目组信息、token采用的加密方式信息
{
	"company": "公司信息",
	...
}
5 体中的内容是关键信息:用户主键、用户名、签发时客户端信息(设备号、地址)、过期时间
{
	"user_id": 1,
	...
}
6 签名中的内容时安全信息:头的加密结果 + 体的加密结果 + 服务器不对外公开的安全码 进行md5加密
{
	"head": "头的加密字符串",
	"payload": "体的加密字符串",
	"secret_key": "安全码"
}

2 校验

1 将token按 . 拆分为三段字符串,第一段 头加密字符串 一般不需要做任何处理
2 第二段 体加密字符串,要反解出用户主键,通过主键从User表中就能得到登录用户,过期时间和设备信息都是安全信息,确保token没过期,且时同一设备来的
3 再用 第一段 + 第二段 + 服务器安全码 不可逆md5加密,与第三段 签名字符串 进行碰撞校验,通过后才能代表第二段校验得到的user对象就是合法的登录用户

3 认证流程

1 用账号密码访问登录接口,登录接口逻辑中调用 签发token 算法,得到token,返回给客户端,客户端自己存到cookies中

2 校验token的算法应该写在认证类中(在认证类中调用),全局配置给认证组件,所有视图类请求,都会进行认证校验,所以请求带了token,就会反解出user对象,在视图类中用request.user就能访问登录的用户

注:登录接口需要做 认证 + 权限 两个局部禁用

4 jwt拓展的安装

pip install djangorestframework-jwt

5 token的获取

 #urls.py
	from rest_framework_jwt.views import ObtainJSONWebToken,VerifyJSONWebToken,RefreshJSONWebToken,obtain_jwt_token
	path('login/', obtain_jwt_token)

6 自定制auth认证类

from rest_framework_jwt.authentication import BaseAuthentication,BaseJSONWebTokenAuthentication
from rest_framework.exceptions import AuthenticationFailed
from rest_framework_jwt.authentication import jwt_decode_handler
from rest_framework_jwt.authentication import get_authorization_header,jwt_get_username_from_payload
from rest_framework import exceptions
class MyToken(BaseJSONWebTokenAuthentication):
	def authenticate(self, request):
		jwt_value=str(request.META.get('HTTP_AUTHORIZATION'))
		# 认证
		try:
			payload = jwt_decode_handler(jwt_value)

		except Exception:
			raise exceptions.AuthenticationFailed("认证失败")
		user=self.authenticate_credentials(payload)
		return user,None

标签:加密,jwt,rest,认证,framework,token
来源: https://www.cnblogs.com/mress/p/16504290.html