2011-08-27 28 views
13

Duplicar posible:
"CSRF token missing or incorrect" while post parameter via AJAX in DjangoJQuery + AJAX + Django = CSRF?

que quería enviar datos de acceso por AJAX para autenticar el usuario, pero no fue posible debido a CSRF. ¿Podría decirme qué agregar a mi código para que funcione?

mi archivo JavaScript:

$("#login").live("click", function() { 
    var username = $(".login_username").val(); 
    var password = $(".login_password").val(); 

    $.ajax({ 
     url: "/login", 
     type: "POST", 
     data: { 
      username: username, 
      password: password 
     }, 
     cache: false, 
     success: function(tekst) { 
      alert(tekst); 
     } 
    }); 
}); 
+0

Creo que puede encontrar su respuesta [aquí] (https://docs.djangoproject.com/en/dev/ref/contrib/csrf/). La solución más simple parece estar deshabilitando la protección CSRF en la instancia de django. La siguiente mejor opción es actualizar su inicio de sesión de JavaScript para tomar el token CSRF de django del formulario e incluirlo como parte de la solicitud de AJAX. – aroth

+1

Eche un vistazo a mi respuesta anterior. http://stackoverflow.com/questions/6506897/csrf-token-missing-or-incorrect-while-post-parameter-via-ajax-in-django/6533544#6533544 – sigurd

Respuesta

10

Hay una method explained here.

Consiste en agregar un encabezado X-CSRFToken en cada solicitud de ajax.

Esto se hace conectando el evento jQuery.ajaxSend, por lo que todo se hace automáticamente (solo tiene que copiar y pasar su código, y ejecutarlo una vez antes de la primera solicitud de ajax que realice).

+0

Sí, lo he leído. Pero, no sé cómo usarlo y dónde agregarlo = /? –

+0

pon el código justo después de '' y eso es todo, parece. – arnaud576875

+0

He puesto ese código después del final de '$ (" # login "). Live (" click ", función() {' función - no cambió nada :(. ¿Ese código debe estar en un archivo separado? –

3

He estado tratando de resolver el mismo problema, y ​​como arnaud576875 dice que tiene que agregar el encabezado token csrf en cada solicitud ajax como los documentos de Django dice https://docs.djangoproject.com/en/dev/ref/contrib/csrf/#ajax Y ejecutar ese código antes de realizar cualquier solicitud Ajax.

Pero hay algo más, tienes que encontrar la forma de cargar el token csrf en las cookies de tu aplicación antes de intentar hacer cualquier solicitud AJAX, después de muchas horas dolorosas investigando no pude encontrar una respuesta específica de cómo hacer esto, lo que hice fue que para asegurar que su vista envíe el token csrf dentro de una cookie, puede usar el ensure_csrf_token() para cada vista que desee que reciba el token https://docs.djangoproject.com/en/dev/ref/contrib/csrf/#django.views.decorators.csrf.ensure_csrf_cookie, esto parece funcionar para mucha gente, pero no funcionó para mí

Otra forma es utilizar el Método Legacy, agregando el 'django.middleware.csrf.CsrfResponseMiddleware' a su MIDDLEWARE_CLASSES pero no recomiendo este método porque deja varios riesgos de seguridad. https://docs.djangoproject.com/en/1.2/ref/contrib/csrf/#legacy-method

Todos estos métodos que dije antes no funcionaron para mí. La forma en que estoy permitiendo Ajax para hacer algunas peticiones es como el siguiente, y si alguien encuentra este un método peligroso por favor hágamelo saber:

  1. Ir a la primera vista de que el usuario llegará, al igual que el/inicio/página.
  2. insertar este antes de redirigir o analizar cualquier cosa request.META["CSRF_COOKIE_USED"] = True

Y eso es, eso es la forma en que funciona para mí, pero como he dicho antes No estoy seguro de si este es el método correcto o el más seguro uno para lograr la protección csrf.