Comment authentifier les utilisateurs avec Facebook Connect

Dernièrement, il y a eu beaucoup de fuzz sur l'enregistrement paresseux. Il s'avère que moins l'utilisateur doit penser, plus les taux de conversion sont élevés! Quelle pensée! Si tout le monde semble avoir un profil Facebook, pourquoi ne pas ajouter une inscription d'utilisateur en un clic? Je vais vous montrer comment faire cela aujourd'hui.


Étape 1. La configuration

Table MySQL

Commençons par créer une table de base de données.

 CREATE TABLE 'users' ('id' int (10) non signé NON NULL AUTO_INCREMENT, 'oauth_provider' varchar (10), texte 'oauth_uid', texte 'nom d'utilisateur', clé primaire ('id')) ENGINE = MonISAM DEFAULT CHARSET = latin1;

C'est très simple: nous allons mettre en place une table d'informations sur l'utilisateur avec identifiant, nom d'utilisateur, prénom et nom, l'URL de la photo de l'utilisateur et la date d'enregistrement. En outre, nous ajoutons à la fois un oauth_provider et oauth_uid champs, pour distinguer les différents protocoles d’authentification tiers ouverts et leurs identifiants. Par exemple, supposons que la semaine prochaine, vous décidiez que c’est une bonne idée de laisser également les utilisateurs de Twitter entrer. Facile; vous venez de définir une autre valeur pour le oauthfournisseur, et évitez de dupliquer oauthValeurs UID.

L'application Facebook

Commençons par créer une nouvelle application. Donnez-lui un nom et acceptez les termes et conditions. Ensuite, prenez les deux clé API et Secret dans l'onglet de base comme indiqué ci-dessous.

Dans l’onglet Toile, définissez les deux URL de la toile et URL de redirection post-autorisation à votre localhost et chemin que le script va traiter - quelque chose comme http://localhost.com/login_facebook.php?. Notez le point d'interrogation à la fin et le domaine; les deux sont requis par Facebook. Il suffit de définir votre les hôtes déposer dans un nom de domaine valide.

Dans l'onglet Connexion, définissez l'URL de connexion sur la même valeur et définissez localhost.com (ou celui que vous utilisez) comme domaine de base.

Maintenant, enregistrez, téléchargez la bibliothèque du client et décompressez facebook.php dans le srcdir vers un nouveau répertoire créé à la racine.


Étape 2. Le rappel

Le flux d'authentification comporte trois étapes:

  1. Le script local génère une URL demandant à l'utilisateur l'autorisation
  2. Facebook retourne à l'URL de la toile spécifiée avec un paramètre GET
  3. Le paramètre GET authentifie la session

Faisons un test rapide avant de vous inscrire et de vous connecter.

 # Nous avons besoin de la bibliothèque require ("facebook.php"); # Création de l'objet facebook $ facebook = new Facebook (array ('appId' => 'YOUR_APP_ID', 'secret' => 'YOUR_APP_SECRET', 'cookie' => true)); # Voyons si nous avons une session active $ session = $ facebook-> getSession (); if (! empty ($ session)) # Session active, essayons d'obtenir l'ID utilisateur (getUser ()) et les informations utilisateur (api -> ('/ moi')). essayez $ uid = $ facebook-> getUser ( ) $ user = $ facebook-> api ('/ moi');  catch (Exception $ e)  if (! empty ($ user)) # Informations utilisateur ok? Imprimons-le (nous ajouterons ici les routines de connexion et d'enregistrement) print_r ($ user);  else # À des fins de test, en cas d'erreur, supprimons le script ("Il y avait une erreur.");  else # Il n'y a pas de session active, générons une $ login_url = $ facebook-> getLoginUrl (); en-tête ("Emplacement:". $ login_url); 

Maintenant, allez à http://localhost.com/login_facebook.php, et voyons ce qui se passe. Si vous êtes redirigé vers Facebook et que vous nous demandez l'autorisation, nous sommes sur la bonne voie..

Cependant, il pourrait y avoir deux problèmes. Le premier: si vous êtes redirigé vers Facebook, mais que cela indique une erreur, il se peut qu'il manque une valeur dans la configuration. Retournez aux paramètres de votre application et vérifiez les onglets Connecter et Toile et assurez-vous que les champs sont corrects, comme décrit ci-dessus..

Il se peut qu’un autre problème, lié à une erreur telle que «Uncaught CurlException: 60: Problème de certificat SSL, vérifie que le certificat d’autorité de certification est OK». Cela se produit à cause des paramètres CURL. Vous devrez ouvrir facebook.php, recherchez la méthode makeRequest () et, à l'intérieur de la fonction, recherchez cette ligne:

 $ opts = self :: $ CURL_OPTS;

Immédiatement après, ajoutez:

 $ opts [CURLOPT_SSL_VERIFYPEER] = false;

Je déteste le piratage des bibliothèques, mais je n'ai pas trouvé d'autre moyen. Eh bien, continuons avec l'enregistrement de l'utilisateur. J'ai également ajouté une instruction try / catch, car, s'il existe une ancienne clé de session dans les paramètres GET de l'URL, le script mourra avec une horrible erreur..


Étape 3. Enregistrement et authentification

Nous travaillerons ensuite avec MySQL. Veuillez noter que je ne vais pas implémenter de désinfectant de données, car je souhaite que le code soit aussi court et aussi ponctuel que possible. Veuillez garder ceci à l'esprit: désinfectez toujours vos données.

Commençons par nous connecter à la base de données.

 mysql_connect ('localhost', 'YOUR_USERNAME', 'YOUR_PASSWORD'); mysql_select_db ('YOUR_DATABASE');

Maintenant, travaillons sur le $ session conditionnel, au cas où nous aurions une session.

 # Nous avons une session active; vérifions si nous avons déjà enregistré l'utilisateur $ query = mysql_query ("SELECT * FROM utilisateurs WHERE oauth_provider = 'facebook' AND oauth_uid =". $ user ['id']); $ result = mysql_fetch_array ($ query); # Si non, ajoutons-le à la base de données if (empty ($ result)) $ query = mysql_query ("INSERT INTO utilisateurs (oauth_provider, oauth_uid, nom d'utilisateur) VALUES ('facebook', $ user ['id'] , '$ user [' name ']') "); $ query = msyql_query ("SELECT * FROM utilisateurs WHERE id =". mysql_insert_id ()); $ result = mysql_fetch_array ($ query); 

Notez que j'interroge la base de données, à la recherche de Facebook comme un oauth_provider; C'est généralement une bonne idée si vous souhaitez accepter d'autres fournisseurs OAuth (tels que Twitter, comptes Google, Open ID, etc.) et oauth_uid, puisque c'est l'identifiant que le fournisseur donne à ses comptes d'utilisateurs.

le oauth_provider champ pourrait potentiellement conduire à de mauvaises performances si on le laisse comme un texte type de champ. En tant que tel, la meilleure option est de le définir sur un type ENUM..

Nous avons maintenant un $ résultat var avec les valeurs demandées dans la base de données. Ajoutons ensuite quelques sessions. Ajoutez cette ligne au début de votre script.

 session_start ();

Après le vide ($ résultat) conditionnel, ajoutez ce qui suit:

 if (! empty ($ user)) #… if (vide ($ result)) #… # définissons les valeurs de session $ _SESSION ['id'] = $ result ['id']; $ _SESSION ['oauth_uid'] = $ result ['oauth_uid']; $ _SESSION ['oauth_provider'] = $ result ['oauth_provider']; $ _SESSION ["nom d'utilisateur"] = $ result ["nom d'utilisateur"]; 

Comme cela n’a aucun sens d’authentifier un utilisateur déjà connecté, juste en dessous de la session_start () ligne, ajouter:

 if (! empty ($ _SESSION)) header ("Emplacement: home.php"); 

Et dans les scripts nécessitant une authentification, ajoutez simplement:

 session_start (); if (! empty ($ _SESSION)) en-tête ("Emplacement: login_facebook.php"); 

Et si vous voulez afficher le nom d'utilisateur, accédez-y sous forme de tableau..

 echo 'Bienvenue'. $ _SESSION ['nom d'utilisateur']; # ou… echo 'Bienvenue'. ! empty ($ _SESSION)? $ _SESSION ['nom d'utilisateur']: 'invité';

Étape 4. Méthodes supplémentaires

Facebook a une tonne de fonctionnalités de connexion, mais voici quatre que j'ai trouvé être le plus utile.

Méthodes Héritage

Il se peut que je manque quelque chose, mais la FQL semble plus souple et plus facile que l’API Graph. Heureusement, Facebook permet toujours aux développeurs de l’utiliser, bien que la nouvelle bibliothèque ait changé un peu.

Si vous souhaitez connaître l’ID utilisateur, le prénom, le nom de famille, la vignette au carré de la photo de l’utilisateur, la plus grande photo disponible et son sexe, vous pouvez utiliser le utilisateurs.getInfo méthode.

 $ uid = $ facebook-> getUser (); $ api_call = array ('method' => 'users.getinfo', 'uids' => $ uid, 'fields' => 'uid, prenom, dernier nom, pic_square, pic_big, sex'); $ users_getinfo = $ facebook-> api ($ api_call);

Vous pouvez consulter la liste complète des champs disponibles pour Users.getInfo.

Il est possible d'obtenir le même résultat en utilisant FQL.

 $ uid = $ facebook-> getUser (); $ fql_query = array ('method' => 'fql.query', 'query' => 'SELECT uid, prenom, dernier nom, pic_square, pic_big, sex DE l'utilisateur WHERE uid ='. $ uid); $ fql_info = $ facebook-> api ($ fql_query);

Voici la liste des tables accessibles avec FQL, ainsi que les champs disponibles pour les utilisateurs de tables.

Autorisations étendues

Facebook fournit aux applications une certaine interaction avec les données de l'utilisateur, tant que cela est autorisé. Avec l'ancienne API, l'autorisation pour des autorisations supplémentaires était exclusivement disponible pour le SDK Javascript (même si je ne suis pas tout à fait sûr). Avec la nouvelle API, nous pouvons facilement rediriger l'utilisateur vers une boîte de dialogue d'autorisation de Facebook et revenir sur notre site une fois l'accès accordé ou refusé..

Dans l'exemple suivant, nous allons rediriger un utilisateur pour autoriser les mises à jour de statut des publications, les photos, les vidéos et les notes, l'adresse e-mail réelle de l'utilisateur, sa date de naissance et l'accès aux photos et aux vidéos..

 $ uid = $ facebook-> getUser (); # req_perms est une liste des autorisations nécessaires séparées par des virgules $ url = $ facebook-> getLoginUrl (array ('req_perms' => 'email, user_birthday, status_update, publish_stream, user_photos, user_videos')); en-tête ("Emplacement: $ url");

Voici une liste complète des autorisations. Notez que vous pouvez spécifier à la fois l'URL à diriger si l'utilisateur accepte et l'URL à rediriger si l'utilisateur refuse. La clé pour ces éléments de tableau sont suivant et cancel_url, respectivement. Voici un exemple rapide:

 $ url = $ facebook-> getLoginUrl (array ('req_perms' => 'email', 'next' => 'http://localhost.com/thanks.php', 'cancel_url' => 'http: // localhost .com / désolé.php '));

Si non spécifié, la valeur par défaut est l'emplacement du script demandeur.

Vérification des autorisations étendues

Étant donné que l'utilisateur peut facilement révoquer des autorisations, l'application doit toujours vérifier si une autorisation donnée est accordée avant de l'utiliser, en particulier s'il s'agit de publier quelque chose. Nous devrons utiliser l’API existante, car il semble que sa nouvelle application n’a pas encore été mise en œuvre..

 $ uid = $ facebook-> getUser (); # users.hasAppPermission $ api_call = array ('method' => 'users.hasAppPermission', 'uid' => $ uid, 'ext_perm' => 'publish_stream'); $ users_hasapppermission = $ facebook-> api ($ api_call); print_r ($ users_hasapppermission);

le ext_perm ne supportera que l'ancienne liste des permissions disponibles.

Publication sur le mur

Posons quelque chose sur le mur après avoir vérifié que l'utilisateur a bien publier_stream autorisation.

 # vérifions si l'utilisateur a autorisé l'accès au mur $ api_call = array ('method' => 'users.hasAppPermission', 'uid' => $ uid, 'ext_perm' => 'publish_stream'); $ can_post = $ facebook-> api ($ api_call); if ($ can_post) # le poster! $ facebook-> api ('/'.$ uid.' / feed ',' post ', array (' message '=>' Salut de mon application Facebook! ')); echo 'Posté!';  else die ('Autorisations requises!'); 

Nous faisons essentiellement un appel API à //alimentation, en utilisant la méthode POST (deuxième argument) et un tableau comme troisième argument pour l'envoi des données. Dans ce cas, ce troisième argument prend en charge message, lien, image, légende, prénom et la description. Voici le code:

 $ facebook-> api ('/'.$ uid.' / feed ',' post ', array (' message '=>' Le message ',' name '=>' Le nom ',' description '=>' La description ',' caption '=>' La légende ',' picture '=>' http://i.imgur.com/yx3q2.png ',' link '=>' http://net.tutsplus.com / '));

Voici comment il est posté.

Quelques informations supplémentaires à connaître:

L'utilisateur peut facilement révoquer des autorisations en deux clics dans son mur. Vous devez fortement tester ce qui pourrait arriver si un utilisateur révoquait une ou plusieurs autorisations essentielles au bon fonctionnement de votre site Web, ou même si l'application était complètement supprimée. C'est important.

  • Dans Paramètres de l'application, vous pouvez supprimer entièrement l'application en cliquant sur le x situé à droite..
  • Vous pouvez supprimer des autorisations individuellement dans la section Autorisations supplémentaires accordées..

5. Conclusion

Bien que les fonctionnalités d'authentification de Facebook soient effectivement utiles, étant donné le nombre de personnes sur Facebook ces jours-ci, son utilisation comme seule méthode d'authentification sur un site n'est pas recommandée. Qu'en est-il de ceux qui n'ont pas de compte Facebook? Ne sont-ils pas autorisés à accéder à votre application? Merci d'avoir lu!