Django Rest Framework: авторизация JWT не удалась - PullRequest
0 голосов
/ 18 февраля 2019

У меня есть приложение, написанное с использованием Django REST Framework (DRF).Кроме того, существуют такие зарегистрированные конечные точки:

from refreshtoken.views import delegate_jwt_token
from rest_framework_jwt.views import obtain_jwt_token

urlpatterns = [
    path('api-token-auth/', obtain_jwt_token),
    path('api-auth/', include('rest_framework.urls', namespace='rest_framework')),
    path(r'refresh-token', delegate_jwt_token, name='refresh-token'),
]

Также есть некоторые конечные точки, для которых требуется авторизация.

Итак, я пытаюсь извлечь свой токен с помощью curl клиента:

curl -X POST -H "Content-Type: application/json" http://127.0.0.1:8000/api-token-auth/ -d '{"username": "test", "password": "testpassword"}'

Возвращает что-то вроде этого:

{"token":"eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJ1c2VyX2lkIjoiYTdlMmIyMjItZTZkNy00NjhiLTkxNzYtOTE2YzAwZWRhY2E2IiwidXNlcm5hbWUiOiJ0ZXN0IiwiZXhwIjoxNTUwNTEwNDAwLCJlbWFpbCI6InRlc3RAZHhhbXBsZS5jb20iLCJpc19zdGFmZiI6ZmFsc2UsImdyb3VwcyI6W10sInN1YnNjcmliZWQiOmZhbHNlLCJ0ZWxlZ3JhbV9zdWJzY3JpYmVkIjpmYWxzZX0.OExR9TlO3GUisYAu_D86CJ6hgF1EcofpQA0MZ1ENT2c","refresh_token":"1ab03e609d7a7ae05ce104c73858a346a0438e72"}

Затем, используя этот токен, я хочу войти в систему, используя токен:

curl -X POST -H "Authorization: JWT eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJ1c2VyX2lkIjoiYTdlMmIyMjItZTZkNy00NjhiLTkxNzYtOTE2YzAwZWRhY2E2IiwidXNlcm5hbWUiOiJ0ZXN0IiwiZXhwIjoxNTUwNTEwNDAwLCJlbWFpbCI6InRlc3RAZHhhbXBsZS5jb20iLCJpc19zdGFmZiI6ZmFsc2UsImdyb3VwcyI6W10sInN1YnNjcmliZWQiOmZhbHNlLCJ0ZWxlZ3JhbV9zdWJzY3JpYmVkIjpmYWxzZX0.OExR9TlO3GUisYAu_D86CJ6hgF1EcofpQA0MZ1ENT2c" -H "Content-Type: application/json" http://127.0.0.1:8000/api-auth/login/ -d '{"username": "test", "password": "testpassword"}'

Возвращает 403 (Forbidden) Ошибка проверки CSRF.Запрос прерван.

Почему я делаю неправильно?

Здесь есть один интересный момент:

Каждый запрос токена возвращает новый токен для одного и того же пользователя: пара паролей (ожидается или мой токен слишком быстро истекает?)

1 Ответ

0 голосов
/ 18 февраля 2019

Когда у вас есть токен, вам не нужно передавать учетные данные для входа или переходить по URL-адресу входа, как вы пытаетесь, токен обеспечит аутентификацию.Попробуйте получить доступ к защищенному URL-адресу, как в примере docs :

Теперь для доступа к защищенным URL-адресам необходимо включить заголовок Authorization: JWT.

$ curl -H "Authorization: JWT <your_token>" http://localhost:8000/protected-url/

Убедитесь, что вы добавили 'rest_framework_jwt.authentication.JSONWebTokenAuthentication' к 'DEFAULT_AUTHENTICATION_CLASSES', как в документах.

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

По поводу вашего последнего вопроса:

Каждый запрос на токен возвращаетсяновый токен для того же пользователя: пара паролей (ожидается или мой токен слишком быстро истекает)?

Ожидается, что каждый раз, когда вы звоните /api-token-auth/, вы генерируете новый.Срок действия по умолчанию составляет 5 минут, вы можете изменить его в настройках, используя JWT_EXPIRATION_DELTA.Проверьте дополнительные настройки .

...