Aprende a lidiar con el error 403 Forbidden de Django: error en la verificación de CSRF

Cómo manejar Postman y Django 403 Forbidden Error: CSRF verification failed

Después de implementar un nuevo proyecto con Django que debería permitirme enviar un texto largo al servidor, luego usar la biblioteca KeyBERT para extraer automáticamente las palabras clave del texto enviado y finalmente enviarme una respuesta JSON con el resultado. Una vez que implementé el proyecto para probarlo usando Postman, encontré este error al intentar enviar directamente una solicitud POST a mi vista en Django usando Postman.

En este artículo, te explicaré 2 posibles formas de eludir esta excepción al enviar solicitudes a través de Postman a tu proyecto Django.

A. Desactiva la protección CSRF para una vista específica

Deshabilitar la protección CSRF de un proyecto real o algo que realmente lo requiere no está en la cabeza de nadie. Definitivamente no debería hacer esto a menos que sepa lo que está haciendo (comprendes totalmente cómo un ataque CSRF y cómo podría ser un problema para su aplicación si permite el envío de formularios sin protección CSRF). Algunos casos en los que podría ser factible utilizar este enfoque:

  • Una API local que está probando solo localmente.
  • Una API pública que está diseñada para ser accesible para cualquier persona, pero de alguna manera confía en todas las solicitudes posibles (por ejemplo, su API solo es accesible para IP específicas como la IP de otro servidor que solicita información de este punto final y ya tiene protección CSRF con otro lenguaje como PHP).

De lo contrario, no lo hagas. En mi caso, diseñé una API básica que ejecuta una biblioteca de aprendizaje automático y debería devolver el resultado como respuesta, sin embargo, la API no necesita ninguna implementación por parte del usuario, ya que está destinada a ser utilizada solo para mí. Este enfoque consiste en deshabilitar la protección CSRF de una ruta específica:

# views.py
from django.http import JsonResponse

# 1. Importa el decorador csrf_exempt
from django.views.decorators.csrf import csrf_exempt

# 2. Eximir la vista de los chequeos de CSRF
@csrf_exempt
def extract_keywords(request):
    text = request.POST.get('text')
    return JsonResponse(text)

El decorador deshabilitará las comprobaciones CSRF de la ruta, en este caso el método extract_keywords de la vista. Si vuelve a enviar la solicitud POST a la misma ruta con Postman, esta vez debería tener éxito.

B. Autoestablecer el encabezado X-CSRFToken en Postman

La segunda opción funcionará solo si se enfrenta a la siguiente situación. Si tiene un proyecto de Django funcionando correctamente, digamos en la siguiente URL http: // localhost: 8080 / my-form y responde GETPOSTsolicita. Su proyecto funciona correctamente, cuando accede a la dirección del formulario a través del navegador a través de una solicitud GET, el formulario se procesará para que el usuario pueda enviar fácilmente los datos y cuando se envíe a través de una solicitud POST, la solicitud se realiza correctamente en el navegador como se esperaba. El problema con Postman aparece cuando funciona en el navegador, pero si intenta simular la solicitud POST a la misma dirección usando Postman, aparecerá la excepción mencionada.

Como se mencionó anteriormente, Django tiene protección CSRF incorporada. El único mecanismo que tiene para activar una solicitud AJAX cuando esta protección está habilitada es agregar el encabezado X-CSRFToken a su solicitud (que debe contener un token CSRF válido para validar en el servidor). Puede obtener este token primero activando una solicitud GET al punto final para obtener el token y luego usar un script de prueba de Postman para manipular la solicitud posterior con JavaScript agregando el encabezado requerido.

Para lograr esto, abra la pestaña Pruebas de su solicitud de Postman y agregue el siguiente código de prueba:

var xsrfCookie = postman.getResponseCookie("csrftoken");
postman.setEnvironmentVariable('csrftoken', xsrfCookie.value);

Esta prueba de JavaScript se ejecuta después de recibir la respuesta. Una vez que esté allí, ejecute la solicitud GET:

Postman GET request Django

Lo que hicimos con el código anterior es básicamente extraer el csrftoken del formulario obtenido con la solicitud GET y ahora se utilizará en la solicitud POST posterior para validar el formulario. Este token se almacenará como una variable de entorno, es decir csrftoken, para que podamos agregarlo fácilmente a la nueva solicitud POST como un nuevo encabezado:

Headers CSRF Token

Después de declarar el encabezado, simplemente ejecuta la solicitud POST y ahora debería tener éxito:

POSTMAN csrftoken Post

Que te diviertas ❤️!


Interesado en la programación desde los 14 años, Carlos es un programador autodidacta, fundador y autor de la mayoría de los artículos de Our Code World.

Conviertete en un programador más sociable

Patrocinadores