So authentifizieren Sie Benutzer mit Facebook Connect

In letzter Zeit gab es eine ganze Fase über die faule Registrierung. Es stellt sich heraus, dass die Conversion-Raten umso höher sind, je weniger der Benutzer denken muss. Was für ein Gedanke! Wenn jeder ein Facebook-Profil zu haben scheint, können Sie eine Benutzerregistrierung mit einem Klick hinzufügen. Ich werde dir heute zeigen, wie das geht.


Schritt 1. Das Setup

MySQL-Tabelle

Beginnen wir mit dem Erstellen einer Datenbanktabelle.

 CREATE TABLE 'users' ('id' int (10) vorzeichenlos NOT NULL AUTO_INCREMENT, 'oauth_provider' varchar (10), 'oauth_uid' text, 'username' text, PRIMARY KEY ('id')) ENGINE = MyISAM DEFAULT CHARSET = latin1;

Ganz einfach: Wir werden eine Tabelle mit Informationen zu Benutzernamen mit Benutzername, Vor- und Nachname, der URL zum Benutzerbild und dem registrierten Datum einrichten. Außerdem fügen wir beide ein oauth_provider und oauth_uid Felder, um zwischen verschiedenen offenen Authentifizierungsprotokollen von Drittanbietern und deren Bezeichnern zu unterscheiden. Nehmen wir beispielsweise an, Sie würden nächste Woche entscheiden, dass es eine gute Idee ist, auch Twitter-Benutzer hereinzulassen. Einfach; Sie setzen einfach einen anderen Wert für die DurchsichtAnbieter, und vermeiden Sie das DuplizierenUID-Werte.

Die Facebook-App

Beginnen wir mit dem Erstellen einer neuen Anwendung. Geben Sie ihm einen Namen und stimmen Sie den Bedingungen zu. Als nächstes greifen Sie beide API-Schlüssel und Geheimnis in der Grundregisterkarte wie unten gezeigt.

Legen Sie auf der Leinwand-Registerkarte sowohl die Canvas-URL und Weiterleitungs-URL nach Autorisierung zu Ihrem localhost und Pfad, den das Skript verarbeiten wird - etwa so http://localhost.com/login_facebook.php?. Beachten Sie das Fragezeichen am Ende und die Domäne. Beide werden von Facebook benötigt. Einfach einstellen Gastgeber Datei auf einen gültigen Domänennamen.

Legen Sie auf der Registerkarte "Verbinden" die Verbindungs-URL auf denselben Wert und Satz fest localhost.com (oder die von Ihnen verwendete) als Basisdomäne.

Speichern Sie nun, laden Sie die Client-Bibliothek herunter und entpacken Sie sie facebook.php in dem srcdir zu einem neuen Verzeichnis, das im Stammverzeichnis erstellt wurde.


Schritt 2. Der Rückruf

Der Authentifizierungsablauf umfasst drei Schritte:

  1. Das lokale Skript generiert eine URL, in der der Benutzer um Erlaubnis gefragt wird
  2. Facebook kehrt zur Canvas-URL zurück, die mit einem GET-Parameter angegeben wurde
  3. Der Parameter GET authentifiziert die Sitzung

Lassen Sie uns einen kurzen Test machen, bevor Sie sich registrieren und einloggen.

 # Wir benötigen die Bibliothek erfordern ("facebook.php"); # Erstellen des Facebook-Objekts $ facebook = neues Facebook (Array ('appId' => 'YOUR_APP_ID', 'secret' => 'YOUR_APP_SECRET', 'cookie' => true)); # Mal sehen, ob wir eine aktive Sitzung haben. $ Session = $ facebook-> getSession (); if (! empty ($ session)) # Aktive Sitzung, versuchen wir, die Benutzer-ID (getUser ()) und die Benutzerinformationen (api -> ('/ me')) abzurufen. versuchen Sie es mit $ uid = $ facebook-> getUser ( ); $ user = $ facebook-> api ('/ me');  catch (Ausnahme $ e)  if (! empty ($ user)) # Benutzerinfo ok? Lassen Sie es uns ausdrucken (Hier fügen wir die Anmelde- und Registrierungsroutinen hinzu) print_r ($ user);  else # Wenn zu Testzwecken ein Fehler aufgetreten ist, lassen Sie uns den Skriptwürfel töten ("Es ist ein Fehler aufgetreten.");  else # Es ist keine aktive Sitzung vorhanden, generieren Sie eine $ login_url = $ facebook-> getLoginUrl (); header ("Location:". $ login_url); 

Gehen Sie jetzt zu http://localhost.com/login_facebook.php, und mal sehen was passiert. Wenn Sie zu Facebook weitergeleitet werden und um Erlaubnis gebeten werden, sind wir auf dem richtigen Weg.

Es kann jedoch zwei Probleme geben. Die erste: Wenn Sie zu Facebook umgeleitet werden, jedoch ein Fehler angezeigt wird, fehlt möglicherweise ein Wert in der Konfiguration. Gehen Sie zurück zu Ihren Anwendungseinstellungen und überprüfen Sie die Registerkarten Verbinden und Leinwand. Stellen Sie sicher, dass die Felder wie oben beschrieben in Ordnung sind.

Möglicherweise gibt es ein anderes Problem, bei dem ein Fehler angezeigt wird, z. B. "Nicht abgeholte CurlException: 60: Problem mit SSL-Zertifikat. Stellen Sie sicher, dass das CA-Zertifikat in Ordnung ist." Dies geschieht aufgrund der CURL-Einstellungen. Sie müssen sich öffnen facebook.php, Suchen Sie die Methode makeRequest () und finden Sie in der Funktion diese Zeile:

 $ opts = self :: $ CURL_OPTS;

Gleich danach folgendes hinzufügen:

 $ wählt [CURLOPT_SSL_VERIFYPEER] = false;

Ich hasse es, Bibliotheken zu hacken, aber ich habe keinen anderen Weg gefunden. Nun, fahren wir mit der Benutzerregistrierung fort. Ich habe auch eine try / catch-Anweisung hinzugefügt, denn wenn in den URLs der GET-Parameter alte Sitzungsschlüssel vorhanden sind, stirbt das Skript mit einem schrecklichen Fehler.


Schritt 3. Registrierung und Authentifizierung

Als nächstes arbeiten wir mit MySQL. Bitte beachten Sie, dass ich keinen Data-Desinfizierer implementieren werde, da ich den Code so kurz und aufgabenorientiert wie möglich halten möchte. Bitte beachten Sie dies: Bereinigen Sie Ihre Daten immer.

Zuerst verbinden wir uns mit der Datenbank.

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

Lass uns jetzt an der arbeiten $ session bedingt, falls wir eine Sitzung haben.

 # Wir haben eine aktive Sitzung. Lassen Sie uns prüfen, ob wir bereits den Benutzer $ query = mysql_query registriert haben ("SELECT * FROM Benutzer WHERE oauth_provider = 'facebook' AND oauth_uid =". $ user ['id']); $ result = mysql_fetch_array ($ query); # Wenn nicht, fügen Sie ihn der Datenbank hinzu, wenn (empty ($ result)) $ query = mysql_query ("INSERT INTO-Benutzer (oauth_provider, oauth_uid, username)) VALUES ('facebook', $ user ['id']) , '$ user [' name ']') "); $ query = msyql_query ("SELECT * FROM Benutzer WHERE id =". mysql_insert_id ()); $ result = mysql_fetch_array ($ query); 

Beachten Sie, dass ich die Datenbank abfrage und suche Facebook Als ein oauth_provider; Im Allgemeinen ist es eine gute Idee, wenn Sie andere OAuth-Anbieter (wie Twitter, Google-Konten, Open ID usw.) akzeptieren möchten oauth_uid, da dies die Kennung ist, die der Anbieter seinen Benutzerkonten gibt.

Das oauth_provider Ein Feld könnte zu einer schlechten Leistung führen, wenn wir es als Text Feldtyp. Daher ist die beste Option die Einstellung auf einen ENUM-Typ.

Wir haben jetzt eine $ Ergebnis var mit den von der Datenbank abgefragten Werten. Als nächstes fügen wir einige Sitzungen hinzu. Fügen Sie diese Zeile am Anfang Ihres Skripts ein.

 session_start ();

Nach dem leer ($ Ergebnis) fügen Sie Folgendes hinzu:

 if (! empty ($ user)) #… if (empty ($ result)) #… # Setzen wir die Sitzungswerte $ _SESSION ['id'] = $ result ['id']; $ _SESSION ['oauth_uid'] = $ result ['oauth_uid']; $ _SESSION ['oauth_provider'] = $ result ['oauth_provider']; $ _SESSION ['username'] = $ result ['username']; 

Da macht es wenig Sinn, einen bereits angemeldeten Benutzer direkt unter dem zu authentifizieren session_start () Zeile hinzufügen:

 if (! empty ($ _ SESSION)) header ("Location: home.php"); 

Und in den Skripten, die eine Authentifizierung erfordern, fügen Sie einfach Folgendes hinzu:

 session_start (); if (! empty ($ _ SESSION)) header ("Location: login_facebook.php"); 

Wenn Sie den Benutzernamen anzeigen möchten, greifen Sie als Array darauf zu.

 Echo "Willkommen". $ _SESSION ['Benutzername']; # oder… Echo 'Welcome'. ! leer ($ _ SESSION)? $ _SESSION ['username']: 'guest';

Schritt 4. Zusätzliche Methoden

Facebook hat eine Menge Verbindungsfunktionen, aber hier sind vier, die ich für am nützlichsten gehalten habe.

Legacy-Methoden

Ich vermisse vielleicht etwas, aber die FQL scheint flexibler und einfacher zu sein als die Graph-API. Glücklicherweise erlaubt Facebook es Entwicklern immer noch, es zu verwenden, obwohl es mit der neuen Bibliothek etwas geändert wurde.

Wenn Sie die Benutzer-ID, den Vornamen, den Nachnamen, das quadratische Miniaturbild für das Benutzerbild, das größte verfügbare Benutzerbild und dessen Geschlecht anzeigen möchten, können Sie das verwenden users.getInfo Methode.

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

Sie können die vollständige Liste der für Users.getInfo verfügbaren Felder überprüfen.

Mit FQL kann das gleiche Ergebnis erzielt werden.

 $ uid = $ facebook-> getUser (); $ fql_query = array ('method' => 'fql.query', 'query' => 'SELECT UID, Vorname, Nachname, Pic_Square, Pic_Big, Geschlecht FROM Benutzer WHERE UID ='. $ UID); $ fql_info = $ facebook-> api ($ fql_query);

Hier ist die Liste der Tabellen, auf die mit FQL zugegriffen werden kann, sowie die für die Tabellenbenutzer verfügbaren Felder.

Erweiterte Berechtigungen

Facebook bietet Anwendungen die Möglichkeit, mit den Daten des Nutzers zu interagieren - solange es autorisiert ist. Mit der alten API war die Berechtigung für zusätzliche Berechtigungen ausschließlich für das Javascript SDK verfügbar (obwohl ich nicht ganz sicher bin). Mit der neuen API können wir den Benutzer leicht zu einem Autorisierungsdialogfeld in Facebook umleiten und zu unserer Website zurückkehren, nachdem der Zugriff gewährt oder verweigert wurde.

Im folgenden Beispiel werden wir einen Benutzer umleiten, um Statusaktualisierungen, Fotos, Videos und Notizen, die tatsächliche E-Mail-Adresse des Benutzers, den Geburtstag und den Zugriff auf Fotos und Videos zu autorisieren.

 $ uid = $ facebook-> getUser (); # req_perms ist eine durch Kommas getrennte Liste der erforderlichen Berechtigungen. $ url = $ facebook-> getLoginUrl (array ('req_perms' => 'email, user_birthday, status_update, publish_stream, user_photos, user_videos')); header ("Location: $ url");

Hier ist eine vollständige Liste der Berechtigungen. Beachten Sie, dass Sie sowohl die URL angeben können, an die weitergeleitet werden soll, wenn der Benutzer dies akzeptiert, als auch die URL, zu der umgeleitet werden soll, wenn der Benutzer dies ablehnt. Der Schlüssel für diese Array-Elemente lautet Nächster und cancel_url, beziehungsweise. Hier ein kurzes Beispiel:

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

Wenn nicht angegeben, ist der Standardwert der Speicherort des anfordernden Skripts.

Überprüfen auf erweiterte Berechtigungen

Da der Benutzer Berechtigungen problemlos widerrufen kann, sollte die Anwendung vor der Verwendung immer prüfen, ob eine bestimmte Berechtigung erteilt wurde, insbesondere, wenn etwas veröffentlicht wird. Wir werden die ältere API verwenden müssen, da sie mit der neuen API noch nicht vollständig implementiert ist.

 $ 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);

Das ext_perm unterstützt nur die alte Liste der verfügbaren Berechtigungen.

Veröffentlichen an der Wand

Lassen Sie uns etwas an die Wand posten, nachdem Sie bestätigt haben, dass der Benutzer das hat publish_stream Genehmigung.

 # Überprüfen Sie, ob der Benutzer Zugriff auf die Veröffentlichung in der Pinnwand gewährt hat. $ api_call = array ('method' => 'users.hasAppPermission', 'uid' => $ uid, 'ext_perm' => 'publish_stream'); $ can_post = $ facebook-> api ($ api_call); if ($ can_post) # post it! $ facebook-> api ('/' .$ uid. '/ feed', 'post', array ('message' => 'Hallo von meiner Facebook-App!')); Echo 'Posted!';  else die ('Berechtigungen erforderlich!'); 

Im Wesentlichen machen wir einen API-Aufruf an //Futter, Verwenden der POST-Methode (zweites Argument) und eines Arrays als drittes Argument für die zu sendenden Daten. In diesem Fall unterstützt dieses dritte Argument Botschaft, Verknüpfung, Bild, Bildbeschriftung, Name und Beschreibung. Hier ist der Code:

 $ facebook-> api ('/'.$ uid.' / feed ',' post ', array (' message '=>' Die Nachricht ',' name '=>' The name ',' description '=>' Die Beschreibung ',' caption '=>' The caption ',' picture '=>' http://i.imgur.com/yx3q2.png ',' link '=>' http://net.tutsplus.com / '));

So wird es veröffentlicht.

Einige zusätzliche Informationen, die Sie kennen sollten:

Der Benutzer kann Berechtigungen einfach mit zwei Klicks in seiner Wand widerrufen. Sie sollten gründlich testen, was passieren kann, wenn ein Benutzer eine oder mehrere Berechtigungen widerrufen hat, die für das ordnungsgemäße Funktionieren Ihrer Website unerlässlich sind, oder sogar, wenn die Anwendung vollständig entfernt wird. Das ist wichtig.

  • In den Anwendungseinstellungen können Sie die Anwendung vollständig entfernen, indem Sie auf das x auf der rechten Seite klicken.
  • Sie können Berechtigungen einzeln im Abschnitt Zugewiesene zusätzliche Berechtigungen entfernen.

5. Schlussfolgerung

Die Authentifizierungsfunktionen von Facebook sind zwar in der Tat nützlich, da sich heutzutage so viele Menschen auf Facebook befinden, wird die Verwendung von Facebook als einzige Authentifizierungsmethode auf einer Website nicht empfohlen. Was ist mit denen, die keine Facebook-Konten haben? Dürfen sie nicht auf Ihre Bewerbung zugreifen? Danke fürs Lesen!