Connexion via réseaux sociaux avec HWIOAuthBundle

L'auteur de ce sujet a trouvé une solution à son problème.
Auteur du sujet

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.

Ma plateforme avec 23 jeux de société classiques en 6 langues et 13000 joueurs: http://qcsalon.net/ | Apprenez à faire des sites web accessibles http://www.openweb.eu.org/

+0 -0
Vous devez être connecté pour pouvoir poster un message.
Connexion

Pas encore inscrit ?

Créez un compte en une minute pour profiter pleinement de toutes les fonctionnalités de Zeste de Savoir. Ici, tout est gratuit et sans publicité.
Créer un compte