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

How can i use Simple JWT for custom User Model

我正在管理我的用户模型(针对客户),但我不知道如何将 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 而不是简单 jwt。

先用命令安装simple 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