web-dev-qa-db-fra.com

Facebook Login: Comment combiner JavaScript avec PHP SDK?

Comment puis-je combiner des exemples des deux

https://github.com/facebook/php-sdk/blob/master/examples/example.php et https://github.com/facebook/connect-js/blob/master/examples/ jquery/login.html

Le but ultime est que nous puissions utiliser jQuery pour nous connecter et que la ligne suivante fonctionne toujours.

$user = $facebook->getUser();

Ce que je remarque actuellement, c’est que lorsque je me connecte avec JavaScript, la session n’est pas définie avec PHP. Par conséquent, il est incompatible avec le SDK basé sur PHP (donc, $ utilisateur dans ce cas serait toujours nul)

Je ne suis pas un grand fan de <a href="$facebook->getLoginUrl()">Login with Facebook</a>, car le navigateur charge une autre page (le login Facebook), puis le redirige vers l'application Web. Il est beaucoup plus idéal si je peux charger une boîte de dialogue contextuelle pour que l'utilisateur se connecte, puis redirige de manière transparente vers mon application Web. Toute suggestion sur la manière de mettre en œuvre cette expérience utilisateur serait donc grandement appréciée. Je vous remercie!

21
Antony

Je viens d'utiliser le bouton de connexion Facebook - https://developers.facebook.com/docs/reference/plugins/login/

Une fois que l'utilisateur a utilisé cela pour se connecter (s'il ne l'était pas déjà) et accorder l'accès à votre application (site), le kit de développement PHP-SDK ne devrait pas avoir de difficulté à utiliser la session Facebook et les API.

Mettre à jour

Je viens d’essayer ceci avec la nouvelle version 3.0 PHP SDK et c’est définitivement not qui fonctionne. Trouvé ceci sur le blog du développeur

Si vous utilisez le SDK JavaScript pour la connexion conjointement avec le SDK PHP, attendez la mise à niveau du SDK JavaScript (disponible dans 4 semaines). La version 3.0.0 du PHP SDK ne coopère pas avec le SDK JavaScript actuel en raison du changement de format du cookie.

En d'autres termes, utilisez le SDK v2 PHP jusqu'à ce que le SDK JS soit mis à jour.

12
Phil

Je ne sais pas si ça marche. L'API JS actuelle a une configuration pour enregistrer le cookie afin que le serveur puisse le lire:

FB.init({
    appId  : 'YOUR APP ID',
    cookie : true
});

Maintenant, en PHP, vous pouvez utiliser ce qui suit pour utiliser la session du JS:

// Read the cookie created by the JS API
$cookie = preg_replace("/^\"|\"$/i", "", $_COOKIE['fbs_' . FB_APP_ID]);
parse_str($cookie, $data);

// Startup the Facebook object
$fb = new Facebook(array(
    'appId'  => FB_APP_ID,
    'secret' => FB_APP_SECRET
));

// Say we are using the token from the JS
$fb->setAccessToken($data['access_token']);

// It should work now
var_dump($fb->getUser());

J'espère que ça a aidé.

15
Pedro Villa Verde

il semblerait que facebook n'ait pas résolu le problème au bon moment (car ils parlent https://developers.facebook.com/blog/post/503 ).

c'est la dernière information sur js sdk https://developers.facebook.com/blog/post/525/

1
thereds1106

Après de longues heures de recherche, j’ai trouvé que le problème était résolu: le PHP SDK ne récupérait pas la session Facebook. Apparemment, le SDK Javascript ne configure pas la session correctement. Ajoutez ceci à votre auth.login eventlistener:

FB.Event.subscribe('auth.login', function(response) {
    FB._oauth = false;
    FB.Cookie.setEnabled(true);
    FB.Auth.setSession(response.authResponse, response.status);
    FB._oauth = true;
    window.location.reload();
});

Assurez-vous également que le domaine d'application correspond à votre domaine de cookie. Après avoir corrigé ces éléments, cela a finalement fonctionné.

Edit: / Ce matin, tout fonctionnait bien. Lorsque j'en testais un peu plus tout à l'heure, j'ai constaté que je devais modifier base_facebook.php pour m'assurer que les demandes adressées à Facebook n'expireraient pas. J'imagine que, parce que je teste sur mon ordinateur local, la connexion ne serait pas assez rapide pour être établie à temps. Cela explique le comportement étrange où parfois cela fonctionnerait et parfois cela ne fonctionnerait pas.

Modifiez le temps de connexion du tableau $ CURL_OPTS à la ligne 128:

public static $CURL_OPTS = array(
    CURLOPT_CONNECTTIMEOUT => 20,
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_TIMEOUT        => 60,
    CURLOPT_USERAGENT      => 'facebook-php-3.1',
);
1
Rick Pastoor

Dans la version 4 du SDK, cela fonctionne automatiquement avec le SDK JavaScript. Vous devez juste utiliser FacebookJavaScriptLoginHelper:

$helper = new FacebookJavaScriptLoginHelper(); // Get access token from JS SDK
try {
    $session = $helper->getSession();
} catch(FacebookRequestException $e) {
    // When Facebook returns an error
    echo "Exception occured, code: " . $e->getCode();
    echo " with message: " . $e->getMessage();
} catch(\Exception $e) {
    // When validation fails or other local issues
    echo "Exception occured, code: " . $e->getCode();
    echo " with message: " . $e->getMessage();
}

// If logged in
if($session) {
    // Get user profile
    try {
        $user_profile = (new FacebookRequest(
            $session, 'GET', '/me'
        ))->execute()->getGraphObject(GraphUser::className());

        print_r($user_profile);

    } catch(FacebookRequestException $e) {

        echo "Exception occured, code: " . $e->getCode();
        echo " with message: " . $e->getMessage();
    }
}

Pas besoin de déconner avec les cookies!

0
Chuck Le Butt