example - django.request: Prohibido(la comprobación del remitente ha fallado, no hay un Referer).
request.post django example (1)
Estoy desarrollando una aplicación web usando AWS y Django Rest Framework. (Django: v1.8, DRF: v3) He seguido obteniendo django.request: Forbidden (Referer checking failed - no Referer.)
para la solicitud de formulario multiparte de POST.
Estoy usando AWS ELB (equilibrador de carga elástico), NGINX en mi ec2 (en el grupo de autocorrección) y Gunicorn.
La configuración del oyente AWS ELB es la siguiente (solo HTTPS):
elb https solo configuración de escucha
La configuración NGINX es como a continuación:
user nginx;
worker_processes auto;
error_log /var/log/nginx/error.log;
pid /var/run/nginx.pid;
events {
worker_connections 1024;
}
http {
include /etc/nginx/mime.types;
default_type application/octet-stream;
log_format main ''$remote_addr - $remote_user [$time_local] "$request" ''
''$status $body_bytes_sent "$http_referer" ''
''"$http_user_agent" "$http_x_forwarded_for"'';
access_log /var/log/nginx/access.log main;
sendfile on;
tcp_nopush on;
tcp_nodelay on;
keepalive_timeout 65;
types_hash_max_size 2048;
include /etc/nginx/conf.d/*.conf;
index index.html index.htm;
upstream my_server {
server localhost:8000;
}
server {
listen 80;
server_name <server name>;
access_log /etc/nginx/log/local-wc.access.log;
error_log /etc/nginx/log/local-wc.error.log;
root /usr/share/nginx/html;
location /api/v1 {
proxy_pass http://my_server/api/v1;
proxy_redirect off;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Protocol $scheme;
}
}
}
<server name>
es el CNAME que apunta a elud el nombre DNS.
En otras palabras, <server name>
=> xxxx-123456789.us-west-2.elb.amazonaws.com (Un registro). Cada llamada API se realiza mediante https://<server name>/api/v1/*
Finalmente Gunicorn está corriendo por: gunicorn my_django_app.wsgi:application -w 1 -b 127.0.0.1:8000 -t 300 --max-requests=100
y el ajuste de Django es:
ALLOWED_HOSTS = [''*'']
SECURE_PROXY_SSL_HEADER = (''HTTP_X_FORWARDED_PROTO'', ''https'')
MIDDLEWARE_CLASSES = (
''django.contrib.sessions.middleware.SessionMiddleware'',
''django.middleware.common.CommonMiddleware'',
''django.middleware.csrf.CsrfViewMiddleware'',
''django.contrib.auth.middleware.AuthenticationMiddleware'',
''django.contrib.auth.middleware.SessionAuthenticationMiddleware'',
''django.contrib.messages.middleware.MessageMiddleware'',
''django.middleware.security.SecurityMiddleware'',
)
La función de vista es la siguiente (con CSRF exento):
class UserViewSet(CsrfExemptMixin, mixins.CreateModelMixin,
mixins.ListModelMixin,
mixins.RetrieveModelMixin,
mixins.UpdateModelMixin,
viewsets.GenericViewSet):
# already tried @csrf_exempt
def create(self, request, *args, **kwargs):
self.parser_classes = (FormParser, MultiPartParser, )
.........
Problema nuevamente
Cuando envío
curl -i -k -X POST -H "Accept: application/json" /
-F "[email protected]" /
-F "[email protected]" /
https://<server name>/api/v1/users/
y en mi registro de Django:
[WARNING] django.request: Forbidden (Referer checking failed - no Referer.): /api/v1/users/
Funcionó con POST en el método HTTP o GET en HTTPS.
Me pregunto si la configuración de ELB es incorrecta o Nginx Configuration está equivocada con el referer ... Agradecería si alguien me ayudara a resolver este problema ...
Creo que DRF ignora el decorador csrf_exempt y no estoy seguro de dónde se define CsrfExemptMixin. Lo más fácil que puede hacer es agregar Referrer: yourhost
a sus encabezados curl.