如何在登录过程中生成rest_framework_jwt token

Posted

技术标签:

【中文标题】如何在登录过程中生成rest_framework_jwt token【英文标题】:how to generate rest_framework_jwt token in the login process 【发布时间】:2018-04-28 11:11:20 【问题描述】:

我正在尝试实现 django-rest-framework-jwt 进行身份验证。我做了所有 jwt 教程所说的(添加设置、url 和 curl 测试)。我确实在可浏览的 api 中使用127.0.0.1:8000/api/auth/token/ 成功获取了令牌。

但我没有得到的是如何在登录过程中生成令牌。我的猜测可能是在 LoginSerializer 中生成它? (或者我误解了这个概念!)

这是我所拥有的:

# settings.py
REST_FRAMEWORK = 
    'DEFAULT_RENDERER_CLASSES': (
        'rest_framework.renderers.JSONRenderer',
        'rest_framework.renderers.BrowsableAPIRenderer',
    ),
    'DEFAULT_AUTHENTICATION_CLASSES': (
        'rest_framework_jwt.authentication.JSONWebTokenAuthentication',
        'rest_framework.authentication.SessionAuthentication',
    ),
    'DEFAULT_PERMISSION_CLASSES': (
        'rest_framework.permissions.IsAuthenticated',
    ),


# project/urls.py
url(r'^api/auth/token/', obtain_jwt_token),

登录序列化器并查看:

class UserLoginSerializer(ModelSerializer):
    token = CharField(allow_blank=True, read_only=True)
    class Meta:
        model = User
        fields = ('username', 'password', 'token')

    def validate(self, data):
        username = data.get('username',None)
        password = data['password']

        user = authenticate(username=username, password=password)
        if not user or not user.is_active:
            raise ValidationError("Invalid username/password.")

        # generate jwt token ??
        # data['token'] = generated jwt token??

        return data


class UserLoginAPIView(APIView):
    permission_classes = [AllowAny]
    serializer_class = UserLoginSerializer

    def post(self, request, *args, **kwargs):
        data = request.data
        serializer = UserLoginSerializer(data=data)
        if serializer.is_valid(raise_exception=True):
            new_data = serializer.data
            return Response(new_data, status=HTTP_200_OK)
        return Response(serializer.errors, status=HTTP_400_BAD_REQUEST)

那我该怎么办?

【问题讨论】:

【参考方案1】:

这就是我所做的。

from rest_framework_jwt.settings import api_settings


class LoginView(APIView):
    '''
    Post call for user login.
    '''

    def post(self, request, format=None):
        serializer = LoginSerializer(data=request.data)

        if serializer.is_valid():

            # Check if user has valid credentials and return user instance else None
            user = authenticate(username=serializer.validated_data['username'],
                                password=serializer.validated_data['password'])

            if user is not None:

                jwt_payload_handler = api_settings.JWT_PAYLOAD_HANDLER
                jwt_encode_handler = api_settings.JWT_ENCODE_HANDLER

                payload = jwt_payload_handler(user)
                token = jwt_encode_handler(payload)

                return Response('msg':'Login successful', 'token': token, 'is_login_success': True, status=status.HTTP_200_OK)
            else:
                return Response('msg': 'Credentials are not valid!', status=status.HTTP_400_BAD_REQUEST)
        else:
            return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)

但您不必这样做,因为您的 127.0.0.1:8000/api/auth/token/ 所做的几乎完全相同,除非您想在登录前记录一些内容。

如果您想了解更多关于obtain_jwt_token 视图如何工作的信息,JSONWebTokenSerializer 将为您提供帮助。

【讨论】:

以上是关于如何在登录过程中生成rest_framework_jwt token的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Zend Framework 中生成用于重置密码的随机密码或临时 URL?

如何在存储过程中生成新的 Guid?

如何从选项中生成变量:在 PHP $_POST 中选择?

如何使用存储过程在 SQL Server 中生成表的数据脚本文件?

如何在颤动中生成流

django rest_framework vue 实现用户登录