Учетные данные для аутентификации не были предоставлены django-rest-auth

#django #django-rest-framework #django-rest-auth

Вопрос:

У меня есть приложение, в котором я реализовал django restframework, а также django reat-auth и jango framework jwt. Я следовал инструкциям, и в браузере все работает нормально. Теперь я решил проверить соединение в postman и попытаться получить данные зарегистрированного пользователя, который является конечной /rest-auth/user точкой, но я получаю следующую ошибку

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

и я решил скопировать возвращенный токен и поместить его в заголовок URL-адреса пользователя как

 "Authorization": "Token ahagjbeghq7hbcvgqhvwqu08hevug.jwhhwiiwhw",
"Content-Type": "application/json; charset=utf-8"
 

после изменения заголовка с помощью возвращенного токена я ожидал, что в нем будут отображаться данные пользователя, но вместо этого я все равно получил

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

но я могу проверить правильность токена по URL-адресу, предоставленному jwt restframework

/api-token-verify что возвращает значение токена обратно. это мои классы аутентификации django rest

 REST_FRAMEWORK = {
    'DEFAULT_AUTHENTICATION_CLASSES': (
        'rest_framework_jwt.authentication.JSONWebTokenAuthentication',
        'rest_framework.authentication.TokenAuthentication',
        'rest_framework.authentication.BasicAuthentication',

    ),
    'DEFAULT_PERMISSION_CLASSES': (
        'rest_framework.permissions.AllowAny',
        'rest_framework.permissions.IsAuthenticatedOrReadOnly',

    ),

}
 

Ответ №1:

Вы должны использовать JWT вместо Token внутреннего Authorization заголовка для токена jwt:

 "Authorization: JWT <your_token>"
 

Комментарии:

1. он запросил, чтобы я ввел имя пользователя

2. @Король, я имею в виду, что ты должен сделать "Authorization": "JWT ahagjbeghq7hbcvgqhvwqu08hevug.jwhhwiiwhw",

Ответ №2:

Как уже упоминал @ JWT neverwalkaloner, ключевое слово предполагает значение авторизации в разделе заголовка Postman. Документы

Кроме того, если вы не хотите, чтобы JWT в качестве ключевого слова входил в ваш токен, вы можете настроить его в своих настройках: с помощью следующего ключа: JWT_AUTH_HEADER_PREFIX

 JWT_AUTH = {
    'JWT_ENCODE_HANDLER':
    'rest_framework_jwt.utils.jwt_encode_handler',

    'JWT_DECODE_HANDLER':
    'rest_framework_jwt.utils.jwt_decode_handler',

    'JWT_PAYLOAD_HANDLER':
    'rest_framework_jwt.utils.jwt_payload_handler',

    'JWT_PAYLOAD_GET_USER_ID_HANDLER':
    'rest_framework_jwt.utils.jwt_get_user_id_from_payload_handler',

    'JWT_RESPONSE_PAYLOAD_HANDLER':
    'rest_framework_jwt.utils.jwt_response_payload_handler',

    'JWT_SECRET_KEY': settings.SECRET_KEY,
    'JWT_GET_USER_SECRET_KEY': None,
    'JWT_PUBLIC_KEY': None,
    'JWT_PRIVATE_KEY': None,
    'JWT_ALGORITHM': 'HS256',
    'JWT_VERIFY': True,
    'JWT_VERIFY_EXPIRATION': True,
    'JWT_LEEWAY': 0,
    'JWT_EXPIRATION_DELTA': datetime.timedelta(days=1),
    'JWT_AUDIENCE': None,
    'JWT_ISSUER': None,

    'JWT_ALLOW_REFRESH': True,
    'JWT_REFRESH_EXPIRATION_DELTA': datetime.timedelta(days=7),  
    'JWT_AUTH_HEADER_PREFIX': 'Bearer', #this most commonly accepted way
    'JWT_AUTH_COOKIE': None,

}