Bonjour sur mon site je veux mettre un système de connection avec Facebook.

Facebook me retourne une erreur suivante :

Session not active, could not store state.

Le problème est que Cakephp à déja une session défini. Facebook ne la détecte pas. Dans ma fonction login() j'ai faite ceci :

if(session_status() == PHP_SESSION_NONE) {
           session_start();
        }

L'erreur est toujours présente.

Merci

7 réponses


lakamark
Auteur
Réponse acceptée

J'ai réglé le problème en fesant ce-ci :
1)

session_start();

2)

FacebookSession::setDefaultApplication($appId,$appSecret);

3)

$helper = new FacebookRedirectLoginHelper('http://local.dev/MusicalityMaker3/facebook');
$session = $helper->getSessionFromRedirect();

Il faut que je créer une Session Facebook dès que l'utilisateur a accepter l'application. Juste que si l'utilisateur ne veux pas donner son adresse email :

if($profil->getEmail() === null) {
                    throw new NotFoundException("Vous devez  accepter votre email");  
                }

Il faut que je redemande les permissions.

$login_url = $helper->getReRequestUrl(['email']);

Pour être sûr que j'ai l'adresse email avant de l'enregistrer dans ma passe de donnée.

Bonjour.
C'est normal qu'il ne l'a détecte pas.
Et puis, normalement, un utilisateur n'est pas censé se connecté s'il est déjà connecté.
Il n'est donc pas logique de vouloir connecter un utilisateur s'il à déjà une session active en tant que connecté.
Je te conseille de regarder le tutoriel suivant pour voir comment tu peux procéder pour utiliser Facebook Connect avec CakePHP : Tutoriel Vidéo CakePHP » Facebook Connect.

lakamark
Auteur

Bonjour,
J'ulise la dernier version de l'api Facebook et Cakephp 3

Bonjour.
Cela ne change rien, je ne te demande pas de copier exactement comment il fait sur le tutoriel, mais de regarder comment il procède.

lakamark
Auteur

Bonjour,
Dans ma session en tant que utilisateur non connecter j'ai ceci :

debug($this->request->session()->read()); // équivalent de faire un debug($_SESSION)
[
    'Config' => [
        'time' => (int) 1434241218
    ]
]

Cela veux dire que j'ai déjà une session actif par défaut non?

lakamark
Auteur

J'ai refette mon code :

public function facebook(){

        // we start a session
        session_start();

        $appId = "xxxx";
        $appSecret = "xxx";

        // we send to Facebook infos of our app
        FacebookSession::setDefaultApplication($appId,$appSecret);

        // we create a connection link
        $helper = new FacebookRedirectLoginHelper('http://local.dev/MusicalityMaker3/facebook');
        $login_url = $helper->getLoginUrl();

        // Facebook return a FacebookSesion object
        $session = $helper->getSessionFromRedirect();

        debug($session);

        $this->set(compact('login_url'));
    }

Une foi que l'utilisateur à accepter mon application ma session est écrasé par le session_start()
C'est peut-être pour ça que facebook Session me retourne null.

Alors, pour commencer, tu enlèves ce :

session_start();

Cela veux dire que j'ai déjà une session actif par défaut non?

Non, Config, n'a rien à voir avec les sessions du composant Auth, donc selon ton debug, tu n'as aucune session utilisateur liée à l'authentification.
Il y a deux choses différentes, la session créée en cookie par Facebook et la session de CakePHP.
Pour connecter un utilisateur avec l'API de Facebook, lorsque tu demandes à l'utilisateur de se connecter via Facebook et qu'il se connecte avec, tu as un retour de l'API de Facebook qui te retourne si la connexion du côté de Facebook s'est bien effectuée ou non.
Si la connexion s'est bien effectuée, il te retourne en plus de quoi récupérer des informations sur l'utilisateurs et à ce moment là, tu connectes l'utilisateur à ton application.
Ce n'est pas automatique.
Facebook ne peut pas savoir intuitivement, comment connecter l'utilisateur à ton application.