django-oauth-工具包; Django Rest Framework - 未提供身份验证凭据

Posted

技术标签:

【中文标题】django-oauth-工具包; Django Rest Framework - 未提供身份验证凭据【英文标题】:django-oauth-toolkit; Django Rest Framework - Authentication credentials were not provided 【发布时间】:2018-12-11 02:17:21 【问题描述】:

我的问题与 this one 和 this one 有关,但有一些显着差异:对于第一个参考:我使用 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。

URL 中的“pk”参数显式引用了相应的项目 ID,因为它的 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/。项目 ID 有效,经测试,$URL 值为 http://localhost:8000/<prefix>/projects/<project id>/,使用 GET 而不是 POST,没有 --form 选项。

为什么 oauth2 方案中的 Bearer 令牌在第一个示例中有效,而在第二个示例中无效?它与解析器或其他东西有关吗?以及如何解决?

【问题讨论】:

【参考方案1】:

错误在curl指令中:默认django-oauth-toolkit令牌关键字不是“Token”而是“Bearer”。

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

有效。

【讨论】:

以上是关于django-oauth-工具包; Django Rest Framework - 未提供身份验证凭据的主要内容,如果未能解决你的问题,请参考以下文章

Swift Alamofire 上的 Django oauth2 令牌请求失败

Django/tastypie 实现中的 OAuth 2.0 客户端 ID

[Django] 如何在Django中使用前端工具链

Django----admin管理工具

Django admin管理工具

Django Admin 管理工具