技术分享1 分钟阅读
django jwt添加和使用以及自定义负载payload
JWT,即JSON Web Token,是一种基于JSON的开放标准(RFC 7519),它定义了一种紧凑的、自包含的方式,用于作为JSON对象在各方之间作为令牌进行通信。这个令牌可以用于在双方之间安全地传输信息,同时也可以用于认证和授权。
JWT由三部分组成:头部(Header)、负载(Payload)和签名(Signature)。头部包含了使用的加密算法和令牌类型;负载包含了要传输的数据,可以是用户信息、角色权限等;签名则使用头部和负载作为输入,通过HMAC SHA256算法生成签名,用于确保数据的完整性和真实性。
django中使用用三方库rest_framework_simplejwt,可以快速使用jwt。
版本:
djangorestframework-simplejwt== 5.3.1
Django==4.0安装
pip install djangorestframework-simplejwtsettings配置
import datetime
SIMPLE_JWT = {
'ACCESS_TOKEN_LIFETIME': datetime.timedelta(days=1), # 设置Access Token过期时间
'REFRESH_TOKEN_LIFETIME': datetime.timedelta(days=7), # 设置Refresh Token过期时间
}
REST_FRAMEWORK = {
'DEFAULT_AUTHENTICATION_CLASSES': [
'rest_framework_simplejwt.authentication.JWTAuthentication'
], # 开启全局的jwt校验
'DEFAULT_PERMISSION_CLASSES': [
'rest_framework.permissions.IsAuthenticated',
], #开启刷新token需要添加
}路由配置
from rest_framework_simplejwt.views import token_obtain_pair, token_refresh
urlpatterns = [
path('login/', token_obtain_pair.as_view(),name='login'), # 登录 签发token
path('refresh/', token_refresh.as_view(),name='refresh'), # 刷新token
]

自定义负载payload
from rest_framework_simplejwt.serializers import TokenObtainPairSerializer
class JwtTokenAuthent(TokenObtainPairSerializer):
@classmethod
def get_token(cls, user):
token = super().get_token(user)
token['test'] = 'test'
return token自定义刷新token负载payload
from rest_framework_simplejwt.serializers import TokenRefreshSerializer
from rest_framework_simplejwt.tokens import RefreshToken
class JwtTokenRefreshAuthent(TokenRefreshSerializer):
def validate(self, attrs):
# 在刷新令牌的负载中添加自定义数据
refresh_obj = RefreshToken(attrs['refresh'])
refresh_obj.payload['test'] = 'test'
return str(refresh_obj.access_token)自定义token校验
from rest_framework_simplejwt.authentication import JWTAuthentication
class JWTTokenAuthentication(JWTAuthentication):
def authenticate(self, request):
# 自定义你的验证逻辑,如从请求头中获取token的方式、解码和验证等
header = self.get_header(request)
if header is None:
return None
raw_token = self.get_raw_token(header)
if raw_token is None:
return None
validated_token = self.get_validated_token(raw_token)
return self.get_user(validated_token), validated_tokensettings配置
REST_FRAMEWORK = {
'DEFAULT_AUTHENTICATION_CLASSES': [
'.tool.authentications.JWTTokenAuthentication', # 自定义校验位置
],
'DEFAULT_PERMISSION_CLASSES': [
'rest_framework.permissions.IsAuthenticated',
],
}部分接口不校验jwt
from rest_framework.permissions import BasePermission
class AllowAll(BasePermission):
def has_permission(self, request, view):
return True
# 视图使用部分
class test(APIView):
permission_classes = [AllowAll]注意:
需要全局校验token的接口不能只使用View
有关使用上的问题,欢迎您在底部评论区留言,一起交流~
读者评论
评论会同步写入该文在 Notion 中的页面底部(与正文同页,便于管理)。
暂无评论,欢迎抢沙发。