代码之家  ›  专栏  ›  技术社区  ›  Sebastien

django oauth工具包;django rest framework-未提供身份验证凭据

  •  1
  • Sebastien  · 技术社区  · 6 年前

    我的问题与 this one this one 但是对于一些重要的区别:对于第一个引用:我使用django oauth工具包,尽管与第二个引用不同,用户必须经过身份验证,因为这不是注册端点,而是上载端点。我已经用相同的设置成功地在同一个应用程序中实现了其他端点,并且它工作正常。

    例如:

    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。

    url中的“pk”参数显式引用其url指令中的相应项目id,这是一个小细节: path('projects/<uuid:pk>/upload/', views.uploadView.as_view(), name='upload'), 是的。但除此之外,据我所知,唯一的区别是解析器类。

    如果可以,我使用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值测试,项目id有效 http://localhost:8000/<prefix>/projects/<project id>/ 用get代替post不 --form 选择。

    为什么oauth2方案中的承载令牌在第一个示例中有效,但在第二个示例中无效?是和解析器有关还是别的什么?怎么解决呢?

    1 回复  |  直到 6 年前
        1
  •  1
  •   Sebastien    6 年前

    错误在curl指令中:默认的django oauth toolkit token关键字不是“token”,而是“bearer”。

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

    作品。