更新:从Nginx配置中删除了set_header令牌。意识到这并没有解决问题。我觉得问题在于Django没有获得正确的标头,并且它们在某处“丢失”。

我正在尝试为一个秘密圣诞老人项目创建REST api。我设置了它,以便用户必须进行身份验证才能进行某些呼叫。这在我的本地计算机上可以正常工作,但是在任何地方托管时似乎都无法正常工作。

我已经在Heroku和ubuntu服务器上尝试过。但是,我希望它可以在Ubuntu服务器上运行。我正在使用gunicorn和nginx来管理该应用程序,但在所有需要身份验证的呼叫上都得到了“未提供身份验证凭据”。我正在使用TokenAuthentication,并将我的令牌传递给带有前缀Token的Authorization标头。

任何帮助是极大的赞赏。

settings.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',
    ),
}


views.py

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_set_header令牌$ http_token;”但我认为$ http_token没有定义。
标头使用“令牌”而不是“授权”。 Documentation提到“为了使客户端进行身份验证,令牌密钥应包含在Authorization HTTP标头中”。

关于python - DRF始终返回“未提供身份验证凭据”,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/34223727/

10-12 16:59
查看更多