Bonjour,

Par où commencer si ce n'est je débute sur Symfony ;).

Je suis actuellement sur un projet où je dois mettre en place un système d'authentification à double facteur. Je gère les utilisauteurs avec FosUserBundle et jai choisi Google Authenticator (project sonata via composer).

J'ai overridé le controller pour ajouter cette spécificité sauf que jai 3 méthodes : loginAction, checkAction et logoutAction. Celle qui m'intéresse est checkAction sauf que celle ci est intercepté par le framework jai cru comprendre.

Mon security.yml et configuré de base et je peux pour l'instant me connecter seulement en mode normale (login + mot de passe). Le truc standard de la doc de fosUserBundle :)

Comment puis je ajouter Google Authenticator en plus de la vérification du mot de passe et du user. J'ai cherché sur la toile et je ne trouve absolument rien à ce sujet. Je pense faire une seul formulaire avec Login + Mot de passe + code Google Authenticator et envoyer tous cela en POST. Ou alors faudrait-il que je fasse une autre vue qui gère seuelment la partie double facteur ??? Je suis un peu largué je ne trouve pas d'exemple qui me permette de structurer correctement mon appli. Peut être ne dois je pas passer par fosUserBundle.

Merci d'avance, jai bientot plus de cheveu ;D

Sebastien

8 réponses


Bonjour.

Je suis un peu largué je ne trouve pas d'exemple qui me permette de structurer correctement mon appli.

Tu pourrais tout simplement regarder le Tutoriel Vidéo PHP » Authentification 2 facteurs, TOTP.

Wheezy
Auteur

Salut,

Merci cela me permet de me faire une idée de la chose pour CakePHP.

Moi je suis sur Symfony et fosUserBundle pour l'authentification. Avec CakePHP la partie authentification peut être manipulée pour dire "j'ai une clé secréte - donc je redirige vers la page d'authentification TOTP". Sur Symfony avec fosUserBundle, la soumission du formulaire se fait à l'adresse /login-check, soit la méthode 'checkAction'. Mais sur Symfony tu ne peux pas l'implémenter elle est directement interceptée... où alors peut être qu'il ne faut pas passer par fosUserBundle...

Wheezy
Auteur

Salut,
J'ai peut être trouvé mon bonheur içi : https://github.com/scheb/two-factor-bundle
Apperemment cela "écoute" l'authentification de base (Symfony ou FOSUserBundle) et si cela doit être du type "double facteur" cela ne log pas l'utilisateur avant d'avoir saisie un code (google ou mail).

Sebastien

La manière qu'il utilises n'est pas spécifique pour CakePHP et la librairie non plus, il a juste fait la démonstration sur CakePHP, il suffit juste que tu adaptes, il l'expliques en plus dans la vidéo.

Wheezy
Auteur

Sur Symfony la gestion des utilisateurs ne ce fait pas de la meme maniére. il faudrait que je puisse interagir avec la methode "check" et adapter. Il faudrait que j'intercept le check avec un listener je pense et dire a Symfony tu utilise 2 authentification... Ou alors je creer mon propre provider mais cest trop chaud...

bonjour. Pour cela tu dois réécrire la methode checkAction. La documentation de symfony en parle :
http://symfony.com/doc/current/bundles/FOSUserBundle/overriding_controllers.html
https://github.com/FriendsOfSymfony/FOSUserBundle/blob/master/Resources/doc/overriding_controllers.rst

Tu n'as plus qu'à ajouter ta surcouche. Si tu as déjà essayé cette vois, peux tu détailler ici ce qui ne fonctionne pas ?
Un autre moyen serait de te baser sur les Events : https://github.com/FriendsOfSymfony/FOSUserBundle/blob/master/Resources/doc/controller_events.rst

Bonne chance.

Wheezy
Auteur

Salut,

Alors la méthode 'checkAction' ne peut être overridé. Pourquoi ? Tout simplement parceque cette méthode est naturellement interceptée par le framework (comme je le dit plus haut). Elle est déclarée pour une question de routing et c'est tout.

Du coup je passe par un bundle tout prêt :https://github.com/scheb/two-factor-bundle

En analysant le code, il vérifie si il y a une double authentification en place pour chaque requêtes sécurisées par le firewall (security.yml). Si ce n'est pas le cas, il demande le code google authenticator puis stock un token (en gros)

Pour FOSUserBundle, même avec les événements, on ne peut intervenir entre le moment où la personne soumet le formulaire et le moment où il est pleinement connecté au niveau de la couche sécurité de Symfony. La mise en place de toute sécurité supplémentaire se fait APRES.

Merci,

a priori on peut refaire entièrement le routing de FOSUserBundle comme ceci : http://symfony.com/doc/current/bundles/inheritance.html#overriding-resources-templates-routing-etc

Ainsi on peut reroute checkAction là ou on souhaite.