Så här autentiserar du användare med Facebook Connect

På senare tid har det varit ganska fuzz om lat registrering. Det visar sig att ju mindre användaren måste tänka, ju högre konverteringsfrekvensen är! Vilken tanke! Om alla verkar ha en Facebook-profil, varför inte lägga till en användarregistrering med ett klick? Jag ska visa dig hur man gör det idag.


Steg 1. Installationen

MySQL-tabellen

Låt oss börja med att skapa en databas tabell.

 CREATE TABLE 'users' ('id' int (10) unsigned INTE NULL AUTO_INCREMENT, 'oauth_provider' varchar (10), 'oauth_uid' text, 'användarnamn' text, PRIMARY KEY ('id')) MOTOR = MyISAM DEFAULT CHARSET = Latin1;

Enkelt: Vi kommer att skapa ett bord för användarinformation med id, användarnamn, för- och efternamn, webbadressen till användarens bild och registrerat datum. Dessutom lägger vi till både en oauth_provider och oauth_uid fält, för att skilja mellan olika tredjeparts öppna autentiseringsprotokoll och deras identifierare. Till exempel, låt oss säga att nästa vecka bestämmer du att det är en bra idé att även låta Twitter-användare i. Easy; du ställer bara ett annat värde till oauthleverantör, och undvik duplicering av oauthuid värden.

Facebook App

Låt oss börja med att skapa en ny applikation. Ge det ett namn och godkänn villkoren. Ta sedan med dig båda API-nyckel och Hemlighet i grundfliken som visas nedan.

På fliken kanfas ställer du in båda Kanald URL och Post-Authorize Redirect URL till ditt lokala värd och sökväg som manuset kommer att behandla - något liknande http://localhost.com/login_facebook.php?. Notera frågetecknet i slutet och domänen; båda krävs av Facebook. Ställ in din värdar filen till ett giltigt domännamn.

På Connect-fliken anger du Anslut webbadressen till samma värde och set localhost.com (eller den du använder) som basdomänen.

Spara nu, ladda ner klientbiblioteket och plocka ut det facebook.php i srcdir till en ny katalog skapad i roten.


Steg 2. Återuppringningen

Autentiseringsflödet har tre steg:

  1. Det lokala skriptet genererar en URL som ber användaren om tillstånd
  2. Facebook återgår till webbadressen för kanfas som anges med en GET-parameter
  3. GET-parametern autentiserar sessionen

Låt oss göra ett snabbtest innan du registrerar dig och loggar in.

 # Vi kräver bibliotekets krav ("facebook.php"); # Skapa Facebook-objektet $ facebook = nytt Facebook (array ('appId' => 'YOUR_APP_ID', 'secret' => 'YOUR_APP_SECRET', 'cookie' => true)); # Låt oss se om vi har en aktiv session $ session = $ facebook-> getSession (); om ! tom ($ session)) # Aktiv session, låt oss försöka få användarnamnet (getUser ()) och användarinformation (api -> ('/ me')) försök $ uid = $ facebook-> getUser ); $ user = $ facebook-> api ('/ me');  fånga (Undantag $ e)  om (! tom ($ användare)) # Användarinformation ok? Låt oss skriva ut det (Här lägger vi till inloggnings- och registreringsrutinerna) print_r ($ user);  else # För teständamål, om det uppstod ett fel, låt oss döda skriptet dö ("Det fanns ett fel.");  else # Det finns ingen aktiv session, låt oss generera en $ login_url = $ facebook-> getLoginUrl (); rubrik ("Plats:". $ login_url); 

Gå nu till http://localhost.com/login_facebook.php, och låt oss se vad som händer. Om du omdirigeras till Facebook och begärt om tillstånd, är vi på rätt spår.

Det kan dock finnas två problem. Den första: om du omdirigeras till Facebook, men det visar ett fel kan det vara ett saknat värde i konfigurationen. Gå tillbaka till dina programinställningar och kolla både flikarna Connect and Canvas och se till att fälten är ok som beskrivs ovan.

Det kan finnas ett annat problem, där du ser ett fel, som "Uncaught CurlException: 60: SSL-certifikatproblem, kontrollera att CA-certifikatet är OK." Detta händer på grund av CURL-inställningarna. Du måste öppna facebook.php, hitta metoden makeRequest () och, inuti funktionen, hitta den här raden:

 $ opts = själv :: $ CURL_OPTS;

Omedelbart efter det lägger du till:

 $ opts [CURLOPT_SSL_VERIFYPEER] = false;

Jag hatar hackingbibliotek, men jag har inte hittat något annat sätt. Nåväl, låt oss fortsätta med användarregistrering. Jag har också lagt till ett försök / fångstutdrag eftersom, om det finns en gammal sessionstangent i GET-parametrarna i webbadressen, kommer manuskriptet att dö med ett hemskt fel.


Steg 3. Registrering och autentisering

Vi jobbar sedan med MySQL. Observera att jag inte kommer att implementera en datavätare eftersom jag vill behålla koden så kort och på uppgift som möjligt. Tänk på att du alltid rengör dina data.

Låt oss först ansluta till databasen.

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

Nu, låt oss arbeta på $ session villkorat, om vi har en session.

 # Vi har en aktiv session; låt oss kolla om vi redan har registrerat användaren $ query = mysql_query ("VÄLJ * FRÅN användare WHERE oauth_provider = 'facebook' OCH oauth_uid =". $ user ['id']); $ result = mysql_fetch_array ($ query); # Om inte, låt oss lägga till det i databasen om (tomt ($ resultat)) $ query = mysql_query ("INSERT INTO users (oauth_provider, oauth_uid, användarnamn) VALUES ('facebook', $ user ['id'] , "$ användare ['namn'] ')"); $ query = msyql_query ("VÄLJ * FRÅN användare WHERE id =". mysql_insert_id ()); $ result = mysql_fetch_array ($ query); 

Observera att jag frågar databasen, letar efter Facebook som en oauth_provider; Det är generellt en bra idé om du vill acceptera andra OAuth-leverantörer (som Twitter, Google-konton, Open ID, etc.) och en oauth_uid, eftersom det är den identifierare som leverantören ger till sina användarkonton.

De oauth_provider fält kan potentiellt leda till dålig prestanda om vi lämnar den som en text fälttyp. Som sådant är det bästa alternativet att ställa in en ENUM-typ.

Vi har nu en $ result var med värdena frågade från databasen. Låt oss nästa lägga till några sessioner. Lägg till den här raden i början av ditt script.

 session_start ();

Efter tom ($ result) villkorad, lägg till följande:

 om ! tom ($ användare)) # ... om (tomt ($ resultat)) # ... # låt oss ställa in sessionsvärden $ _SESSION ['id'] = $ resultat ['id']; $ _SESSION ['oauth_uid'] = $ resultat ['oauth_uid']; $ _SESSION ['oauth_provider'] = $ resultat ['oauth_provider']; $ _SESSION ['användarnamn'] = $ resultat ['användarnamn']; 

Eftersom det inte är litet förnuftigt att autentisera en användare som redan är inloggad, strax under session_start () rad, lägg till:

 om (! tomt ($ _ SESSION)) header ("Plats: home.php"); 

Och i de skript som kräver autentisering, lägg bara till:

 session_start (); om (! tomt ($ _ SESSION)) header ("Plats: login_facebook.php"); 

Och om du vill visa användarnamnet får du tillgång till det som en matris.

 echo "Välkommen". $ _SESSION [ 'användarnamn']; # eller ... echo "Välkommen". ! tomt ($ _ SESSION)? $ _SESSION ['användarnamn']: 'gäst';

Steg 4. Ytterligare metoder

Facebook har massor av anslutningsfunktioner, men här är fyra som jag har funnit vara mest användbara.

Legacy Methods

Jag kanske saknar något, men FQL verkar mer flexibel och lätt än Graph API. Lyckligtvis tillåter Facebook fortfarande utvecklare att använda det, ändå med det nya biblioteket, det har förändrats lite.

Om du vill ha användar-ID, förnamn, efternamn, kvadrerat miniatyrbild för användarbilden, den största användarbilden som är tillgänglig och hans eller hennes kön kan du använda users.getInfo metod.

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

Du kan kolla hela listan med fält som är tillgängliga för Users.getInfo.

Det är möjligt att uppnå samma resultat med hjälp av FQL.

 $ uid = $ facebook-> getUser (); $ fql_query = array ('method' => 'fql.query', 'query' => 'VÄLJ uid, first_name, last_name, pic_square, pic_big, sex FROM användare WHERE uid ='. $ uid); $ fql_info = $ facebook-> api ($ fql_query);

Här är listan över tabeller som kan nås med FQL, liksom de fält som finns tillgängliga för bordanvändarna.

Utökad behörighet

Facebook ger applikationer med viss interaktion med användarens data - bara så länge det är auktoriserat. Med det gamla APIet var auktoriseringen för ytterligare behörigheter endast tillgänglig för Javascript SDK (även om jag inte är säker). Med det nya API kan vi enkelt omdirigera användaren till en behörighetsdialog i Facebook och återvända till vår webbplats efter att åtkomsten antingen beviljats ​​eller nekats.

I det följande exemplet kommer vi att omdirigera en användare för att godkänna statusuppdateringar, foton, videoklipp och anteckningar, användarens riktiga e-postadress, födelsedag och tillgång till foton och videoklipp.

 $ uid = $ facebook-> getUser (); # req_perms är en kommaseparerad lista över behörigheterna som behövs $ url = $ facebook-> getLoginUrl (array ('req_perms' => 'email, user_birthday, status_update, publish_stream, user_photos, user_videos')); rubrik ("Plats: $ url");

Här är en fullständig lista över behörigheter. Observera att du kan ange både webbadressen för att rikta till om användaren accepterar och webbadressen omdirigeras till om användaren nekar. Nyckeln till dessa arrayelement är Nästa och cancel_url, respektive. Här är ett snabbt exempel:

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

Om det inte anges är standardet det begärande skriptets plats.

Kollar efter utökade tillstånd

Eftersom användaren enkelt kan återkalla behörigheter bör programmet alltid kontrollera om ett givet tillstånd ges innan det används, speciellt om det handlar om att publicera något. Vi måste använda legacy API, eftersom det verkar att det inte är fullt implementerat med den nya ännu.

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

De ext_perm Stödjer bara den gamla listan med tillgängliga behörigheter.

Publicering till väggen

Låt oss lägga in något på väggen efter att ha verifierat användaren har publish_stream lov.

 # Låt oss kolla om användaren har beviljat åtkomst till posten i väggen $ api_call = array ('method' => 'users.hasAppPermission', 'uid' => $ uid, 'ext_perm' => 'publish_stream'); $ can_post = $ facebook-> api ($ api_call); om ($ can_post) # posta det! $ facebook-> api ('/'.$ uid.' / feed ',' post ', array (' message '=>' Hej hej från min Facebook-app! ')); echo "Postat!";  else die ('behörigheter krävs!'); 

I huvudsak gör vi ett API-samtal till //utfodra, använder POST-metoden (andra argumentet) och en array som ett tredje argument för de data som ska skickas. I detta fall stöder detta tredje argumentet meddelande, länk, bild, rubrik, namn och beskrivning. Här är koden:

 $ facebook-> api ('/'.$ uid.' / feed ',' post ', array (' message '=>' Meddelandet ',' namn '=>' Namnet ',' description '=>' Beskrivningen ',' caption '=>' Bildtexten ',' bild '=>' http://i.imgur.com/yx3q2.png ',' link '=>' http://net.tutsplus.com / '));

Så här är det publicerat.

Några ytterligare information du borde veta:

Användaren kan enkelt återkalla behörigheter med två klick i sin vägg. Du bör starkt testa vad som kan hända om en användare återkallar en eller flera behörigheter som är avgörande för att din webbplats fungerar korrekt, eller om applikationen är helt borttagen. Det här är viktigt.

  • I Programinställningar kan du ta bort programmet helt genom att klicka på x på höger sida.
  • Du kan ta bort behörigheter individuellt i avsnittet Beviljade ytterligare behörigheter.

5. Sammanfattning

Medan Facebooks autentiseringsfunktioner verkligen är användbara, eftersom så många människor är på Facebook idag, använder den som den enda metoden för autentisering på en webbplats rekommenderas inte. Vad sägs om de som inte har Facebook-konton? Har de inte rätt att komma åt din ansökan? Tack för att du läser!