Django Rest Framework中的JWT身份验证错误“无效签名”

时间:2017-10-16 16:41:50

标签: django django-rest-framework jwt

我是Python和Django REST Framework的新手,我正在尝试使用JWT(http://getblimp.github.io/django-rest-framework-jwt/)配置身份验证。我可以在注册时为用户创建令牌,但是当我尝试通过我的api进行身份验证时,我收到“无效签名”错误。我已在https://jwt.io/确认错误。这似乎意味着我的令牌正在被不正确地创建。任何想法?

这是我的配置:

from django.db import models

class User(models.Model):
    first_name = models.CharField(max_length=45)
    last_name = models.CharField(max_length=45)
    username = models.CharField(max_length=45, unique=True)
    phone = models.CharField(max_length=20)
    password = models.CharField(max_length=100, blank=False, default='')

from rest_framework import serializers
from . models import User
from django.contrib.auth.hashers import make_password

class UserSerializer(serializers.ModelSerializer):
    class Meta:
        model = User
        fields = ('id', 'first_name', 'last_name', 'username', 'phone', 
'password')
    extra_kwargs = {'password': {'write_only': True}}
    def create(self, validated_data):
        # the create method creates and saves an object in a single statement
        user = User.objects.create(
            first_name = validated_data['first_name'],
            last_name = validated_data['last_name'],
            username = validated_data['username'],
            phone = validated_data['phone'],
            password = make_password(validated_data['password']),
        )

        return user

from joyrides_api.models import User
from joyrides_api.serializers import UserSerializer
from rest_framework.response import Response
from rest_framework.views import APIView
from rest_framework import status
from rest_framework_jwt.utils import jwt_payload_handler
from rest_framework import permissions
from rest_framework_jwt.settings import api_settings
from rest_framework.permissions import AllowAny
from rest_framework_jwt.authentication import JSONWebTokenAuthentication

class UserList(APIView):

    permission_classes = (AllowAny,)
    # this method creates the user
    def post(self, request, format=None):
            serializer = UserSerializer(data=request.data)
            if serializer.is_valid():
                # the save method calls serializer's create method
                user = serializer.save()
                if user:
                    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)
                    json = serializer.data
                    json['token'] = token
                    return Response(json, status=status.HTTP_201_CREATED)

            return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)

3 个答案:

答案 0 :(得分:1)

您还需要指定authentication_classes。 让它为空,它应该有效。

答案 1 :(得分:0)

我遇到的问题是当我使用django.db.model创建方法创建用户时:

from . models import User

def create(self, validated_data):
        user = User.objects.create(
            first_name = validated_data['first_name'],
            ...
        )

        return user

我还没有在django.contrib.auth.models的Django用户模型中创建用户,这是Django和JWT框架用于身份验证的模型。对于一个初学者来说,这并不是那么简单,考虑到JWT与Django的普及,我觉得这并不是一个更大的问题(或者看起来似乎如此)。我想有人会告诉我,我应该花更多时间在文档中。

我离题了,优雅的解决方法是通过扩展django.contribut.auth.models的AbstractUser来定制您的用户模型,我相信它将用户模型的相关部分链接到Django的模型。这里的说明:https://docs.djangoproject.com/en/1.11/topics/auth/customizing/

我为启动并运行而做的选项(虽然我计划尽快切换到自定义模型)是使用django.contrib.auth.models的create_user方法将用户对象保存到Django用户模型上面的create方法,除了它保存到Django的用户模型。

答案 2 :(得分:0)

我发现在创建自定义用户模型时出现“无效签名”错误。我通过以下方法解决了这个问题:

  1. 实例化基于Django用户模型的模型:

``

from django.db import models
from django.contrib.auth.models import AbstractUser

class User(AbstractUser):
    .....

``

  1. 在settings.py中,使用AUTH_USER_MODEL指向自定义用户模型。

``

AUTH_USER_MODEL = 'user.User'

``

其中“ user.User”指向用户应用程序中的用户模型。

继续进行令牌生成。令牌将立即生效。