Cum să autentificați utilizatorii prin Facebook Connect

În ultimul timp, a fost destul de fuzz despre înregistrarea leneș. Se pare că, cu cât utilizatorul trebuie să gândească mai puțin, cu atât sunt mai mari ratele de conversie! Ce gând! Dacă toată lumea pare să aibă un profil Facebook, de ce nu adăugați o înregistrare cu un singur clic? Îți arăt cum să faci asta astăzi.


Pasul 1. Setarea

Tabela MySQL

Să începem prin crearea unei tabele de baze de date.

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

Destul de simplu: vom configura o tabelă pentru informații despre utilizatori cu id, nume de utilizator, nume și prenume, adresa URL a imaginii utilizatorului și data înregistrată. De asemenea, adăugăm atât o oauth_provider și oauth_uid pentru a distinge între diferitele protocoale de autentificare deschise ale terților și identificatorii acestora. De exemplu, să presupunem că, săptămâna viitoare, decideți că este o idee bună să lăsați și utilizatorii de Twitter. tocmai ați stabilit o altă valoare pentru oauthfurnizor, și pentru a evita duplicarea oauthuid valori.

Aplicația Facebook

Să începem prin crearea unei noi aplicații. Dați-i un nume și sunteți de acord cu termenii și condițiile. Apoi, apucați ambele Cheia API și Secret în fila de bază, după cum se arată mai jos.

În fila panza, setați atât Canvas URL și Adresa URL de redirecționare post-autorizare la adresa locală și calea pe care scenariul o va procesa - ceva de genul http://localhost.com/login_facebook.php?. Rețineți semnul de întrebare la sfârșit și domeniu; ambele sunt cerute de Facebook. Pur și simplu setați-vă gazde fișier la un nume de domeniu valabil.

În fila de conectare, setați adresa URL Conectare la aceeași valoare și setați localhost.com (sau cel pe care îl utilizați) ca domeniu de bază.

Salvați acum, descărcați biblioteca client și dezarhivați facebook.php în srcdir la un nou director creat în rădăcină.


Pasul 2. Callback-ul

Fluxul de autentificare are trei etape:

  1. Scriptul local generează o adresă URL care solicită permisiunea utilizatorului
  2. Facebook revine la URL-ul Canvas specificat cu un parametru GET
  3. Parametrul GET autentifică sesiunea

Să facem un test rapid înainte de înregistrare și de conectare.

 # Ne cerem biblioteca să solicite ("facebook.php"); # Crearea obiectului facebook $ facebook = noul Facebook (array ('appId' => 'YOUR_APP_ID', 'secret' => 'YOUR_APP_SECRET', 'cookie' => true)); # Să vedem dacă avem o sesiune activă $ session = $ facebook-> getSession (); dacă (! empty ($ session)) # Sesiune activă, să încercăm să obținem ID-ul utilizatorului (getUser ()) și informațiile despre utilizator (api -> ' ); $ user = $ facebook-> api ('/ me');  captură (Excepție $ e)  dacă (! gol ($ user)) # Informații utilizator ok? Să tipărim (aici vom adăuga login-ul și rutinele de înregistrare) print_r ($ user);  altceva # În scopuri de testare, dacă a apărut o eroare, să ucidem scriptul mor ("A apărut o eroare");  altceva # Nu există sesiune activă, să generăm un $ login_url = $ facebook-> getLoginUrl (); antet ("Locație:". $ login_url); 

Acum, du-te la http://localhost.com/login_facebook.php, și să vedem ce se întâmplă. Dacă sunteți redirecționat (ă) la Facebook și ați cerut permisiunea, suntem pe drumul cel bun.

Cu toate acestea, ar putea exista două probleme. Primul: dacă sunteți redirecționat (ă) la Facebook, dar prezintă o eroare, este posibil să existe o valoare lipsă în configurație. Reveniți la setările aplicației dvs. și verificați filele Conectați și Canvas și asigurați-vă că câmpurile sunt ok așa cum este descris mai sus.

S-ar putea să existe o altă problemă, în cazul în care vedeți o eroare, cum ar fi problema "Uncaught CurlException: 60: SSL certificate, verificați dacă certificatul CA este OK". Acest lucru se întâmplă din cauza setărilor CURL. Va trebui să deschizi facebook.php, găsiți metoda makeRequest () și, în interiorul funcției, găsiți această linie:

 $ opts = auto :: $ CURL_OPTS;

Imediat după aceasta, adăugați:

 opțiuni $ [CURLOPT_SSL_VERIFYPEER] = false;

Urăsc bibliotecile de hacking, dar nu am găsit altă cale. Ei bine, să continuăm cu înregistrarea utilizatorilor. Am adăugat, de asemenea, o instrucțiune de încercare / captură, deoarece dacă există o cheie de sesiune veche în parantezele GET din URL, scriptul va muri cu o eroare oribilă.


Pasul 3. Înregistrarea și autentificarea

Vom lucra în continuare cu MySQL. Vă rugăm să rețineți că nu voi pune în aplicare un dezinfectant de date, deoarece vreau să păstrez codul cât mai scurt și pe cât posibil. Țineți cont de acest lucru: întotdeauna vă dezinstalați datele.

Mai întâi, să ne conectăm la baza de date.

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

Acum, hai să lucrăm la sesiune de $ condiționată, în cazul în care avem o sesiune.

 # Avem o sesiune activă; să verificăm dacă am înregistrat deja utilizatorul $ query = mysql_query ("SELECT * FROM users WHERE oauth_provider = 'facebook' și oauth_uid =". $ user ['id']); $ result = mysql_fetch_array ($ interogare); # Dacă nu, să o adăugăm la baza de date dacă (gol ($ rezultat)) $ query = mysql_query ("INSERT INTO users" (oauth_provider, oauth_uid, username) VALUES , '$ user [' nume ']')); $ query = msyql_query ("SELECT * FROM utilizatori WHERE id =". mysql_insert_id ()); $ result = mysql_fetch_array ($ interogare); 

Rețineți că interoghez baza de date, căutând Facebook ca oauth_provider; este, în general, o idee bună dacă doriți să acceptați alți furnizori de servicii OAuth (cum ar fi Twitter, Conturi Google, Open ID etc.) și o oauth_uid, deoarece este identificatorul pe care furnizorul îl dă conturilor de utilizator.

oauth_provider domeniul ar putea duce la performanțe proaste dacă lăsăm acest lucru ca atare text tip de câmp. Ca atare, cea mai bună opțiune este setarea la un tip ENUM.

Avem acum a $ rezultat var cu valorile cerute din baza de date. Să adăugăm apoi câteva sesiuni. Adăugați această linie la începutul scriptului.

 session_start ();

După gol ($ rezultat) condiționată, adăugați următoarele:

 dacă (empty) ($ user)) # ... dacă (gol ($ rezultat)) # ... # să setăm valorile sesiunii $ _SESSION ['id'] = $ result ['id']; $ _SESSION ['oauth_uid'] = $ rezultat ['oauth_uid']; $ _SESSION ['oauth_provider'] = $ rezultat ['oauth_provider']; $ _SESSION ['username'] = $ rezultat ['username']; 

Deoarece nu are sens să autentificați un utilizator care este deja conectat, chiar sub session_start () line, adăugați:

 dacă ! empty ($ _ SESSION) antet ("Locație: home.php"); 

Și în scripturile care necesită autentificare, adăugați:

 session_start (); dacă ! empty ($ _ SESSION) header ("Locație: login_facebook.php"); 

Și dacă doriți să afișați numele de utilizator, accesați-l ca un matrice.

 echo "Bun venit". $ _SESSION [ 'username']; # sau ... echo 'Welcome'. ! goală ($ _ SESSION)? $ _SESSION ['username']: 'invitat';

Pasul 4. Metode suplimentare

Facebook are o mulțime de caracteristici de conectare, dar aici sunt patru pe care le-am găsit a fi cele mai utile.

Metode vechi

S-ar putea să lipsească ceva, dar FQL pare mai flexibil și mai ușor decât Graph API. Din fericire, Facebook încă permite dezvoltatorilor să o folosească, deși cu noua bibliotecă, sa schimbat puțin.

Dacă doriți numele de utilizator, prenumele, numele de familie, pictograma pătrată pentru imaginea utilizatorului, cea mai mare imagine de utilizator disponibilă și sexul său, puteți utiliza 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);

Puteți verifica lista completă a câmpurilor disponibile pentru Users.getInfo.

Este posibil să se obțină același rezultat, folosind FQL.

 $ uid = $ facebook-> getUser (); $ fql_query = array ('method' => 'fql.query', 'query' => 'SELECT uid, first_name, last_name, pic_square, pic_big, sex FROM user WHERE uid ='. $ uid); $ fql_info = $ facebook-> api ($ fql_query);

Iată lista tabelelor care pot fi accesate cu FQL, precum și câmpurile disponibile pentru utilizatorii tabelului.

Permisiuni extinse

Facebook oferă aplicații cu o anumită interacțiune cu datele utilizatorului - atâta timp cât este autorizată. Cu vechiul API, autorizarea pentru permisiuni suplimentare a fost disponibilă exclusiv pentru Javascript SDK (cu toate că nu sunt sigur). Cu ajutorul noului API, putem redirecționa cu ușurință utilizatorul la un dialog de autorizare pe Facebook și vom putea reveni la site-ul nostru după ce accesul este acordat sau refuzat.

În următorul exemplu, vom redirecționa un utilizator pentru a autoriza actualizările de stare a postărilor, fotografiile, videoclipurile și notele, adresa de e-mail reală a utilizatorului, ziua de naștere și accesul la fotografii și videoclipuri.

 $ uid = $ facebook-> getUser (); # req_perms este o listă separată prin virgulă a permisiunilor necesare $ url = $ facebook-> getLoginUrl (array ('req_perms' => 'email, user_birthday, status_update, publish_stream, user_photos, user_videos')); antet ("Locație: $ url");

Iată o listă completă a permisiunilor. Rețineți că puteți specifica atât adresa URL care să fie direcționată spre dacă utilizatorul acceptă, cât și urlul care trebuie redirecționat în cazul în care utilizatorul refuză. Cheia pentru aceste elemente de matrice este Următor → și cancel_url, respectiv. Iată un exemplu rapid:

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

Dacă nu este specificat, implicit este locația scriptului solicitant.

Verificarea permiselor extinse

Întrucât utilizatorul poate revoca cu ușurință permisiunile, aplicația ar trebui să verifice întotdeauna dacă o permisiune dată este acordată înainte de ao folosi, mai ales dacă este vorba de publicarea de ceva. Va trebui să folosim API-ul vechi, deoarece pare că nu este încă implementat integral cu noul API.

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

ext_perm va suporta doar vechea listă de permisiuni disponibile.

Publicarea la Zid

Să postăm ceva în perete după ce verificăm dacă utilizatorul are publish_stream permisiune.

 # să verificăm dacă utilizatorul a acordat accesul la postarea în perete $ api_call = array ('method' => 'users.hasAppPermission', 'uid' => $ uid, 'ext_perm' => 'publish_stream'); $ can_post = $ facebook-> api ($ api_call); dacă ($ can_post) # post it! $ facebook-> api ('/'.$ uid.' / feed ',' post ', array (' message '=>' Salut de pe Facebook! '); ecou 'Postat!';  altceva die ("Permisiuni necesare!"); 

În esență, facem apel la API //a hrani, utilizând metoda POST (al doilea argument) și o matrice ca un al treilea argument pentru datele care urmează să fie trimise. În acest caz, acest al treilea argument susține mesaj, legătură, imagine, legendă, Nume și Descriere. Iată codul:

 $ facebook-> api ('/'.$ uid. / feed', 'post', array ('message' => 'Message', 'name' => Descrierea ',' caption '=>' Caption ',' picture '=>' http://i.imgur.com/yx3q2.png ',' link '=>' http://net.tutsplus.com / '));

Iată cum este postat.

Unele informații suplimentare pe care trebuie să le cunoașteți:

Utilizatorul poate revoca ușor permisiunile cu două clicuri pe perete. Trebuie să testați cu tărie ce s-ar întâmpla dacă un utilizator a revocat una sau mai multe permisiuni care sunt vitale pentru buna funcționare a site-ului dvs. sau chiar dacă aplicația este complet eliminată. Asta e important.

  • În Setările aplicației, puteți elimina în întregime aplicația dând clic pe butonul x din partea dreaptă.
  • Puteți să eliminați permisiunile în mod individual în secțiunea Permisiuni suplimentare acordate.

5. Concluzie

În timp ce capabilitățile de autentificare Facebook sunt într-adevăr utile, deoarece atât de mulți oameni se află pe Facebook în aceste zile, nu se recomandă utilizarea acesteia ca singura metodă de autentificare într-un site. Ce-i cu cei care nu au conturi Facebook? Nu li se permite să acceseze aplicația? Vă mulțumim pentru lectură!

Cod