Django-fr

Forum

#1 12-02-2011 02:56:01

nfk
Membre
Inscription : 20-08-2010
Messages : 3

login auth avec csrf

Salut à tous,

Je galère sur les authentifications avec django 1.2 et la securité pour les CSRF.
J'ai du loupper un truc mais je sais pas trop comment le résoudre d'où mon appel.

En gros avec le code ci-dessous j'ai cette erreur : "Key 'username' not found in <QueryDict: {u'csrfmiddlewaretoken': [u'494d9f4d2634cdf02f1b2d06077066de']}>"
Si j'ai bien compris mon fomulaire me renvoi un CSRF token, mais si j'ai bien compris la chose il faut que je décode ce charrabia de token csrf pour ensuite obtenir mon username et password.
Google m'a bien retourné quelques soluces mais j'ai pas su les implémenter.

Merci d'avance

template :
<form method="post" action="/login/">
{% csrf_token %}
<input type="username" value="Identifiant"/>
<input type="password" value="Mot de passe" />
<input type="submit" value="login" />
</form>

view from django doc:
def login(request):
    username = request.POST['username']
    password = request.POST['password']
    user = authenticate(username=username, password=password)
   
    if user is not None:
        if user.is_active:
            login(request, user)
            return HttpResponseRedirect('/')
        else:
            return HttpResponseRedirect('/')
    else:
        return HttpResponseRedirect('/')

Hors ligne

#2 12-02-2011 06:31:57

Mathieu AGOPIAN
Modérateur
Inscription : 11-08-2010
Messages : 35

Re : login auth avec csrf

Bonjour,

la protection CSRF n'a rien à voir avec le contenu de ton formulaire
lui-même. En fait le {% csrf_token %} va simplement rajouter un <input
type="hidden" value="<le token csrf" /> au niveau de ton template.
C'est ensuite au niveau de la view qu'il faut que tu "utilise" ce token, par
exemple en utilisant le décorateur @csrf_protect et un RequestContext (je
t'enjoins à bien lire et comprendre la documentation qui est très claire :
http://docs.djangoproject.com/en/1.2/ref/contrib/csrf/

Maintenant qu'on a parlé de la protection csrf, parlons de ton problème, qui
est complètement différent: tu utilise l'attribut "type" de tes inputs pour
y stocker le "name".

Le type de l'input va conditionner quel va être le widget utilisé dans le
formulaire (est-ce que ce sera un champ texte? une dropdown? une checkbox?
...). Pour ça, je te conseille de lire un peu de doc sur les formulaires
html, par exemple la référence sur
http://www.w3.org/TR/html401/interact/forms.html (un peu touffu) ou sinon
sur http://htmldog.com/guides/htmlbeginner/forms/ (pour débutants, très bien
écrit).

Dans ton cas, tu défini des input qui on par exemple le type "username" (qui
n'existe pas), et qui n'ont pas d'attribut "name". Or c'est l'attribut
"name" qui permet d'identifier quelle est la donnée qui est stockée où. Dans
ton cas, tu écris dans ta view:

username = request.POST['username']
password = request.POST['password']

Tu devrais donc avoir, dans ton template:

<input type="text" name="username" value="Identifiant"/>
<input type="text" name="password" value="Mot de passe" />

A noter que j'ai utilisé un <input type="text"> pour le mot de passe, alors
qu'il existe un <input type="password"> qui affiche des *** à la place de ce
qui est entré. Mais si tu utilise ce type d'input, tu ne pourras pas avoir
la valeur "Mot de passe" qui s'affiche. Ce que je te conseille, en cadeau
bonus, c'est d'utiliser par exemple un formulaire de ce type :

<label for="username">Identifiant</label><input type="text" name="username"
id="username" />
<label for="password">Mot de passe</label><input type="password"
name="password" id="password" />

Je te laisse le soin de comprendre ce petit morceau de formulaire, et de le
mettre en page si tu le souhaite.

En cadeau bonus bonus, je t'invite à regarder du côté de
"django-registration", qui est une application très très bien faite, et qui
permet de faciliter la gestion des inscriptions. Cette application se base
aussi sur le mécanisme d'authentification de django (
http://docs.djangoproject.com/en/1.2/topics/auth/). A eux deux, ils
fournissent en standard tous les formulaires et vues nécessaires à une
gestion d'inscription/identification pour les cas les plus courants!

Cordialement

Mathieu

Le 12 février 2011 02:56, Nicolas G. <nicofonk _AT_ gmail.com> a écrit :

> Salut à tous,
>
> Je galère sur les authentifications avec django 1.2 et la securité pour
> les CSRF.
> J'ai du loupper un truc mais je sais pas trop comment le résoudre d'où
> mon appel.
>
> En gros avec le code ci-dessous j'ai cette erreur : "Key 'username' not
> found in <QueryDict: {u'csrfmiddlewaretoken':
> [u'494d9f4d2634cdf02f1b2d06077066de']}>"
> Si j'ai bien compris mon fomulaire me renvoi un CSRF token, mais si j'ai
> bien compris la chose il faut que je décode ce charrabia de token csrf
> pour ensuite obtenir mon username et password.
> Google m'a bien retourné quelques soluces mais j'ai pas su les
> implémenter.
>
> Merci d'avance
>
> template :
> <form method="post" action="/login/">
> {% csrf_token %}
> <input type="username" value="Identifiant"/>
> <input type="password" value="Mot de passe" />
> <input type="submit" value="login" />
> </form>
>
> view from django doc:
> def login(request):
>    username = request.POST['username']
>    password = request.POST['password']
>    user = authenticate(username=username, password=password)
>
>    if user is not None:
>        if user.is_active:
>            login(request, user)
>            return HttpResponseRedirect('/')
>        else:
>            return HttpResponseRedirect('/')
>    else:
>        return HttpResponseRedirect('/')
> _______________________________________________
> django mailing list
> django _AT_ lists.afpy.org
> http://lists.afpy.org/mailman/listinfo/django
>

Hors ligne

#3 12-02-2011 13:06:58

nfk
Membre
Inscription : 20-08-2010
Messages : 3

Re : login auth avec csrf

Salut,
Mon problème était le manque de recul de ma part, je me suis focalisé sur le csrf en inventant tout un système de chiffrement des données. Alors que le problème était du à la mauvaise implémentation de la syntaxe de ma form html!

Merci pour cette réponse très complète et rapide. Ce problème était pour moi bloquant.
Quand j'aurai plus d'expérience Django c'est promis j'utiliserai le django-registration et autres, mais pour le moment il est important pour moi de bien assimiler les notions de bases pour être à l'aise.
Bon week end.
Nico

Hors ligne

Pied de page des forums