【问题标题】:Use Django AUTH_USER model to pass data with JWT Token (Eg.first_name, last_name)使用 Django AUTH_USER 模型通过 JWT Token 传递数据(例如,first_name,last_name)
【发布时间】:2021-09-09 05:30:41
【问题描述】:

我正在使用 ModelViewSet 开发 Django RF,我将在其中使用 JWT 令牌身份验证。我想使用默认的 django auth_user 模型而不是创建新的自定义用户模型。

#serializer.py
class MyTokenObtainPairSerializer(TokenObtainPairSerializer):
    class Meta:
    model = User
    fields = ('username','first_name')
    def validate(self, attrs):
        data = super().validate(attrs)
        refresh = self.get_token(self.user)
        data['refresh'] = str(refresh)
        data.pop('refresh', None) # remove refresh from the payload
        data['access'] = str(refresh.access_token)

        # Add extra responses here
        data['username'] = self.user.username
        data['first_name'] = self.user.first_name
        data['last_name'] = self.user.last_name
        return data

views.py
class TokenObtainPairView(TokenObtainPairView):
# Replace the serializer with your custom
serializer_class = MyTokenObtainPairSerializer
# token_obtain_pair = TokenObtainPairView.as_view()



class MyTokenObtainPairSerializer(TokenObtainPairSerializer):
class Meta:
    model = User
    fields = ('username','first_name')
@classmethod
def get_token(cls, user):
    token = super().get_token(user)
    token['username'] = user.username
    token['first_name'] = user.first_name
    return token

【问题讨论】:

    标签: django-rest-framework django-rest-framework-simplejwt


    【解决方案1】:

    如果您没有在 settings.py 中设置AUTH_USER_MODEL = 'myapp.MyUser',则默认使用User 而不是MyUser

    settings.py

    如果您使用simplejwt,则必须分配身份验证类。

    REST_FRAMEWORK = {
        ...
        'DEFAULT_AUTHENTICATION_CLASSES': (
            ...
            'rest_framework_simplejwt.authentication.JWTAuthentication',
        )
        ...
    }
    

    CustomTokenObtainPairView 不自定义令牌

    好的,明白了。非常感谢@Klim Bim。你可以帮我一个忙吗。你能告诉我如何使用 simple-jwt 令牌添加其他字段。我曾尝试使用自定义 TokenObtaibPairView',但我得到的只是 user_id。

    您可以自定义token claims,也可以将数据添加到响应中。

    serializer.py

    class CustomTokenObtainPairSerializer(TokenObtainPairSerializer):
        @classmethod
        def get_token(cls, user):
            token = super().get_token(user)
            token['username'] = user.username
            token['first_name'] = user.first_name
    
            return token
    

    views.py

    class CustomTokenObtainPairView(TokenObtainPairView):
    
       serializer_class = CustomTokenObtainPairSerializer
    
       def post(self, request, *args, **kwargs):
    
          response = super().post(request, *args, **kwargs)
          response.data['custom_key'] =  'my_custom_data'
          
          return response
    

    urls.py

    urlpatterns = [
        path('token/', CustomTokenObtainPairView.as_view(), name='token_obtain_pair'),
    ]
    

    邮递员

    【讨论】:

    • 谢谢,你能告诉我如何使用 auth_user 模型为用户名和密码创建序列化程序,以及如何通过这些序列化程序使用 modelviewset 创建登录 api
    • 您可以使用例如保护您的视图。 permission_classes = [IsAuthenticated] 不是你的序列化器。如果你想创建一个重置密码和做其他事情的视图,你需要一个使用model = Userdrf permissionsdrf user viewset exampleModelSerializer
    • 如果您没有登录,则视图会拒绝您设置permission_classes = [IsAuthenticated]的获取请求
    • 非常感谢。那么如何为我的前端页面传递用户名和密码。我是否需要创建超级用户才能获得访问权限。
    • 我不明白你的意思。您可以使用具有完全权限的python manage.py createsuperuser 为 django 创建一个超级用户。如果你想创建一个普通用户,你可以POST一个。不需要超级用户。只有您想创建默认不活动的用户,并且超级用户有权激活它们。
    猜你喜欢
    • 2019-06-13
    • 2017-10-12
    • 1970-01-01
    • 2016-03-19
    • 1970-01-01
    • 2019-04-16
    • 1970-01-01
    • 2010-12-16
    • 1970-01-01
    相关资源
    最近更新 更多