2011-07-21 4 views
3

Existe-t-il un moyen d'utiliser l'authentification facebook (OAuth 2.0) sans rediriger?Authentification Facebook sans redirection?

Je n'utilise pas le bouton de connexion facebook, je suis donc censé rediriger vers https://www.facebook.com/dialog/oauth? client_id = ID_APP & redirect_uri = VOTRE_URL, mais je ne souhaite pas rediriger mon utilisateur en dehors de ma page. Y at-il un moyen d'ouvrir cette URL dans une fenêtre popup (comment puis-je faire cela?), Puis attraper l'événement sessionChange tout comme lorsque vous travaillez avec le bouton de connexion facebook normal? J'utilise jQuery et Pyramid.

Merci!

Répondre

2

je fait une demande d'un client il y a quelques semaines avec ce comportement juste en utilisant le SDK Facebook JS

FB.login(function(response){ 
     if(response.session){ 
     var user_id = response.session.uid, 
      access_token = response.session.access_token; 
     } 
    } 
); 

Vous pouvez l'envoyer le access_token à votre serveur avec ajax si vous voulez. Faites juste attention si vous utilisez trop d'ajax, la session expirera si vous ne faites pas d'appels à FB.getLoginStatus() de temps en temps.

+0

C'est fait avec une fenêtre contextuelle. Ce qui signifie que vous ne pouvez l'appeler qu'à partir d'une action de l'utilisateur comme un événement de clic, ou le navigateur va probablement le bloquer. – Paulpro

+0

merci! J'ai une application Pyramid qui utilise facebook auth. Je comprends qu'il y a deux types d'utilisateurs de l'utilisateur Facebook: le côté client et le côté serveur. Je n'utilise actuellement que le côté client, car l'accès aux données de l'utilisateur dans js est seulement correct pour moi. Je pensais à la sécurité et je ne suis pas sûr que ce soit fort. Mon site contient un formulaire envoyé par un utilisateur connecté. Comme je n'ai aucun moyen de vérifier le statut de connexion sur le serveur, n'importe qui peut techniquement soumettre le formulaire, même sans être connecté - en manipulant simplement le js, correct? L'authentification côté serveur est-elle la seule façon d'y accéder? – Raiders

+2

@Raiders Il serait également plus sûr de vérifier les serveurs. Je ne suis pas sûr comment vous feriez cela dans Pyramid, mais fondamentalement j'utilise ajax après 'FB.login()' et envoie le user_id et access_token au serveur. Ensuite, j'utilise cURL sur mon serveur pour envoyer une requête à 'https: //graph.facebook.com/me?access_token = 'access_token_from_ajax' et vérifier que l'id_utilisateur retourné correspond à mon id_utilisateur que j'ai reçu de l'ajax. – Paulpro

2

Vous pouvez vérifier si l'utilisateur dispose d'un jeton d'accès valide, en d'autres termes, a été connecté à votre site à un moment donné. FB vous donne les données de session à l'extrémité avant pour l'obtenir comme ceci:

FB.getLoginStatus(function(response){ 
     //send the response to the back end in a json string 
    }); 

puis validez sur l'arrière en utilisant une version modifiée de la validation de la signature de l'héritage. Ça semble fonctionner. S'il vous plaît laissez-moi savoir si quelque chose me manque. Il vous indique uniquement que l'ID utilisateur, le token d'accès correspond à votre site. Aucun appel de boucle nécessaire. Il ne vous dit pas si la session est actuellement valide, alors ne comptez pas dessus pour votre système bancaire ou quoi que ce soit.

function validateFB_sessionObj($sessionObj){//pass me the session data object 
    $sessionObj = $sessionObj->session; 
    global $fb;//pull in the secret fb keys 
    if (!is_object($sessionObj) || !isset($sessionObj->uid) || !isset($sessionObj->access_token) || !isset($sessionObj->sig)){ 
//  warning("facebook session object is lacking something", $sessionObj); 
     return false; 
    } 
    $expectedSig = generateSig($sessionObj, $secret); 
    if ($sessionObj->sig = $expectedSig){ 
    // status("fb signature looks good"); 
     return true; 
    } else { 
    // warning("facebook signature looks wrong", $sessionObj); 
     return false; 
    } 
} 

function generateSig($params, $secret){ 
    $string = $params->access_token . $params->uid . $secret; 
    return md5($string); 
} 
Questions connexes