Как войти в систему при использовании django-rest-knox? - PullRequest
0 голосов
/ 06 мая 2019

Django-Rest-Knox предоставляет представление, чтобы дать вам токен для аутентификации, но это представление требует аутентификации:

https://github.com/James1345/django-rest-knox/blob/05f218f1922999d1be76753076cf8af78f134e02/knox/views.py#L16

Как это предполагается использовать?

Следуя документации по настройке , мои настройки выглядят так:

REST_FRAMEWORK = {
    'DEFAULT_AUTHENTICATION_CLASSES': ('knox.auth.TokenAuthentication',),
}

Я пытался аутентифицироваться следующим образом:

fetch("http://localhost:8000/api-v1/auth/login/", {
    method: "POST",
    body: JSON.stringify({email: email, password: password}),
    headers: {
        "Accept": "application/json",
        "Content-Type": "application/json",
    }
}).then(result => result.json())
    .then(result => {
        console.log(result);
    });

но IsAuthenticated останавливает меня и показывает это сообщение:

Unauthorized: /api-v1/auth/login/

на стороне Django, и это на стороне JavaScript:

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

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

Просто для пояснения, у меня нет системы, в которой кто-то входит в веб-приложение, копирует и вставляет токен в другое приложение.В системе, которую я создаю, вы авторизуетесь напрямую через API с вашим именем пользователя и паролем, затем токен будет получен и сохранен для последующих запросов.

Очень похоже на то, как работает LastPass, что вы в первый разоткройте его, он попросит у вас адрес электронной почты и пароль (чтобы не идти и не получить токен с веб-сайта):

enter image description here

Вся цельLoginView от Knox состоит в том, чтобы генерировать и предоставлять этот токен в запросе API: https://github.com/James1345/django-rest-knox/blob/05f218f1922999d1be76753076cf8af78f134e02/knox/views.py#L30-L55

Это также то, насколько хорошо работает каждое мобильное приложение, а также SPA, в котором они запрашивают у вас пользователя / электронную почту ипароль для получения токена, а затем сохраните токен для дальнейших запросов.

Ответы [ 2 ]

0 голосов
/ 25 июня 2019

Вы должны выбрать способ аутентификации в окне входа в систему.Так что в первый раз вам нужно пройти аутентификацию с помощью одного из доступных методов аутентификации в Django.

Basic Auth является хорошим кандидатом для этого.

from knox.views import LoginView as KnoxLoginView
from rest_framework.authentication import BasicAuthentication
from rest_framework.permissions import IsAuthenticated


class LoginAPI(KnoxLoginView):
    authentication_classes = [BasicAuthentication]
    permission_classes = [IsAuthenticated]

А затем на внешнем интерфейсе:

const credentials = btoa(`${username}:${password}`);

fetch("http://localhost:8000/api-v1/auth/login/", {
   method: "POST",
   body: JSON.stringify({}),
   headers: {
        "Accept": "application/json",
        "Content-Type": "application/json",
        "Authorization": `Basic ${credentials}`
    }
}).then(result => console.log(result));
0 голосов
/ 25 мая 2019

Следуйте этому руководству.И вам придется разделить данные сериализатора, чтобы получить токен.

https://gist.github.com/AndrewPix/cdd9276b1d5683459b965d5cc4517b26

Например, ваш результат будет таким после входа в систему:

"(<AuthToken: 853d34ff808bf07c112b87bbc1bf59e3159fa6765f8bcd34b6376fbef08c9369e2b28a39ff868949e047de4a2164183cc1b16d61e87476129c18339dedee6ff0 : mdmd@gmail.com>, '326fe653946b99978900ae3820cb71f5eecf613ca71f8acde4e001a938bbba48')" 

ThisВаш токен:

326fe653946b99978900ae3820cb71f5eecf613ca71f8acde4e001a938bbba48

Не знаю, почему автор затруднил его получение.Вам просто нужно разобрать строку.

Любой, у кого есть лучшее решение, должен прислать ответ.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...