带令牌认证的django-restframework在apache上返回401

时间:2016-06-18 06:26:06

标签: django-rest-framework

我正在使用具有令牌认证的django restframework。 当我在django开发服务器上运行它时工作正常,但是当我在apache上运行它时,它失败并出现401身份验证错误。

# settings.py
REST_FRAMEWORK = {
    'DEFAULT_AUTHENTICATION_CLASSES': (
        'rest_framework.authentication.TokenAuthentication',
        'rest_framework.authentication.SessionAuthentication',
        'rest_framework.authentication.BasicAuthentication',
    )
}

INSTALLED_APPS = (
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.sites',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'myapp',
    'django.contrib.admin',
    'rest_framework',
    'rest_framework.authtoken',
)

@api_view(['GET', 'POST'])
@authentication_classes((TokenAuthentication, SessionAuthentication, BasicAuthentication))
@permission_classes((IsAuthenticated,))
@staff_member_required
def api(request):
    params = request.data
    res = rest_api.get_data(params)
    return HttpResponse(json.dumps(res), content_type="application/json")

如果我删除

@permission_classes((IsAuthenticated,))
@staff_member_required

它可以在apache上运行但是它不安全。 任何想法是什么问题以及如何解决它?

1 个答案:

答案 0 :(得分:4)

Apache mod_wsgi特定配置

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

如果要部署到Apache,并使用任何非基于会话的身份验证,则需要显式配置mod_wsgi以将所需的标头传递给应用程序。这可以通过在适当的上下文中指定WSGIPassAuthorization指令并将其设置为“On”来完成。

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

WSGIPassAuthorization On