У меня проблема с отправкой / получением запросов после входа в 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,)
Я тестировал как с почтальоном, так и с завитком, но получаю ту же ошибку. Не уверен, есть ли ошибка с форматом заголовка или есть что-то еще, что мне не хватает. Любая помощь будет принята с благодарностью!
Обновлено: Я изменил свои настройки на
'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."
Токен jwt зашифрован и подписан с использованием секрета. Когда вы создаете собственный токен с помощью jwt.encode и используете секрет как «SECRET_KEY», тогда тот же ключ необходимо использовать для декодирования. Imp. «SECRET_KEY» - это строка. Обратитесь к ответу, который я опубликовал ниже, и добавьте переменную секретного ключа в свой файл настроек.





Проблема в том, что вы кодируете 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 и создать свою собственную.
Мне удалось решить свою проблему. При аутентификации пользователя я проверял созданную мной ранее настраиваемую таблицу user, которая отличалась от таблицы auth_user в django. Я изменил настройки django, чтобы использовать мою настраиваемую таблицу пользователей, а затем использование токена из аутентификации сработало и для других запросов.
AUTH_USER_MODEL = 'main.User'
@JPG вот в чем дело, я получаю ту же ошибку, когда пытаюсь ее проверить