Учетные данные для аутентификации не были предоставлены с Django Rest Framework JWT - PullRequest
0 голосов
/ 15 сентября 2018

У меня проблемы с реализацией аутентификации токена с помощью JWT в инфраструктуре отдыха Django с интерфейсом Typscript.Я получаю

{detail: "Учетные данные для аутентификации не были предоставлены."}

с моим вызовом API через Typescript, а именно:

  readonly BASE_URL = 'http://127.0.0.1:8000/'
  api_url = this.BASE_URL + 'items/'
  auth_url = this.BASE_URL + "api-token-auth/"

  getItemsService(token) {
    const headers = new HttpHeaders()
    headers.append('Content-Type', 'application/json')
    headers.append('Authorization', 'JWT ' + token.token)
    return this.http.get(this.api_url, {headers: headers})
  }

Вход в систему работает нормально.Когда я пытаюсь загрузить предметы, у меня возникают проблемы.

Вот мой код Django:

views.py

from rest_framework import generics
from .models import Item
from .serializers import ItemSerializer


class ItemList(generics.ListCreateAPIView):
    queryset = Item.objects.all()
    serializer_class = ItemSerializer


class ItemDetail(generics.RetrieveUpdateDestroyAPIView):
    queryset = Item.objects.all()
    serializer_class = ItemSerializer

items / urls.py

from django.urls import path
from .views import ItemList, ItemDetail

urlpatterns = [
    path('', ItemList.as_view()),
    path('<int:pk>/', ItemDetail.as_view()),
]

project / urls.py

from django.contrib import admin
from django.urls import include, path
from rest_framework_jwt.views import obtain_jwt_token

urlpatterns = [
    path('items/', include('groceries.urls')),
    path('admin/', admin.site.urls),
    path('api-auth/', include('rest_framework.urls')),
    path('api-token-auth/', obtain_jwt_token),
]

settings.py

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

Я думал, что проблема должна быть с Джанго, но я могу получить то, чтоЯ ожидаю с

curl -H "Authorization: JWT <token>" http://localhost:8000/items/

Если мой бэкэнд был настроен неправильно, это не сработает.Так что это должен быть мой код интерфейса.

1 Ответ

0 голосов
/ 30 ноября 2018

Исходя из того, что вы описали, это может быть проблемой CORS. Потому что у вас есть доступ к конечной точке API через команду curl. Но не с браузером.

Cross-Origin Resource Sharing (CORS) - это механизм, который использует дополнительные заголовки HTTP, чтобы сообщить браузеру, что веб-приложение, работающее в одном источнике (домене), имеет разрешение на доступ к выбранным ресурсам с сервера в другом источнике. Веб-приложение отправляет HTTP-запрос с несколькими источниками, когда оно запрашивает ресурс, источник которого (домен, протокол и порт) отличается от своего собственного источника.

Я проверил твой англоязычный машинописный код. Кажется, все в порядке. Я предлагаю следовать нижеприведенным инструкциям в вашем проекте django и посмотреть, как это происходит:

1) установить его для пункта с помощью команды pip install django-cors-headers.

2) В файле settings.py добавьте это приложение в установленные приложения:

INSTALLED_APPS = (
...
'corsheaders',
...
)

3) Вам также нужно добавить класс промежуточного программного обеспечения для прослушивания ответов:

MIDDLEWARE = [  # Or MIDDLEWARE_CLASSES on Django < 1.10
...
'corsheaders.middleware.CorsMiddleware',
'django.middleware.common.CommonMiddleware',
...
]

Помните, что CorsMiddleware должен располагаться как можно выше.

4) Добавьте эту строку в ваш файл settings.py.

CORS_ORIGIN_ALLOW_ALL = True

для полной документации см. django-cors-headers .

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