Slik godkjenner du brukere med Facebook Connect

I det siste har det vært ganske fuzz om lat registrering. Det viser seg at jo mindre brukeren må tenke, jo høyere konverteringsfrekvensene er! Hva en tanke! Hvis alle ser ut til å ha en Facebook-profil, hvorfor ikke legge til en enkelt-brukerregistrering? Jeg skal vise deg hvordan du gjør det i dag.


Trinn 1. Oppsettet

MySQL Tabell

La oss begynne med å opprette en databasetabell.

 CREATE TABLE 'users' ('id' int (10) usignert IKKE NULL AUTO_INCREMENT, 'oauth_provider' varchar (10), 'oauth_uid' tekst, 'brukernavn' tekst, PRIMARY KEY ('id')) MOTOR = MyISAM DEFAULT CHARSET = latin1;

Ganske enkelt: Vi skal sette opp et bord for brukerinformasjon med id, brukernavn, for- og etternavn, nettadressen til brukerens bilde og registrert dato. Vi legger også til både en oauth_provider og oauth_uid felt, for å skille mellom ulike tredjeparts åpne autentiseringsprotokoller og deres identifikatorer. For eksempel, la oss si at i neste uke bestemmer du at det er en god ide å også la Twitter-brukere inn. Easy; du har bare satt en annen verdi til oauthleverandør, og unngå duplisering av oauthuid verdier.

Facebook App

La oss begynne med å lage en ny applikasjon. Gi det et navn og godta vilkårene. Deretter ta tak i begge API-nøkkel og Hemmelig i hovedfanen som vist nedenfor.

På lerret-fanen, sett inn begge Kanal URL og Post-Authorize Redirect URL til ditt lokalehost og sti som skriptet vil behandle - noe som helst http://localhost.com/login_facebook.php?. Merk spørsmålstegnet på slutten og domenet; Begge er påkrevet av Facebook. Bare sett din verter filen til et gyldig domenenavn.

På Koble-fanen, angi Koble URL til samme verdi og sett localhost.com (eller den du bruker) som Base Domain.

Lagre nå, last ned klientbiblioteket, og pakke ut facebook.php i srcdir til en ny katalog opprettet i roten.


Trinn 2. Tilbakeringingen

Autentiseringsflyten har tre trinn:

  1. Det lokale skriptet genererer en nettadresse som ber brukeren om tillatelse
  2. Facebook returnerer til kanalen URL spesifisert med en GET-parameter
  3. GET-parameteren autentiserer økten

La oss lage en rask test før du registrerer og logger inn.

 # Vi krever at biblioteket krever ("facebook.php"); # Opprett facebook-objektet $ facebook = nytt Facebook (array ('appId' => 'YOUR_APP_ID', 'secret' => 'YOUR_APP_SECRET', 'cookie' => true)); # La oss se om vi har en aktiv økt $ session = $ facebook-> getSession (); hvis ! tom ($ økt)) # Aktiv økt, la oss prøve å få bruker-ID (getUser ()) og brukerinformasjon (api -> ('/ me')) prøv $ uid = $ facebook-> getUser ); $ user = $ facebook-> api ('/ me');  fangst (Unntak $ e)  hvis (! tom ($ bruker)) # Brukerinformasjon ok? La oss skrive ut det (Her legger vi til innlogging og registreringsrutiner) print_r ($ user);  ellers # For testing, hvis det oppstod en feil, la oss drepe skriptet dør ("Det oppsto en feil.");  else # Det er ingen aktiv økt, la oss generere en $ login_url = $ facebook-> getLoginUrl (); header ("Location:". $ login_url); 

Nå, gå til http://localhost.com/login_facebook.php, og la oss se hva som skjer. Hvis du blir omdirigert til Facebook og bedt om tillatelse, er vi på rett spor.

Det kan imidlertid være to problemer. Den første: Hvis du blir omdirigert til Facebook, men det viser en feil, kan det være en manglende verdi i konfigurasjonen. Gå tilbake til programinnstillingene dine, og kontroller både Koblinger og lerret-fanene og kontroller at feltene er ok som beskrevet ovenfor.

Det kan være et annet problem, der du ser en feil, som "Uncaught CurlException: 60: SSL-sertifikatproblem, kontroller at CA-certifikatet er OK." Dette skjer på grunn av CURL-innstillingene. Du må åpne facebook.php, finn metoden makeRequest (), og inne i funksjonen finner du denne linjen:

 $ opts = selv :: $ CURL_OPTS;

Du følger umiddelbart ved å legge til:

 $ opts [CURLOPT_SSL_VERIFYPEER] = false;

Jeg hater hackingbibliotek, men jeg har ikke funnet en annen måte. Vel, la oss fortsette med brukerregistrering. Jeg har også lagt til en prøve / catch-setning, fordi hvis det er en gammel øktnøkkel i GET-parametrene i nettadressen, vil skriptet dø med en forferdelig feil.


Trinn 3. Registrering og godkjenning

Vi jobber nå med MySQL. Vær oppmerksom på at jeg ikke vil implementere data sanitizer, siden jeg vil beholde koden så kort og mulig som mulig. Vær så snill å huske på: rengjør alltid dataene dine.

La oss først koble til databasen.

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

La oss nå jobbe på $ session betinget, hvis vi har en økt.

 # Vi har en aktiv økt; la oss sjekke om vi allerede har registrert brukeren $ query = mysql_query ("SELECT * FROM users WHERE oauth_provider = 'facebook' OG oauth_uid =". $ bruker ['id']); $ result = mysql_fetch_array ($ query); # Hvis ikke, la oss legge det til i databasen hvis (tomt ($ resultat)) $ query = mysql_query ("INSERT INTO brukere (oauth_provider, oauth_uid, brukernavn) VALUES ('facebook', $ user ['id'] , '$ bruker [' navn ']') "); $ query = msyql_query ("SELECT * FROM users WHERE id =". mysql_insert_id ()); $ result = mysql_fetch_array ($ query); 

Merk at jeg spør etter databasen, leter etter facebook som en oauth_provider; Det er vanligvis en god ide om du vil godta andre OAuth-leverandører (som Twitter, Google-kontoer, Open ID, etc.) og en oauth_uid, siden det er identifikatoren som leverandøren gir til brukerkontoene sine.

De oauth_provider feltet kan potensielt føre til dårlig ytelse hvis vi forlater det som en tekst felttype. Som det er det beste alternativet å sette det til en ENUM-type.

Vi har nå en $ resultat var med verdiene forespurt fra databasen. La oss neste legge til noen økter. Legg til denne linjen i begynnelsen av skriptet ditt.

 session_start ();

Etter tom ($ resultat) betinget, legg til følgende:

 Hvis ! tom ($ bruker)) # ... hvis (tomt ($ resultat)) # ... # la oss sette øktverdier $ _SESSION ['id'] = $ resultat ['id']; $ _SESSION ['oauth_uid'] = $ resultat ['oauth_uid']; $ _SESSION ['oauth_provider'] = $ resultat ['oauth_provider']; $ _SESSION ['brukernavn'] = $ resultat ['brukernavn']; 

Siden det er lite fornuftig å godkjenne en bruker som allerede er logget inn, like under session_start () linje, legg til:

 hvis (! tomt ($ _ SESSION)) header ("Location: home.php"); 

Og i skriptene som krever godkjenning, bare legg til:

 session_start (); hvis (! tomt ($ _ SESSION)) header ("Location: login_facebook.php"); 

Og hvis du vil vise brukernavnet, kan du få tilgang til det som en matrise.

 ekko 'Velkommen'. $ _SESSION [ 'brukernavn']; # eller ... ekko 'Velkommen'. ! tom ($ _ SESSION)? $ _SESSION ['brukernavn']: 'gjest';

Trinn 4. Ytterligere metoder

Facebook har massevis av tilkoblingsfunksjoner, men her er fire som jeg har funnet å være mest nyttige.

Legacy Methods

Jeg kan gå glipp av noe, men FQL virker mer fleksibelt og enkelt enn Graph API. Heldigvis, Facebook lar fortsatt utviklere bruke det, alt sammen med det nye biblioteket, det har endret seg litt.

Hvis du vil ha bruker-ID, fornavn, etternavn, kvadrert miniatyrbilde for brukerbildet, det største brukerbildet som er tilgjengelig, og hans eller hennes kjønn, kan du bruke users.getInfo metode.

 $ 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 sjekke hele listen over felt som er tilgjengelige for Users.getInfo.

Det er mulig å oppnå det samme resultatet ved hjelp av FQL.

 $ uid = $ facebook-> getUser (); $ fql_query = array ('method' => 'fql.query', 'query' => 'VELg avid, fornavn, etternavn, bilde_square, bilde_big, sex FRA bruker WHERE uid ='. $ uid); $ fql_info = $ facebook-> api ($ fql_query);

Her er listen over tabeller som kan nås med FQL, samt feltene som er tilgjengelige for bordbrukerne.

Utvidede tillatelser

Facebook gir applikasjoner med noe samspill med brukerens data - bare så lenge det er autorisert. Med den gamle APIen var autorisasjonen for tilleggstillatelser utelukkende tilgjengelig for Javascript SDK (alt jeg er ikke helt sikker på). Med den nye API kan vi enkelt omdirigere brukeren til en autorisasjonsdialog i Facebook, og returnere til nettstedet vårt etter at tilgangen enten er gitt eller nektet.

I det følgende eksemplet vil vi omdirigere en bruker for å godkjenne innleggsstatusoppdateringer, bilder, videoer og notater, brukerens ekte e-postadresse, bursdag og tilgang til bilder og videoer.

 $ uid = $ facebook-> getUser (); # req_perms er en kommaseparert liste over tillatelsene som trengs $ url = $ facebook-> getLoginUrl (array ('req_perms' => 'email, user_birthday, status_update, publish_stream, user_photos, user_videos')); header ("Location: $ url");

Her er en full liste over tillatelser. Merk at du kan spesifisere både webadressen for å henvise til om brukeren aksepterer og adressen som skal omdirigeres til hvis brukeren nekter. Nøkkelen for disse arrayelementene er neste og cancel_url, henholdsvis. Her er et raskt eksempel:

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

Hvis ikke spesifisert, er standard stedet for forespørselskriptet.

Sjekker for utvidede tillatelser

Siden brukeren enkelt kan tilbakekalle tillatelser, bør søknaden alltid kontrollere om en gitt tillatelse er gitt før du bruker den, spesielt hvis det handler om å publisere noe. Vi må bruke den gamle APIen, som det ser ut til at den ikke er fullt implementert med den nye ennå.

 $ 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 Vil bare støtte den gamle listen over tilgjengelige tillatelser.

Publisering til veggen

La oss legge inn noe på veggen etter å ha bekreftet at brukeren har publish_stream tillatelse.

 # la oss sjekke om brukeren har gitt tilgang til innlegg i veggen $ api_call = array ('method' => 'users.hasAppPermission', 'uid' => $ uid, 'ext_perm' => 'publish_stream'); $ can_post = $ facebook-> api ($ api_call); hvis ($ can_post) # post det! $ facebook-> api ('/'.$ uid.' / feed ',' post ', array (' message '=>' Hei hei fra min Facebook app! ')); ekko 'Skrevet!';  ellers die ('Tillatelser kreves!'); 

I hovedsak lager vi et API-anrop til //mate, ved hjelp av POST-metoden (andre argument) og en matrise som et tredje argument for dataene som skal sendes. I dette tilfellet støtter dette tredje argumentet budskap, link, bilde, bildetekst, Navn og beskrivelse. Her er koden:

 $ facebook-> api ('/'.$ uid.' / feed ',' post ', array (' message '=>' Meldingen ',' navn '=>' Navnet ',' description '=>' Beskrivelsen ',' caption '=>' Tekstet ',' bilde '=>' http://i.imgur.com/yx3q2.png ',' link '=>' http://net.tutsplus.com / '));

Slik blir det lagt ut.

Noen tilleggsinformasjon du bør vite:

Brukeren kan enkelt tilbakekalle tillatelser med to klikk i veggen sin. Du bør sterkt teste hva som kan skje hvis en bruker tilbakekalte en eller flere tillatelser som er avgjørende for at nettstedet ditt fungerer, eller om applikasjonen er fullt fjernet. Dette er viktig.

  • I Programinnstillinger kan du fjerne programmet helt ved å klikke på x på høyre side.
  • Du kan fjerne tillatelser individuelt i delen Tillatte tillatelser.

5. Konklusjon

Selv om Facebooks autentiseringsfunksjoner er virkelig nyttige, siden så mange mennesker er på Facebook i disse dager, er det ikke anbefalt å bruke det som den eneste metoden for godkjenning på et nettsted. Hva med de som ikke har Facebook-kontoer? Har de ikke lov til å få tilgang til søknaden din? Takk for at du leste!