IT TIP

django rest_framework에 인증 헤더가 없습니다. 아파치가 비난받을까요?

itqueen 2021. 1. 6. 20:38
반응형

django rest_framework에 인증 헤더가 없습니다. 아파치가 비난받을까요?


TokenAuthentication요청 세션을 사용하여 토큰을 저장할 때 확장 하고 작동하는 모델이 있지만 여기설명 된대로Authorization 헤더 매개 변수 전달하려고 할 때 META 변수 HTTP_AUTHORIZATION없이 내 응답이 돌아온다는 것을 알았습니다. 또한 "Authorization2"를 헤더 매개 변수로 전달하면 요청에서 볼 수 있음을 알았습니다.

{
    '_content_type': '', 
    'accepted_media_type': 'application/json', 
    '_request': <WSGIRequest
        path:/api/test_auth/,
        GET:<QueryDict: {}>,
        POST:<QueryDict: {}>,
        COOKIES:{
            'MOD_AUTH_CAS_S': 'ba90237b5b6a15017f8ca1d5ef0b95c1',
            'csrftoken': 'VswgfoOGHQmbWpCXksGUycj94XlwBwMh',
            'sessionid': 'de1f3a8eee48730dd34f6b4d41caa210'
        },
        META:{
           'DOCUMENT_ROOT': '/etc/apache2/htdocs',
           'GATEWAY_INTERFACE': 'CGI/1.1',
           'HTTPS': '1',
           'HTTP_ACCEPT': '*/*',
           'HTTP_ACCEPT_CHARSET': 'ISO-8859-1,utf-8;q=0.7,*;q=0.3',
           'HTTP_ACCEPT_ENCODING': 'gzip,deflate,sdch',
           'HTTP_ACCEPT_LANGUAGE': 'en-US,en;q=0.8',
           'HTTP_AUTHORIZATION2': 'Token 9944b09199c62bcf9418ad846dd0e4bbdfc6ee4c',
           ...

내 첫 번째 추측은 인증 헤더가 아파치에 의해 제거되고 있으며 기본 인증 및 인증과 일치하지 않으면 아파치가 값을 버릴 것이라는 몇 가지 S / O 질문을 읽었지만 방법을 모르겠습니다. Authorization 헤더가 Django 및 WSGIRequest로 '통과'되도록합니다. 누구든지이 문제를 해결하는 방법을 알고 있습니까?

변경 사항이있는 경우 mod_auth_cas 및 mod_proxy도 사용합니다.


Apache 및 mod_wsgi를 사용하는 경우 공식 Django REST 프레임 워크 웹 사이트에서 이에 대한 쉬운 해결책을 찾았습니다.

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

질문 한 후 몇 분만에 답 해주셔서 죄송합니다. 그러나 결국 apache2였습니다! 웹을 크롤링하고 몇 가지 검색 결과를 살펴본 후 댓글에서 이것을 발견했습니다.

RewriteEngine on
RewriteCond %{HTTP:Authorization} ^(.*)
RewriteRule .* - [e=HTTP_AUTHORIZATION:%1]

내 conf 파일에 위의 줄을 추가하면 모든 문제가 해결되는 것 같았습니다! 이 기능이 사용자에게 도움이되기를 바랍니다.


어떤 종류의 Django / Apache 배포를했는지에 따라 다릅니다. "Authentication"HTTP 헤더를 전달할 수 있도록 올바른 Apache 모듈에 알려야합니다.

  • Apache / mod_wsgi :

    WSGIPassAuthorization On

  • Apache / mod_fcgid :

    FcgidPassHeader Authorization

In other words: many Apache modules filters "Authentication" HTTP header, so Django will not receive it. You have to be sure your Django App is receiving it in request.

See: django_rest doc and Apache fcgid doc.

NOTE: After modifying Apache configuration you'll need to restart apache daemon or tell to reload your .cgi file (i.e: touch my_site_fcgifile.fcgi).

ReferenceURL : https://stackoverflow.com/questions/13387516/authorization-header-missing-in-django-rest-framework-is-apache-to-blame

반응형