Nu-mi place să te înscrii pentru site-uri web. M-am înscris deja pentru atât de mulți, folosind nume de utilizator diferite, că revenirea la unul dintre ele și încercarea de a-mi aminti acreditările mele este uneori imposibilă. Aceste zile, majoritatea site-urilor au început să ofere modalități alternative de a vă înscrie, permițându-vă să vă utilizați Facebook, Twitter sau chiar contul dvs. Google. Crearea unei astfel de integrare se simte uneori ca o sarcină lungă și greoaie. Dar nu te teme, Omniaut este aici să te ajute.
Omniauth vă permite să integrați cu ușurință mai mult de șaizeci de furnizori de autentificare, inclusiv Facebook, Google, Twitter și GitHub. În acest tutorial, vă voi explica cum să integrați acești furnizori de autentificare în aplicația dvs..
Să creați o nouă aplicație Rails și să adăugați pietrele necesare. O să presupun că deja ai instalat Ruby și Ruby on Rails 3.1 folosind RubyGems.
rails new omniauth-tutorial
Deschide-ți acum Gemfile
și se referă la bijuteria omniautului.
gem "omniauth"
Apoi, ca de obicei, rulați instalare pachet
comanda pentru a instala bijuteria.
Pentru a adăuga un furnizor la Omniauth, va trebui să vă înscrieți ca dezvoltator pe site-ul furnizorului. Odată ce v-ați înscris, veți primi două șiruri de caractere (un fel de nume de utilizator și o parolă), care trebuie transmise Omniauth. Dacă utilizați un furnizor OpenID, atunci tot ce aveți nevoie este URL-ul OpenID.
Dacă doriți să utilizați autentificarea Facebook, mergeți la developers.facebook.com/apps și faceți clic pe "Creați aplicația nouă"?.
Completați toate informațiile necesare și după ce ați terminat, copiați ID-ul App și Secret.
Configurarea Twitter este un pic mai complicată pe o mașină de dezvoltare, deoarece nu vă permite să utilizați? Localhost? ca domeniu pentru apeluri de apel. Configurarea mediului de dezvoltare pentru acest tip de lucru este în afara scopului acestui tutorial, cu toate acestea, vă recomandăm să utilizați Pow, dacă sunteți pe un Mac.
Creați un fișier nou sub config / initializatori
denumit omniauth.rb
. Vom configura furnizorii de autentificare prin acest fișier.
Inserați următorul cod în fișierul pe care l-am creat mai devreme:
Rails.application.config.middleware.use OmniAuth :: Furnizorul de servicii Builder: facebook, YOUR_APP_ID, YOUR_APP_SECRET end
Aceasta este cu adevărat toată configurația de care aveți nevoie pentru a face acest lucru. Restul este îngrijit de Omniaut, așa cum vom găsi în pasul următor.
Să creăm controlerul sesiunilor. Rulați următorul cod în terminal pentru a crea un nou sesiuni
controler, și nou
, crea
, și eșec
acţiuni.
șinele generează sesiuni de controler nou eșec creează
Apoi, deschide-ți config / routes.rb
fișier și adăugați aceasta:
primiți '/ login',: to => 'sessions # new',: as =>: autentificare '/ auth /: provider / callback',: to => ' : la => "eșecul sesiunilor"
Să facem asta:
Asigurați-vă că ștergeți rutele create automat când ați executat ruta șinele generează
comanda. Ele nu sunt necesare pentru micul nostru proiect.
Deschide-ți app / controlere / sessions_controller.rb
scrieți și scrieți crea
astfel:
def crea auth_hash = request.env ['omniauth.auth'] render: text => sfârșitul auth_hash.inspect
Acest lucru este folosit pentru a vă asigura că totul funcționează. Indicați browserul dvs. la localhost: 3000 / auth / facebook și veți fi redirecționat (ă) la Facebook pentru a vă autoriza aplicația (destul de bine?). Autorizați-l și veți fi redirecționat înapoi la aplicația dvs. și veți vedea un hash cu anumite informații. Între acestea va fi numele dvs., idul dvs. de utilizator Facebook și adresa dvs. de e-mail, printre altele.
Următorul pas este crearea unui model de utilizator, astfel încât utilizatorii să se poată înscrie utilizând conturile lor Facebook. În consola Rails (consola rails
), creați noul model.
șine genera modelul Nume utilizator: șir de e-mail: șir
Pentru moment, utilizatorul nostru model
va avea doar o Nume
si un e-mail
. Cu acest lucru din drum, avem nevoie de o modalitate de a recunoaște utilizatorul data viitoare când vă conectați. Rețineți că în acest scop nu avem câmpuri pe modelul utilizatorului nostru.
Ideea din spatele unei aplicații ca cea pe care încercăm să o construim este că utilizatorul poate alege să utilizeze Facebook sau Twitter (sau orice alt furnizor) pentru a vă înscrie, deci avem nevoie de un alt model pentru a stoca acele informații. Să o creăm:
șinele generează modelul Furnizorul de autorizare: string uid: string user_id: integer
Un utilizator va avea una sau mai multe autorizații și atunci când cineva încearcă să se autentifice folosind un furnizor, ne uităm pur și simplu la autorizațiile din baza de date și căutăm una care se potrivește cu uid
și furnizor
câmpuri. În acest fel, permitem utilizatorilor să aibă și mai mulți furnizori, astfel încât aceștia să se poată conecta ulterior folosind Facebook sau Twitter sau orice alt furnizor pe care l-au configurat!
Adăugați următorul cod la adresa dvs. app / modele / user.rb
fişier:
has_many: autorizațiile validează: nume,: email,: presence => true
Aceasta specifică faptul că a utilizator
pot avea mai multe autorizații și că Nume
și e-mail
câmpurile din baza de date sunt obligatorii.
Apoi, la dvs. app / modele / authorization.rb
fișier, adăugați:
belongs_to: utilizatorul validează: provider,: uid,: presence => true
În cadrul acestui model, desemnează că fiecare autorizare este legată de un anumit tip de autorizare utilizator
. De asemenea, am stabilit și o validare.
Să adăugăm un cod la sesiunile noastre controlor
astfel încât să înregistreze un utilizator sau să le semneze, în funcție de caz. Deschis app / controlere / sessions_controller.rb
și modificați crea
astfel:
crea def auth_hash = request.env [ 'omniauth.auth'] @authorization = Authorization.find_by_provider_and_uid (auth_hash [ "furnizor"], auth_hash [ "uid"]) în cazul în care @authorization face: text => „Bine ai revenit # @ autorizare .user.name! V-ați înscris deja. " alt utilizator = User.new: nume => auth_hash ["user_info"] ["nume"]:: email => auth_hash ["user_info"] ["email"] user.authorizations.build: provider => auth_hash "],: uid => auth_hash [" uid "] user.save render: text =>" Salut # user.name! sfârșitul final
Acest cod are nevoie în mod clar de refactorizare, dar vom rezolva mai târziu acest lucru. Să examinăm mai întâi:
furnizor
și asta uid
. Dacă există unul, salutăm utilizatorul înapoi.furnizor
si uid
au fost date.Dă-i un test! Mergeți la localhost: 3000 / auth / facebook și ar trebui să vedeți? V-ați înscris ?. Dacă actualizați pagina, ar trebui să vedeți acum? Bine ați venit înapoi?.
Scenariul ideal ar fi să permită unui utilizator să se înregistreze utilizând un furnizor și mai târziu să adauge un alt furnizor, astfel încât să poată avea mai multe opțiuni de conectare. Aplicația noastră nu permite acest lucru deocamdată. Trebuie să refacem codul nostru puțin. Schimba-ti sessions_controlller.rb
„s crea
metoda de a arata astfel:
def create auth_hash = request.env ['omniauth.auth'] dacă sesiunea [: user_id] # Înseamnă că utilizatorul nostru este conectat. Adăugați autorizația utilizatorului User.find (sesiune [: user_id]). : text => "Acum puteți să vă conectați utilizând # auth_hash [" provider "]. altceva # Înregistrați-l sau îl înscrieți auth = Authorization.find_or_create (auth_hash) # Creați sesiunea de sesiune [: user_id] = auth.user.id render: text => "Welcome # auth.user.name sfârșitul final
Să analizăm acest lucru:
Pentru ca codul de mai sus să funcționeze, trebuie să adăugăm câteva metode pentru a noastră Utilizator
și Autorizare
modele. Deschis user.rb
și adăugați următoarea metodă:
add_provider def (auth_hash) # Verificați dacă există deja furnizorul, așa că nu-l adăugați de două ori, cu excepția cazului authorizations.find_by_provider_and_uid (auth_hash [ "furnizor"], auth_hash [ "uid"]) Authorization.create: user => auto,: furnizor => auth_hash ["provider"],: uid => auth_hash ["uid"] end end
Dacă utilizatorul nu are deja asociat acest furnizor cu contul, vom continua și îl adăugăm - simplu. Acum, adăugați această metodă la dvs. authorization.rb
fişier:
self.find_or_create def (auth_hash) cu excepția cazului în AUTH = find_by_provider_and_uid (auth_hash [ "furnizor"], auth_hash [ "uid"]) utilizator = User.create: name => auth_hash [ "user_info"] [ "nume"],: e-mail = > auth_hash ["user_info"] ["email"] auth = create: user => utilizator,: provider => auth_hash ["provider"
În codul de mai sus, încercăm să găsim o autorizație care să corespundă solicitării și, dacă nu este reușită, vom crea un nou utilizator.
Dacă doriți să încercați acest lucru local, veți avea nevoie de un al doilea furnizor de autentificare. Ați putea folosi sistemul OAuth al Twitter-ului, dar, așa cum am subliniat anterior, va trebui să folosiți o abordare diferită, deoarece Twitter nu permite utilizarea "localhost" ca domeniu de URL de apel invers (cel puțin nu funcționează pentru mine). De asemenea, ați putea încerca să găzduiți codul pe Heroku, ceea ce este perfect pentru un site simplu, precum cel pe care îl creăm.
În cele din urmă, trebuie, desigur, să permitem utilizatorilor să se deconecteze. Adăugați această bucată de cod la controlerul sesiunilor:
def distruge sesiune [: user_id] = nil render: text => "Ai deconectat!" Sfârșit
De asemenea, trebuie să creați ruta aplicabilă (în routes.rb
).
get '/ logout',: to => 'sesiuni # distruge'
Este la fel de simplu ca asta! Dacă navigați la localhost: 3000 / logout, sesiunea dvs. ar trebui eliminată și veți fi deconectat. Acest lucru va facilita încercarea mai multor conturi și furnizori. De asemenea, trebuie să adăugăm un mesaj care se afișează atunci când utilizatorii refuză accesul la aplicația noastră. Dacă vă aduceți aminte, am adăugat acest traseu lângă începutul tutorialului. Acum, trebuie doar să adăugăm metoda în sesiuni
controlor:
def rupt render: text => "Ne pare rău, dar nu ați permis accesul la aplicația noastră!" Sfârșit
Și nu în ultimul rând, creați pagina de conectare, unde utilizatorul poate face clic pe "Conectați-vă cu Facebook"? legătură. Deschis app / opinii / sesiuni / new.html.erb
si adauga:
<%= link_to "Connect With Facebook", "/auth/facebook" %>
Dacă accesați localhost: 3000 / login, veți vedea un link care vă va redirecționa către pagina de autentificare Facebook.
Sper că acest articol ți-a oferit un scurt exemplu despre cum funcționează Omniauth. Este o bijuterie considerabil puternică și vă permite să creați site-uri web care nu necesită înscrierea utilizatorilor, ceea ce este întotdeauna un plus! Puteți afla despre Omniauth pe GitHub.
Spuneți-ne dacă aveți întrebări!