Джанго-OAuth-инструментарий; Django Rest Framework - учетные данные для аутентификации не предоставлены - PullRequest
0 голосов
/ 02 июля 2018

Мой вопрос связан с этим и этим , но с некоторыми существенными отличиями: для первой ссылки: я использую django-oauth-toolkit, хотя в отличие от второй ссылки, Пользователь ДОЛЖЕН быть аутентифицирован, поскольку это не конечная точка регистрации, а конечная точка загрузки. Я успешно реализовал другие конечные точки в том же приложении с той же настройкой, и она работает надлежащим образом.

Например:

class projectsView(mixins.ListModelMixin,
                  mixins.CreateModelMixin,
                  generics.GenericAPIView):
    queryset = Project.objects.all()
    serializer_class = ProjectSerializer

    def get(self, request, *args, **kwargs):
        return self.list(request, *args, **kwargs)

    def post(self, request, *args, **kwargs):
        return self.create(request, *args, **kwargs)

    def perform_create(self, serializer):
        serializer.save(owner=self.request.user)

и его модель, сериализатор и URL работают как положено. Однако этот:

 class uploadView(mixins.ListModelMixin,
                  mixins.CreateModelMixin,
                  generics.GenericAPIView):

     queryset = FileUpload.objects.all()
     parser_classes = (MultiPartParser, FormParser,) #(FileUploadParser,)
     serializer_class = FileUploadSerializer

     def post(self, request, *args, **kwargs):
         print(request.data['file'])
         return self.create(request, *args, **kwargs)

     def perform_create(self, serializer):
         serializer.save(owner=self.request.user, project_id=self.kwargs['pk'],
                      file=self.request.data['file'])

Не так, как возвращает {"detail":"Authentication credentials were not provided."} с кодом 401.

Есть небольшая деталь, что параметр "pk" из url явно указывает на соответствующий идентификатор проекта из инструкции url: path('projects/<uuid:pk>/upload/', views.uploadView.as_view(), name='upload'),. Но кроме этого, насколько я могу судить, единственное отличие - это parser_classes.

Я использую curl для локального тестирования на моем компьютере, если это работает, и вот инструкция curl:

curl \
        -vvv \
        -X POST \
        --form "file=@$FILE_NAME" \
        --header "Authorization: Token $(cat token)" \
        "$URL"

Где $FILE_NAME - это файл Excel в этом случае, а $URL имеет значение http://localhost:8000/<prefix>/projects/<project id>/upload/. Идентификатор проекта действителен в соответствии с тестом со значением $ URL http://localhost:8000/<prefix>/projects/<project id>/ с GET вместо POST и без опции --form.

Почему токен Bearer из схемы oauth2 работает в первом примере, а не во втором? Это связано с парсерами или с чем-то еще? И как это исправить?

1 Ответ

0 голосов
/ 02 июля 2018

Ошибка в инструкции curl: ключевым словом токена django-oauth-toolkit по умолчанию является не "Token", а "Bearer".

curl \
    -vvv \
    -X POST \
    --form "file=@$FILE_NAME" \
    --header "Authorization: Bearer $(cat token)" \
    "$URL"

работает.

...