Bonjour à tous,
J'essaie d'ajouter la possibilité pour l'utilisateur de se connecter sur mon site en utilisant les réseaux sociaux. Pour le moment, je me limite à facebook et twitter, et on verra après si d'autres seraient utiles.
Pour cela j'utilise HWIOAuthBundle qui semble être la référence en la matière, avec plus de 30 réseaux disponibles. J'ai installé la version 0.5-dev qui est la seule fonctionnant avec Symfony 3.0, les précédentes étant limitées à Symfony 2.1 à 2.7.
J'ai suivi leur tutoriel tout de même assez mal fichu https://github.com/hwi/HWIOAuthBundle/blob/0.4/Resources/doc/index.md ainsi que quelqeus autres articles trouvés sur le net, et ça ne marche pas, je n'y arrive pas.
Avec facebook: la première fois que j'ai cliqué sur mon lien "se connecter avec facebook", j'ai obtenu la page de facebook me demandant d'accepter mon application. J'ai évidemment appuyé sur Ok. Mais ensuite, je me suis retourvé sur la page que j'ai fixée en cas d'échec, et je n'ai aucun message d'erreur, je ne sais pas ce qui s'est passé. Maintenant quand j'essaie de me connecter à nouveau via facebook, je suis immédiatement redirigé vers ma pache d'échec, toujours sans erreur.
Pour twitter: là c'est encore mieux, quand je clique sur "se connecter avec twitter", je retombe directement sur ma page de login (pas la page d'échec cette fois, mais bien la page de login). Naturellement, sans erreur apparante non plus. Ce qui me fait souci pour twitter, c'est que je ne sais même pas si mon App ID et ma clé sont corrects, car en les enlevant pour mettre des valeurs bidon le comportement est exactement le même. Au moins sur facebook, si je mets un app ID bidon, il me donne une belle erreur.
Que faire ? J'ai tellement peu d'éléments pour essayer de cerner le problème que je suis perdu…
Extrait de la configuration :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 | # app/config/config.yml hwi_oauth: firewall_names: [main] use_referer: true connect: {account_connector: app.provider.oauth} fosub: username_iterations: 30 properties: {facebook: facebookId, twitter: twitterId} resource_owners: facebook: {type: facebook, client_id: %facebook_id%, client_secret: facebook_secret%, options: {auth_type: rerequest}} twitter: {type: twitter, client_id: %twitter_id%, client_secret: %twitter_secret%, options: {include_email: true}} # app/config/routing.yml hwi_oauth_redirect: resource: "@HWIOAuthBundle/Resources/config/routing/redirect.xml" prefix: /redirect hwi_oauth_login: resource: "@HWIOAuthBundle/Resources/config/routing/login.xml" prefix: /external-login/ hwi_oauth_connect: resource: "@HWIOAuthBundle/Resources/config/routing/connect.xml" prefix: /connect facebook_login: path: /external-login/check-facebook twitter_login: path: /external-login/check-twitter # app/config/security.yml firewalls: main: pattern: ^/ form_login: provider: fos_userbundle login_path: fos_user_security_login check_path: fos_user_security_check failure_handler: app.loginout_handler use_referer: true csrf_token_generator: security.csrf.token_manager logout: {path: fos_user_security_logout, success_handler: app.loginout_handler} remember_me: {lifetime: 31536000, path: /, secret: '%secret%'} anonymous: true oauth: failure_path: index login_path: fos_user_security_login use_forward: true check_path: /connect_check provider: fos_userbundle resource_owners: facebook: "/external-login/check-facebook" twitter: "/external-login/check-twitter" oauth_user_provider: service: app.provider.oauth # app/config/services.yml app.provider.oauth: class: AppBundle\Handler\OAuthUserProvider arguments: [ '@fos_user.user_manager', {facebook: facebookId, twitter: twitterId}] |
Ce qui m'inquiète aussi, c'est que la classe qui est censée faire le joint entre les données fournies par facebook, twitter et autres et FOSUserBundle, n'est jamais appelée. La voici :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 | <?php namespace AppBundle\Handler; use HWI\Bundle\OAuthBundle\OAuth\Response\UserResponseInterface; use HWI\Bundle\OAuthBundle\Security\Core\User\FOSUBUserProvider as BaseClass; use Symfony\Component\Security\Core\Exception\AuthenticationException; use Symfony\Component\Security\Core\User\UserChecker; use Symfony\Component\Security\Core\User\UserInterface; class OAuthUserProvider extends BaseClass { public function connect (UserInterface $user, UserResponseInterface $response) { $fp = fopen('log.txt', 'a'); fwrite($fp, "connect() called\r\n"); fflush($fp); $property = $this->getProperty($response); $username = $response->getUsername(); fwrite($fp, "property=$property, userid=$username\r\n"); fflush($fp); $curUser = $this->userManager->findUserBy([$property=>$username]); if (null!==$curUser) { fwrite($fp, "User already connected\r\n"); fflush($fp); $this->userManager->updateUser($curUser); } fwrite($fp, "Updating user\r\n"); fflush($fp); $this->updateUser($user); fwrite($fp, "Method end\r\n"); fflush($fp); fclose($fp); } public function loadUserByOAuthUserResponse(UserResponseInterface $response) { $fp = fopen("log.txt", "a"); fwrite($fp, "loadUserByOAuthUserResponse() called\r\n"); fflush($fp); $socialId = $response->getUsername(); $property = $this->getProperty($response); fwrite($fp, "property=$property, socialId=$socialId\r\n"); fflush($fp); $user = $this->userManager->findUserBy([$property=>$socialId]); if (null===$user) { fwrite($fp, "Unknown user by its social ID, checking e-mail\r\n"); fflush($fp); $email = $response->getEmail(); fwrite($fp, "Email=$email\r\n"); $user = $this->userManager->findUserByEmail($email); } if (null===$user) { fwrite($fp, "User doesn't exist, creating it\r\n"); fflush($fp); $username1 = $response->getNickname(); $username2 = $response->getRealName(); fwrite($fp, "Nickname=$username1, realName=$username2\r\n"); fflush($fp); $username = $username1? $username1 : $username2; $user = $this->userManager->createUser(); $user->setUsername($username); $user->setEmail($email); $user->setPlainPassword(md5(uniqid())); $user->setEnabled(true); fwrite($fp, "User created\r\n"); fflush($fp); } fwrite($fp, "Setting service ID\r\n"); fflush($fp); $service = $response->getResourceOwner()->getName(); $setter1 = 'set' .ucfirst($service) .'Id'; $user->$setter1($socialId); //if (!$user->getFirstName()) $user->setFirstName($response->getFirstName()); //if (!$user->getLastName()) $user->setLastName($response->setLastName()); fwrite($fp, "Updating user\r\n"); fflush($fp); $this->userManager->updateUser($user); fwrite($fp, "Logging-in user\r\n"); fflush($fp); $checker = new UserChecker(); $checker->checkPreAuth($user); fwrite($fp, "End method\r\n"); fflush($fp); fclose($fp); return $user; } } |
Après avoir lancé la connexion via facebook en cliquant sur le lien dans la page de login, je n'ai aucun log.txt qui est créé. Preuve que les méthodes de cette classe ne sont jamais appelées.
Vu que j'ai pu avoir la boîte de dialogue de facebook me demandant d'accepter mon application la toute première fois que j'ai essayé, et qu'après mon acceptation je ne l'ai plus eue, j'en conclus que le problème n'est pas dans la configuration de l'app du côté de facebook. Le problème est uniquement sur Symfony. Par contre pour twitter je n'ai absolument aucun indice !
Qu'ais-je fait de faux ? Me manque-t-il quelque chose ?
Y a-t-il un bundle plus recommandé qui est à jour pour faire la même chose ? Parce que HWIOAuthBundle a l'air de dater, officiellement la version 0.4 prétend être compatible jusqu'à Symfony 2.7 alors que je suis à la 3.0.
Merci pour votre aide.