Interdit (403) CSRF échec de la vérification. Demande abandonnée. Même en utilisant le {% csrf_token %}
je suis en train de faire un login dans django, mais j'obtiens cette erreur, j'ai vérifier les CSRF de la documentation et rien ne fonctionne pour moi.
Voici le code HTML:
<body>
<section class="container">
<div class="login">
<h1>Login to Web App</h1>
{% if form.errors %}
<p class="error">Lo sentimos, la combinacion de usuario y contrasena no es correcta!</p>
{% endif %}
<form action="/accounts/auth/" method="post">
{% csrf_token %}
<input type='hidden' name='csrfmiddlewaretoken' value='randomchars'/>
<p><input name="username" type="text" name="login" value="" placeholder="Username"></p>
<p><input name="password" type="password" name="password" value="" placeholder="Password"></p>
<p class="submit"><input type="submit" name="commit" value="Login"></p>
</form>
</div>
</body>
Comme vous le voyez ci-dessus-je utiliser le {% csrf_token %} et j'ai 'django.middleware.csrf.CsrfViewMiddleware " dans mes applications installées.
Et de mon point de vue:
from django.http import HttpResponse,HttpResponseRedirect
from django.template.loader import get_template
from django.template import Context
from datetime import datetime
from django.shortcuts import render_to_response
from django.http import HttpResponseRedirect
from django.contrib import auth
from django.core.context_processors import csrf
from models import *
from django.shortcuts import get_object_or_404
from forms import *
from django.template.context import RequestContext
from django.contrib.auth.decorators import login_required
from django.contrib.auth import authenticate, login
def login(request):
c = {}
c.update(csrf(request))
return render_to_response('login.html', c)
def auth_view(request):
username = request.POST['username']
password = request.POST['password']
user = authenticate(username=username, password=password)
if user is not None:
auth.login(request.user)
return HttpResponse('/accounts/loggedin')
else:
return HttpResponse('/accounts/invalid')
je me rediriger vers un autre fichier HTML où je n'ai pas utiliser le {% csrf_token %}.
J'ai été souffert de cette erreur, même si l'aide de {% csrf_token %}. Mais après un changement de render_to_response render, Il a été résolu.
OriginalL'auteur BismarthSantana | 2014-01-03
Vous devez vous connecter pour publier un commentaire.
Théorie
Un couple de choses sont nécessaires pour que la protection csrf de travail (vérifier la docs):
django.middleware.csrf.CsrfViewMiddleware'
inclus en tant que middleware dans votresettings.py
(vous pouvez également utiliser le décorateur csrf_protect() sur un point de vue particulier que vous souhaitez protéger)django.core.context_processors.csrf
pour le gestionnaire de contexte.Lorsque vous chargez votre page, jetez un oeil dans le source de la page à l'aide de votre navigateur préféré. N'ouvrez pas le modèle de fichier html, ouvrez l'url qui pointent vers la vue contenant le formulaire. Regardez où vous avez placé le
{% csrf_token %}
. Si vous voyez quelque chose commevous devriez être ok.
Si vous avez d'autre part voir
NOTPROVIDED
, quelque chose s'est mal passé lors de la création du jeton csrf. En regardant dans le code source (context_processors.py
etcsrf.py
), nous pouvons trouver ce:csrf(request)
retourne{'csrf_token': 'NOTPROVIDED'}
siget_token(request)
renvoie None.get_token(request)
retournerequest.META.get("CSRF_COOKIE", None)
.Je suppose que cela signifie qu'il serait de retour
None
si le cookie n'est pas créé avec succès.Fixer
Pour vous, cela signifie que vous devez d'abord remplacer
avec
Nous aimerions le csrf champ à l'intérieur de
<form>...</form>
, pas à l'intérieur de<form>
. Comme le code est à l'heure actuelle, elle sera convertie enet nous serions plutôt comme
Après, jetez un oeil au code source, et de voir si vous pouvez trouver le champ csrf. Si vous pouvez le voir, tout devrait fonctionner, en théorie.
Vous pouvez également vérifier que le csrf cookie a été défini dans votre navigateur, par exemple, dans google Chrome, cliquez-droit sur la page web et sélectionnez
Insepect Element
. Sélectionnez laResources
onglet, puis cliquez sur cookies. Vous devriez trouver un nom de cookiecsrftoken
.Si vous avez encore des problèmes, vérifiez le middleware tuple dans votre
settings.py
et double-vérifier que votre navigateur accepte cookier à partir de votre serveur, comme décrit ci-dessus.Ajouté juste au-dessus.
Ok, mais le HTML est affiché à partir de l' /comptes/login/ URL , de sorte que lorsque je clique dans la soumettre(login) sur le bouton, il me diriger vers /comptes/auth/ URL, qui appellent la auth_view méthode dans mes vues. je n'ai pas de fichier HTML pour le /comptes/auth/ URL. Des thats peut-être le problème... Ce que vous en pensez?
Je veux le code html que vous obtenez lorsque vous êtes sur la page avec le bouton "soumettre", et cliquez sur Affichage -> Source dans votre navigateur préféré.
J'ai fait un substansial modifier à ma réponse - s'il vous plaît jeter un oeil.
OriginalL'auteur Steinar Lima
Effacer le cache de votre navigateur et essayez à nouveau. C'est peut-être en utilisant le jeton CSRF enregistré dans le cache cookie.
OriginalL'auteur Mohammad Etemaddar
Avec l'Ajout de la réponse ci-dessus, Essayez d'Ajouter des lignes suivantes dans la vue
Notez que ce n'est pas faire le travail de sécurité, plutôt qu'il supprime ce mécanisme de sécurité.
C'est la solution parfaite. Simple et facile. +1.
OriginalL'auteur Pradeep