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

时间:2015-12-11 12:34:30

标签: python django nginx django-rest-framework gunicorn

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

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

我在Heroku和ubuntu服务器上试过了。但是,我更喜欢让它在Ubuntu服务器上运行。我正在使用gunicorn和nginx为应用程序提供服务,但我在所有需要身份验证的调用上都收到“身份验证凭据”。我正在使用TokenAuthentication并在Authorization标头中使用前缀Token传递我的令牌。

非常感谢任何帮助。

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 config

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;
        }

    }
}

3 个答案:

答案 0 :(得分:1)

这里有两件事让我感到震惊:

  • “proxy_set_header Token $ http_token;”但我认为$ http_token没有定义。
  • 标题使用“令牌”而不是“授权”。 Documentation提到“对于客户端进行身份验证,令牌密钥应包含在授权HTTP标头中。”

答案 1 :(得分:0)

因为以下配置:

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

如果您不需要身份验证,请删除此两个配置,否则如果您要使用TokenAuthentication,则需要将rest_framework.authtoken添加到已安装的应用中:

INSTALLED_APPS = (
...
'rest_framework.authtoken'
)

然后按照TokenAuthentication

中的说明操作

答案 2 :(得分:-1)

请参阅Apache mod_wsgi特定配置:

https://www.django-rest-framework.org/api-guide/authentication/