Notion Blog
技术分享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-simplejwt

settings配置

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_token

settings配置

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 中的页面底部(与正文同页,便于管理)。

0/1500

暂无评论,欢迎抢沙发。