Cum să utilizați Omniauth pentru a vă autentifica utilizatorii

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..


Pasul 1: Pregătirea aplicației

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.


Pasul 2: Crearea unui furnizor

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.


Pasul 3: Adăugați furnizorii dvs. la aplicație

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.


Pasul 4: Crearea paginii de conectare

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:

  • Prima linie este utilizată pentru a crea un simplu formular de autentificare în care utilizatorul va vedea o simplă conectare cu Facebook? legătură.
  • A doua linie este să prindeți apelul furnizorului. După ce un utilizator autorizează aplicația dvs., furnizorul îl redirecționează către această adresă URL, astfel încât să putem utiliza datele sale.
  • Ultimul va fi utilizat atunci când există o problemă sau dacă utilizatorul nu a autorizat aplicația noastră.

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.


Pasul 5: Crearea modelului de utilizator

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.


Pasul 6: Adăugarea unui pic de logică la controlerul sesiunilor

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:

  • Verificăm dacă există o autorizație pentru asta furnizor și asta uid. Dacă există unul, salutăm utilizatorul înapoi.
  • Dacă nu există nicio autorizație, vom semna utilizatorul. Creați un nou utilizator cu numele și adresa de e-mail pe care furnizorul ne oferă (în acest caz Facebook) și asociem o autorizație cu 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?.


Pasul 7: Activarea mai multor furnizori

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:

  • Dacă utilizatorul este deja conectat, vom adăuga furnizorul pe care îl utilizează în contul său.
  • Dacă nu sunteți conectat (ă), vom încerca să găsim un utilizator cu respectivul furnizor sau să creăm unul nou dacă este necesar.

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.


Pasul 8: Unele Tweaks Extra

Î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.


Concluzie

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!

Cod