Django Rest Framework JWT Auth - PullRequest
       10

Django Rest Framework JWT Auth

0 голосов
/ 26 сентября 2018

У меня проблема с отправкой / получением каких-либо запросов после входа в JWT.(Я использую библиотеку djangorestframework-jwt ) Пользователь успешно входит в систему, приложение возвращает токен json, но когда я использую этот токен для следующих запросов, я получаю

{
    "detail": "Authentication credentials were not provided."
}

settings.py

REST_FRAMEWORK = {
    'DEFAULT_PERMISSION_CLASSES': (
        'rest_framework.permissions.IsAuthenticated',
    ),
    'DEFAULT_AUTHENTICATION_CLASSES': (
        'rest_framework.authentication.SessionAuthentication',
        'rest_framework.authentication.BasicAuthentication',
    ),
}

JWT_AUTH = {
    'JWT_ALLOW_REFRESH': True,
    'JWT_EXPIRATION_DELTA': datetime.timedelta(hours=1),
    'JWT_REFRESH_EXPIRATION_DELTA': datetime.timedelta(days=7),
}

Представление входа в систему

def post(self, request, format=None):

    if not request.data:
        return Response({'Error': "Please provide username/password"},  status=status.HTTP_400_BAD_REQUEST)

    username = request.data['username']
    password = request.data['password']

    try:
        user = User.objects.get(email=username, password=password)
    except User.DoesNotExist:
        return Response({'Error': "Invalid username/password"}, status=status.HTTP_400_BAD_REQUEST)

    if user:
        payload = {
            'id': user.id,
            'email': user.email,
            'first_name': user.first_name
        }

        jwt_token = jwt.encode(payload, "SECRET_KEY")  # to be changed

        return Response({'token': jwt_token}, status=status.HTTP_200_OK)

, а затем все остальные представления содержат

 authentication_class = (JSONWebTokenAuthentication,)
 permission_classes = (IsAuthenticated,)

IЯ проверил как с почтальоном, так и с curl, но получаю ту же ошибку.Не уверен, если есть ошибка с форматом заголовка или есть что-то еще, что я пропускаю.Любая помощь будет принята с благодарностью!

enter image description here

РЕДАКТИРОВАТЬ: я изменил свои настройки на

'DEFAULT_AUTHENTICATION_CLASSES': (
    'rest_framework_jwt.authentication.JSONWebTokenAuthentication',
    'rest_framework.authentication.SessionAuthentication',
    'rest_framework.authentication.BasicAuthentication',
),

, но теперь я получаю это

{
    "detail": "Error decoding signature."
}

РЕДАКТИРОВАТЬ: Я думаю, проблема в том, что jwt_token = jwt.encode(payload, 'SECRET_KEY') может вернуть токен, который не распознан ... если я использую токен, сгенерированный obtain_jwt_token, тогда я могу запросить любую конечную точку.Кто-нибудь может объяснить это?

РЕДАКТИРОВАТЬ: поэтому я изменил на jwt_token = jwt_encode_handler(payload), и файл настроек содержит JWT_SECRET_KEY (когда я проверяю токен, который получаю после входа в систему на jwt, это действительно правильный токен с правильной полезной нагрузкой и секретом)но это все еще не распознано "detail": "Invalid signature."

Ответы [ 2 ]

0 голосов
/ 27 сентября 2018

Мне удалось решить мою проблему.При аутентификации пользователя я сверялся с созданной ранее пользовательской таблицей user, которая отличалась от таблицы auth_user django.Я изменил настройки django для использования моей пользовательской таблицы пользователей, а затем с помощью токена аутентификации работал и для других запросов.

AUTH_USER_MODEL = 'main.User'

0 голосов
/ 26 сентября 2018

Проблема в том, что вы кодируете JWT с помощью «SECRET KEY» и декодируете с помощью другого ключа.Секретный ключ по умолчанию, используемый jwt, - settings.SECRET_KEY.Но когда вы создаете собственный токен jwt, вы используете строку в качестве секретного «SECRET_KEY».Но вы используете стандартную проверку jwt, которая автоматически использует settings.SECRET_KEY.Поэтому добавьте 'JWT_SECRET_KEY': settings.SECRET_KEY, в настройки JWT и используйте этот ключ для кодирования и декодирования.Например:

jwt_token = jwt.encode(payload, settings.SECRET_KEY)

или вы можете отменить проверку jwt и создать свою собственную.

...