JSON Web Token для Django REST не будет аутентифицироваться в пользовательской базе данных

У меня есть рабочий бэкэнд Django REST API. Раньше я использовал аутентификацию сеанса, но хотел бы перейти на токен на основе масштабирования на нескольких серверах. Я исследую это уже пару дней, и я не нашел ответа на свою проблему. Я добавил пакет djangorestframework-jwt в свое приложение, но когда я пытаюсь пройти аутентификацию, он всегда возвращает:

{"non_field_errors":["Unable to login with provided credentials."]}

Я вижу в пакете jwt, где находится эта ошибка, и могу проследить код обратно через процесс аутентификации. Я не вижу никаких ошибок в процессе авторизации. Когда я пытаюсь создать пользователя с этими учетными данными, он говорит, что пользователь уже существует, поэтому я знаю, что он попадает в правильную таблицу пользователей. Я не уверен, почему конечная точка get_jwt_token не будет аутентифицировать мои учетные данные. Ниже приведены соответствующие разделы моего приложения django. Любая помощь будет принята с благодарностью. Если я упускаю что-то, что могло бы помочь разобраться в этом, пожалуйста, дайте мне знать, и я загружу это. Спасибо,

приложение/settings.py

REST_FRAMEWORK = {
'DEFAULT_PERMISSION_CLASSES': (
    'rest_framework.permissions.IsAuthenticated',
    ),
'DEFAULT_AUTHENTICATION_CLASSES': (
    'rest_framework_jwt.authentication.JSONWebTokenAuthentication',
    ),
'DEFAULT_PAGINATION_CLASS': 'rest_framework.pagination.LimitOffsetPagination',
'PAGE_SIZE': 100,}

приложение/urls.py

urlpatterns = patterns('',
# Api
url(r'^api/', include(router.urls)),
url(r'^api/stats', statsviews.StatsView.as_view()),
url(r'^api/testing', statsviews.TestView.as_view()),
url(r'^api/login', 'rest_framework_jwt.views.obtain_jwt_token'),
url(r'^api/logout', logout, {'next_page': '/api/login'}),
url(r'^api-auth/', include('rest_framework.urls', namespace='rest_framework')),
)

команда скручивания

curl -d "[email protected]&password=test123" http://webhost.mywebsite.com:8080/api/login/

person joed4no    schedule 01.11.2015    source источник
comment
Вы добавили rest_framework_jwt в свой список INSTALLED_APPS?   -  person Adam_O    schedule 02.11.2015
comment
Ничто в документации не говорит о том, что его нужно добавить в INSTALLED_APPS. Я просто говорю добавить его в DEFAULT_AUTHENTICATION_CLASS   -  person joed4no    schedule 02.11.2015
comment
Добавьте rest_framework_jwt в ваши установленные приложения. По какой-то причине они оставили это вне документации.   -  person user1042361    schedule 02.11.2015
comment
@joed4no django-rest-jwt по умолчанию использует имя пользователя для входа в систему, похоже, вы используете электронную почту   -  person ofnowhere    schedule 17.12.2015
comment
У меня была та же проблема, и это было связано с тем, как пароли хранились в моей пользовательской модели. Можете ли вы войти в систему с помощью суперпользователя, созданного с помощью manage.py? Если это так, посмотрите, как их пароль хранится в admin по сравнению с паролем вашего пользовательского пользователя. Если пароль вашего пользовательского пользователя не был хэширован, попробуйте скопировать пароль от вашего суперпользователя второму пользователю. Теперь попробуйте получить токен для пользовательского пользователя, используя пароль вашего суперпользователя.   -  person Jad S    schedule 17.01.2017


Ответы (2)


У меня очень похожая установка с вами. Простое приложение, использующее ванильную аутентификацию DRF JWT. Единственная разница, которую я могу сказать, заключается в том, что у меня есть rest_framework_jwt, включенный в мой список INSTALLED_APPS:

INSTALLED_APPS = (
    ...
    # Third Party Dependencies
    'rest_framework',
    'rest_framework_jwt',
    'corsheaders',
    ....

Попробуйте добавить это и посмотрите, к чему это приведет.

person Adam_O    schedule 02.11.2015
comment
Это никуда меня не привело - person Kakaji; 12.05.2017

Я тоже столкнулся с той же проблемой и, наконец, нашел выход.

следуя краткому руководству (http://www.django-rest-framework.org/tutorial/quickstart/), используя python manage.py migrate для создания структуры таблицы; используя python manage.py createsuperuser для создания начального пользователя с именем admin и паролем «password123»; (внимание: пароли в гайдах не совпадают)

теперь должно быть нормально.

$ curl -X POST -d "username=admin&password=password123" http://127.0.0.1:8000/api-token-auth/
{"token":"eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VybmFtZSI6ImFkbWluIiwidXNlcl9pZCI6MiwiZW1haWwiOiJhZG1pbkA3amdvLmNvbSIsImV4cCI6MTQ3MDY0NjY4Mn0.Dg4KW5pHHJfuaRzjqHTu8kYIzkq8js9}
person Howard    schedule 08.08.2016
comment
Это сработало, но почему это не работает с пользователями, созданными с помощью API? Пароль сохраняется таким же образом. - person Kakaji; 12.05.2017