我如何将简单 JWT 用于自定义用户模型

问题描述

我正在管理我的用户模型(针对客户),但我不知道如何将 simple-jwt 用于自定义登录视图的客户模型。

models.py

from django.db import models

class Customer(models.Model):
   name = models.CharField(max_length=100)
   email = models.EmailField(max_length=100)
   password = models.CharField(max_length=100)

而且,我想通过保存刷新令牌来管理我的客户会话, 谁能告诉我我怎样才能做到这一点。

解决方法

经过一些研究,我得出的结论是,到目前为止,Simple JWT 对那些不是从 AbstactUserModel 派生的用户模型没有任何特殊支持

这意味着如果您正在管理 Customer 模型,则您需要从 AbstactUserModel 扩展它,或者您可以使用 jwt 而不是 Simple jwt。

,

首先用命令安装简单的jwt pip install djangorestframework-simplejwt 然后,您必须配置 django 项目以使用带有 settings.py

中的以下选项的库
REST_FRAMEWORK = {
    ...
    'DEFAULT_AUTHENTICATION_CLASSES': (
        ...
        'rest_framework_simplejwt.authentication.JWTAuthentication',)
    ...
}

SIMPLE_JWT = {
    'ACCESS_TOKEN_LIFETIME': timedelta(minutes=5),'REFRESH_TOKEN_LIFETIME': timedelta(days=1),'ROTATE_REFRESH_TOKENS': False,'BLACKLIST_AFTER_ROTATION': True,'UPDATE_LAST_LOGIN': False,'ALGORITHM': 'HS256','SIGNING_KEY': settings.SECRET_KEY,'VERIFYING_KEY': None,'AUDIENCE': None,'ISSUER': None,'AUTH_HEADER_TYPES': ('Bearer',),'AUTH_HEADER_NAME': 'HTTP_AUTHORIZATION','USER_ID_FIELD': 'id','USER_ID_CLAIM': 'user_id','AUTH_TOKEN_CLASSES': ('rest_framework_simplejwt.tokens.AccessToken','TOKEN_TYPE_CLAIM': 'token_type','JTI_CLAIM': 'jti','SLIDING_TOKEN_REFRESH_EXP_CLAIM': 'refresh_exp','SLIDING_TOKEN_LIFETIME': timedelta(minutes=5),'SLIDING_TOKEN_REFRESH_LIFETIME': timedelta(days=1),}

在您的根目录 urls.py 中添加以下内容

from rest_framework_simplejwt.views import (
    TokenObtainPairView,TokenRefreshView,)

urlpatterns = [
    ...
    path('api/token/',TokenObtainPairView.as_view(),name='token_obtain_pair'),path('api/token/refresh/',TokenRefreshView.as_view(),name='token_refresh'),...
]

默认情况下,简单的 JWT 仅在令牌中发送用户 ID。您可以通过执行以下操作进一步自定义它以在您的 serializers.py 中发送更多信息

from rest_framework_simplejwt.serializers import TokenObtainPairSerializer
class CustomTokenObtainPairSerializer(TokenObtainPairSerializer):
    """Customizes JWT default Serializer to add more information about user"""
    @classmethod
    def get_token(cls,user):
        token = super().get_token(user)
        token['name'] = user.name
        token['email'] = user.email
        token['is_superuser'] = user.is_superuser
        token['is_staff'] = user.is_staff

        return token

然后在您的 views.py 中添加以下内容

from users import serializers
class CustomTokenObtainPairView(TokenObtainPairView):
    # Replace the serializer with your custom
    serializer_class = serializers.CustomTokenObtainPairSerializer

你可以read more here

,

我可以在具有自定义用户模型的应用之后添加 'rest_framework_simplejwt'INSTALLED_APPS 来解决这个问题。