我正在使用具有令牌认证的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上运行但是它不安全。 任何想法是什么问题以及如何解决它?
答案 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