令牌授权 Django {"detail":"未提供身份验证凭据。"}

时间:2021-02-21 04:35:32

标签: django django-rest-framework bearer-token

我正在尝试在我的服务器 API 上实施基于令牌的授权。但是,当我触发查询时,它返回 {"detail": "Authentication credentials were not provided."}

我已经完成了各种帖子和 Django 文档中推荐的几乎所有设置。

在我的settings.py中:

INSTALLED_APPS = [
    'rest_framework.authtoken',
]

还有,

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

在我的视图文件中:

from rest_framework.authentication import TokenAuthentication
from rest_framework.permissions import IsAuthenticated


class UserList(generics.ListCreateAPIView):
    queryset = User.objects.all()
    serializer_class = UserSerializer
    authentication_classes = [TokenAuthentication]
    permission_classes = [IsAuthenticated]

在我的 WSGI 的 Apache 配置文件中

WSGIPassAuthorization On

RewriteEngine on
 RewriteCond %{HTTP:Authorization} ^(.*)
 RewriteRule .* - [e=HTTP-AUTHORIZATION:%1]

我不知道我是否遗漏了除此之外的任何内容。令牌是使用命令行在超级用户级别预先生成的。

2 个答案:

答案 0 :(得分:0)

您在浏览器中访问网站时看到的默认 Django Rest Framework HTML 不适用于令牌授权。这是因为您需要在发送请求时将 Authorization: Token <insert your token here> 放在标头中。这是一个问题,因为您填写的表单无法更改标题。

我建议使用 Postman(漂亮的 GUI)或 curl(命令)来测试您的 API,因为您需要编辑请求的 HTTP 标头。

答案 1 :(得分:0)

你见过this related S.O. question吗?

如果您使用的是 mod_wsgi,请省略 REWRITE 部分,将 WSGIPassAuthorization On 放在 WSGIScriptAliasWSGIDaemonProcessWSGIProcessGroup 指令下方。刚刚让我的 Apache + mod_wsgi 配置工作,看起来像这样:

...

    WSGIScriptAlias / /var/www/html/base/wsgi.py
    WSGIDaemonProcess django_app python-path=/var/www/html python-home=/var/www/html/env
    WSGIProcessGroup django_app
    WSGIPassAuthorization On

...