4

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

模型.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)

而且,我想通过保存刷新令牌来管理我的客户会话,谁能告诉我如何实现这一点。

4

3 回答 3

4

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

这意味着如果您正在管理客户模型,则需要对其进行扩展,AbstactUserModel或者您可以使用 jwt 而不是 Simple jwt。

于 2021-02-06T13:48:09.590 回答
3

首先使用命令安装简单 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

你可以在这里阅读更多

于 2021-02-06T14:19:17.740 回答
0

我可以在具有自定义用户模型的应用程序之后'rest_framework_simplejwt'解决此问题。INSTALLED_APPS

于 2021-04-23T17:24:31.523 回答