Python “DRF始终返回”;未提供身份验证凭据";

Python “DRF始终返回”;未提供身份验证凭据";,python,django,nginx,django-rest-framework,gunicorn,Python,Django,Nginx,Django Rest Framework,Gunicorn,更新:从Nginx配置中删除了set_头标记。意识到这无助于解决问题。我觉得问题在于Django没有得到正确的标题,他们在某个地方“迷失”了 我正在尝试为一个秘密圣诞老人项目创建一个RESTAPI。我将其设置为用户必须经过身份验证才能进行某些调用。这在我的本地机器上运行良好,但在任何地方托管时似乎都不起作用 我已经在Heroku和ubuntu服务器上试过了。然而,我更愿意让它在Ubuntu服务器上运行。我正在使用gunicorn和nginx为应用程序提供服务器,但在所有需要身份验证的呼叫中,我都

更新:从Nginx配置中删除了set_头标记。意识到这无助于解决问题。我觉得问题在于Django没有得到正确的标题,他们在某个地方“迷失”了

我正在尝试为一个秘密圣诞老人项目创建一个RESTAPI。我将其设置为用户必须经过身份验证才能进行某些调用。这在我的本地机器上运行良好,但在任何地方托管时似乎都不起作用

我已经在Heroku和ubuntu服务器上试过了。然而,我更愿意让它在Ubuntu服务器上运行。我正在使用gunicorn和nginx为应用程序提供服务器,但在所有需要身份验证的呼叫中,我都得到了“未提供身份验证凭据”。我正在使用TokenAuthentication,并在Authorization头中使用前缀token传递我的token

非常感谢您的帮助

设置.py

REST_FRAMEWORK = {
    'PAGINATE_BY': 30,
    'PAGINATE_BY_PARAM': 'per_page',
    'MAX_PAGINATE_BY': 1000,
    "DATETIME_FORMAT": "%Y-%m-%dT%H:%M:%S%z",
    'DEFAULT_RENDERER_CLASSES': (
        'rest_framework.renderers.JSONRenderer',
        'rest_framework.renderers.BrowsableAPIRenderer',
    ),
    'DEFAULT_PERMISSION_CLASSES': [
        'rest_framework.permissions.IsAuthenticated',
    ],
    'DEFAULT_AUTHENTICATION_CLASSES': (
        'rest_framework.authentication.TokenAuthentication',
    ),
}
class RoomViewSet(mixins.RetrieveModelMixin,
              viewsets.GenericViewSet):
"""
Creates, Updates, and retrives Rooms
"""

queryset = Room.objects.all()
serializer_class = RoomSerializer
permission_classes = (IsAuthenticated, )
lookup_field = 'slug'
视图.py

REST_FRAMEWORK = {
    'PAGINATE_BY': 30,
    'PAGINATE_BY_PARAM': 'per_page',
    'MAX_PAGINATE_BY': 1000,
    "DATETIME_FORMAT": "%Y-%m-%dT%H:%M:%S%z",
    'DEFAULT_RENDERER_CLASSES': (
        'rest_framework.renderers.JSONRenderer',
        'rest_framework.renderers.BrowsableAPIRenderer',
    ),
    'DEFAULT_PERMISSION_CLASSES': [
        'rest_framework.permissions.IsAuthenticated',
    ],
    'DEFAULT_AUTHENTICATION_CLASSES': (
        'rest_framework.authentication.TokenAuthentication',
    ),
}
class RoomViewSet(mixins.RetrieveModelMixin,
              viewsets.GenericViewSet):
"""
Creates, Updates, and retrives Rooms
"""

queryset = Room.objects.all()
serializer_class = RoomSerializer
permission_classes = (IsAuthenticated, )
lookup_field = 'slug'
gunicorn.conf

description "Gunicorn application server handling myproject"

start on runlevel [2345]
stop on runlevel [!2345]

respawn
setuid dannywilson
setgid www-data
chdir /storage/sites/secret_santa/

exec santa/bin/gunicorn --pythonpath="$PWD/secret_santa" --bind=unix:"$PWD/secret_santa/gunicorn.sock" wsgi:application
nginx配置

upstream test_server {
    server unix:/storage/sites/secret_santa/secret_santa/gunicorn.sock;
}

server {
    listen 80;
    server_name webaddress;

    access_log /storage/sites/_logs/secret_santa_api/nginx-access.log;
    error_log /storage/sites/_logs/secret_santa_api/nginx-error.log;

    location / {

        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header Host $http_host;
        proxy_redirect off;
        proxy_ignore_headers Cache-Control Expires Pragma;

        if (!-f $request_filename) {
            proxy_pass http://test_server;
            break;
        }

    }
}

这里有两件事让我印象深刻:

  • “proxy\u set\u header Token$http\u Token;”但我认为没有定义$http\u Token
  • 对标头使用“令牌”而不是“授权”。其中提到“为了让客户端进行身份验证,令牌密钥应该包含在授权HTTP头中。”

由于以下配置,它无法运行:

REST_FRAMEWORK = {
........
'DEFAULT_PERMISSION_CLASSES': [
    'rest_framework.permissions.IsAuthenticated',],
'DEFAULT_AUTHENTICATION_CLASSES': (
    'rest_framework.authentication.TokenAuthentication',),
}
如果不需要身份验证,请删除这两个配置,否则如果要使用
TokenAuthentication
,则需要将
rest\u framework.authtoken
添加到已安装的应用程序:

INSTALLED_APPS = (
...
'rest_framework.authtoken'
)
然后按照

中的说明进行操作,这可能会对您有所帮助():

注意,如果使用mod_wsgi部署到Apache,则授权 默认情况下,头不会传递给WSGI应用程序,因为它 假定身份验证将由Apache处理,而不是由 在应用程序级别

如果您要部署到Apache,并且使用任何非基于会话的 身份验证时,需要显式配置mod_wsgi以通过 将所需的标头发送到应用程序。这可以通过以下方式完成: 在适当的 上下文并将其设置为“开”

# this can go in either server config, virtual host, directory or .htaccess
WSGIPassAuthorization On

你到底要发送什么标题?只是一个带有标记的授权标题。你将标题命名为什么?授权,因为这在本地主机上起作用。尝试发送一个WWW AuthenticateI。我已安装的应用程序中有rest\u framework.authtoken。我的问题是,当我的API调用不在本地测试服务器上时,我无法对其进行身份验证。因此,如果它在本地服务器而不是远程服务器上运行良好,您可能会发现这里的解决方案很有帮助,我们都可以访问文档,如果你要引用一个,你至少应该在你的答案中包含解决这个问题的特定部分。