Kako koristiti OAuth

Kako koristiti OAuth

Objavljeno na: 21 ožujka, 2025

Super, započinjem istraživanje za tehnički blog post s naslovom “Kako dodati OAuth u vašu aplikaciju”, s naglaskom na Google OAuth i Laravel (ili sličan backend framework). Uključit ću pregled tehnologije, konkretne korake integracije (s kodom), prednosti i sigurnosne preporuke. Javit ću se čim bude spremno!

Kako dodati OAuth u vašu aplikaciju

Moderni web projekti često omogućuju prijavu korisnika putem vanjskih servisa poput Googlea, Facebooka i sl. Ovakav način autentifikacije bazira se na OAuth 2.0 protokolu. U ovom blog postu objasnit ćemo što je OAuth 2.0 i zašto ga koristiti, te ćemo proći detaljne korake implementacije Google OAuth prijave u Laravel aplikaciji koristeći paket Socialite. Također ćemo se osvrnuti na sigurnosne napomene, prednosti za korisničko iskustvo i sigurnost, te na to kako i dalje zadržati kontrolu nad korisničkim računima u vašoj aplikaciji.

Što je OAuth 2.0 i zašto ga koristiti?

OAuth 2.0 je standardni okvir za autorizaciju koji omogućuje aplikacijama trećih strana ograničeni pristup korisničkim računima bez potrebe da korisnik otkriva svoje osjetljive vjerodajnice (poput lozinke) direktno toj aplikaciji (What Is Single Sign-On (SSO)? An Introduction To Simplified Authentication – Sanchit Gurukul1). To znači da se vaša web aplikacija ne mora baviti provjerom korisnikove lozinke; umjesto toga, ona preusmjerava korisnika na pouzdanog pružatelja identiteta (npr. Google), koji zatim potvrđuje identitet korisnika i vašoj aplikaciji vraća informacije o korisniku.

Glavni razlozi za korištenje OAuth 2.0 pri prijavi korisnika su:

  • Sigurnost: Korisnici ne dijele lozinku s vašom aplikacijom. Time se smanjuje rizik od krađe lozinki i neovlaštenog pristupa. Autentikaciju obavlja pružatelj usluge (Google) koji koristi snažne sigurnosne mehanizme (poput dvofaktorske autentifikacije, detekcije sumnjivih prijava, itd.).
  • Poboljšano korisničko iskustvo: OAuth omogućuje Single Sign-On iskustvo – korisnici se mogu prijaviti jednim klikom koristeći račun koji već posjeduju. Nema potrebe za ispunjavanjem dugih formi za registraciju ili pamćenjem još jedne lozinke.
  • Pouzdanost: Servisi poput Googlea imaju visoku razinu dostupnosti i pouzdanosti u procesu autentifikacije. Također, korisnici imaju kontrolu nad davanjem i oduzimanjem pristupa vašoj aplikaciji putem postavki svog Google računa.
  • Standardizacija: OAuth 2.0 je dobro podržan standard. Mnogi moderni backend frameworki (uključujući Laravel) nude alate ili pakete za jednostavnu integraciju OAuth prijave.

Važno je napomenuti da je OAuth 2.0 primarno protokol za autorizaciju (dozvolu pristupa), dok se za stvarnu autentikaciju identiteta često koristi dodatak nazvan OpenID Connect na temeljima OAuth-a. U kontekstu “prijave s Googleom”, koristi se upravo ta kombinacija (OpenID Connect) kako bi aplikacija dobila potvrđene podatke o korisniku (npr. njegovu email adresu, ime i sl.) nakon uspješne OAuth autorizacije. Za potrebe ovog članka, nećemo ulaziti u razliku između OAuth2 i OpenID Connect – dovoljno je znati da implementacijom Google prijave kroz standardne biblioteke (poput Socialite) dobivamo potrebne podatke o korisniku i pristup njegovom Google profilu (u opsegu kojem smo zatražili dozvolu).

Implementacija Google OAuth prijave u Laravel

U nastavku slijedi korak-po-korak vodič za integraciju Google OAuth 2.0 prijave u Laravel aplikaciju koristeći Laravel Socialite paket. Laravel Socialite je službeni paket Laravel frameworka koji pojednostavljuje autentifikaciju preko OAuth pružatelja (third-party servisa). Socialite trenutačno podržava prijavu putem raznih popularnih servisa poput Facebooka, Twittera (X), LinkedIna, Googlea, GitHuba i drugih (Laravel Socialite – Laravel 12.x – The PHP Framework For Web Artisans).

Pretpostavljamo da već imate postavljen Laravel projekt sa standardnom autentifikacijom (npr. preko emaila/lozinke) i migriranu tablicu users. Integracija “Prijave s Googleom” sastoji se od sljedećih koraka:

1. Instalacija paketa Socialite

Prvi korak je instalacija paketa laravel/socialite putem Composera. Socialite će obaviti najveći dio posla komunikacije s Googleom za nas. U terminalu, unutar korijena vašeg Laravel projekta, pokrenite:

composer require laravel/socialite

Ovim će se paket dodati u vaše Laravel okruženje. Nakon instalacije, ako vaš Laravel nije auto-discover-ao paket, možda ćete morati dodati Socialite Facade i Service Provider. Međutim, za nove verzije Laravel-a to nije potrebno jer Composer autoload automatski registrira Socialite.

2. Kreiranje Google OAuth vjerodajnica (Google API konzola)

Sljedeći korak odvija se na strani Googlea. Morate registrirati svoju aplikaciju na Google-u kako biste dobili Client ID (ID klijenta) i Client Secret (tajni ključ) koje će vaša aplikacija koristiti u OAuth protokolu. Koraci su sljedeći:

  1. Kreirajte projekt na Google Cloud konzoli: Posjetite Google Developers Credentials stranicu (ili Google Cloud Console) i izradite novi projekt za svoju web aplikaciju ako već niste.
  2. OAuth pristup zaslon (Consent Screen): U okviru odabranog projekta, navigirajte do “OAuth consent screen”. Odaberite tip aplikacije (External za javne web aplikacije) i ispunite osnovne informacije o aplikaciji (naziv, email za podršku, domenu ako je imate, itd.). Dodajte i opseg podataka koji želite od korisnika – za osnovnu prijavu obično su dovoljni profil i email.
  3. Kreirajte OAuth 2.0 vjerodajnice: Nakon što ste definirali consent screen, idite na Credentials sekciju i kliknite “Create Credentials” -> “OAuth client ID”. Odaberite Web Application kao tip aplikacije.
  4. Authorized redirect URI (Ovlašteni URI preusmjeravanja): Prilikom kreiranja OAuth klijenta, bit će potrebno unijeti redirect URI. To je URL na vašojoj aplikaciji na koji će Google preusmjeriti korisnika nakon uspješne autentikacije. Postavite redirect URI na točan URL vaše Laravel aplikacije za obradu Google povratnog poziva. Primjer: https://vaša-domena.hr/auth/google/callback. (Napomena: Za razvojnu okolinu bez SSL-a može se koristiti npr. http://localhost:8000/auth/google/callback, no za produkciju Google zahtijeva HTTPS URI.)
  5. Nakon kreiranja, Google će vam prikazati Client ID i Client Secret. Zapišite ih ili ih odmah preuzmite (možete ih kasnije pronaći na Credentials stranici). Ove vrijednosti unijet ćemo u konfiguraciju Laravel aplikacije.

3. Konfiguracija Laravel aplikacije za Google OAuth

Sada, kada imamo Google OAuth vjerodajnice, potrebno ih je unijeti u našu Laravel aplikaciju i konfigurirati Socialite da ih koristi.

.env varijable: Otvorite svoj Laravel projekt i u datoteku .env dodajte sljedeće unose (ili dopunite ako već postoje):

GOOGLE_CLIENT_ID=<vaš_google_client_id>
GOOGLE_CLIENT_SECRET=<vaš_google_client_secret>
GOOGLE_REDIRECT_URI=<vaš_redirect_url>

Zamijenite vrijednosti odgovarajućim podatcima s Google konzole. GOOGLE_REDIRECT_URI treba biti identičan URI-ju koji ste postavili u Google konzoli (npr. https://vaša-domena.hr/auth/google/callback).

config/services.php: Laravel dolazi s konfiguracijskom datotekom config/services.php gdje se nalaze ključne informacije za integraciju s vanjskim servisima. U tu datoteku dodajte konfiguraciju za Google driver. Na primjer:

// config/services.php

'google' => [
    'client_id' => env('GOOGLE_CLIENT_ID'),
    'client_secret' => env('GOOGLE_CLIENT_SECRET'),
    'redirect' => env('GOOGLE_REDIRECT_URI'),
],

Ovo će Socialite-u dati do znanja koje vjerodajnice treba koristiti za Google OAuth. U novijim verzijama Laravel aplikacija, često su sekcije za popularne Socialite providere već pripremljene (možda komentirane) u services.php, pa ih možete i samo odkomentirati i popuniti.

4. Dodavanje ruta i kontrolera za autentifikaciju s Googleom

S konfigurirane strane Googlea i Laravel aplikacije, sljedeći korak je izrada potrebnih ruta i kontrolera koji će pokrenuti OAuth proces.

U datoteci routes/web.php dodajte dvije rute:

use App\Http\Controllers\SocialAuthController;  // ili naziv vašeg kontrolera

// ...

// Ruta koja preusmjerava korisnika na Google za autentikaciju
Route::get('/auth/google', [SocialAuthController::class, 'redirectToGoogle'])->name('auth.google');

// Ruta na koju se Google vraća s podacima (redirect URI)
Route::get('/auth/google/callback', [SocialAuthController::class, 'handleGoogleCallback']);

Objasnjenje:

  • Prva ruta /auth/google će inicirati proces prijave – kada korisnik klikne na “Prijava s Googleom” gumb u vašoj aplikaciji, pozvat će se ova ruta koja treba korisnika preusmjeriti na Google OAuth 2.0 stranicu za prijavu.
  • Druga ruta /auth/google/callback je redirect URI na koji će se Google vraćati s informacijom o korisniku nakon što korisnik dozvoli pristup. Ovu rutu smo već unijeli u Google konzoli u prethodnom koraku, i sada je implementiramo u kodu.

Sada kreirajmo kontroler SocialAuthController (naziv po želji, npr. GoogleAuthController, ali ovdje pretpostavljamo kontroler za sve social logine). Možete ga kreirati Artisan komandnom:

php artisan make:controller SocialAuthController

U kontroleru dodajte sljedeće metode:

namespace App\Http\Controllers;

use Laravel\Socialite\Facades\Socialite;
use App\Models\User;
use Illuminate\Support\Facades\Auth;
use Illuminate\Http\Request;

class SocialAuthController extends Controller
{
    public function redirectToGoogle()
    {
        // Redirect korisnika na Google OAuth stranicu
        return Socialite::driver('google')->redirect();
    }

    public function handleGoogleCallback(Request $request)
    {
        try {
            // Dohvaćanje Google korisničkih podataka nakon povratka
            $googleUser = Socialite::driver('google')->user();

            // Izdvajanje potrebnih informacija
            $googleId = $googleUser->getId();
            $email = $googleUser->getEmail();
            $name = $googleUser->getName();

            // Pronalaženje postojeće registracije korisnika na temelju Google ID-a ili emaila
            $user = User::where('google_id', $googleId)->orWhere('email', $email)->first();

            if ($user) {
                // Postojeći korisnik – osvježi možda ime ili avatar, ako želite
                $user->update([
                    'name' => $name,
                    // Ovdje bi se mogao osvježiti avatar URL itd. ako $googleUser daje te podatke
                ]);
            } else {
                // Novi korisnik – kreiraj zapis u bazi
                $user = User::create([
                    'name' => $name,
                    'email' => $email,
                    'google_id' => $googleId,
                    // Možete generirati i neki random password ako je polje obavezno, npr:
                    'password' => bcrypt(str()->random(16)),
                ]);
            }

            // Prijavi (ulogiraj) korisnika u aplikaciju
            Auth::login($user);

            // Preusmjeri na željenu stranicu (npr. dashboard)
            return redirect('/dashboard');
        
        } catch (\Exception $e) {
            // U slučaju pogreške, možete redirektati na login stranicu s porukom
            return redirect('/login')->with('error', 'Neuspješna prijava s Googleom.');
        }
    }
}

Objašnjenje kontrolera:

  • Metoda redirectToGoogle() koristi Socialite fasadu za generiranje Google OAuth 2.0 zahtjeva. Metoda Socialite::driver('google')->redirect() će automatski korisnika preusmjeriti na Googleov ekran za prijavu i suglasnost.
  • Metoda handleGoogleCallback() poziva se kada Google preusmjeri korisnika natrag na našu aplikaciju. Socialite-ova metoda user() dohvaća podatke o korisniku s Googlea (npr. ID, ime, email, avatar i tokeni). U kodu radimo sljedeće:
    • Provjeravamo postoji li već korisnik u bazi s danim Google ID-om ili možda istim emailom. (Ovo omogućuje da, ako se korisnik ranije registrirao običnom prijavom s istim emailom, možemo prepoznati da je to isti račun i povezati ga s Google prijavom.)
    • Ako korisnik postoji, možemo osvježiti neke podatke (npr. ime ili profilnu sliku) iz Google profila, ili taj dio preskočiti.
    • Ako korisnik ne postoji, kreiramo novi zapis u bazi. Pri tome spremamo barem name, email i google_id. Polje password možemo postaviti na neki generirani string (ionako se neće koristiti za prijavu, osim ako planiramo dozvoliti i klasičnu prijavu lozinkom kasnije – u tom slučaju mogli bismo korisniku poslati email da postavi lozinku).
    • Nakon toga, koristeći Auth::login($user), prijavimo korisnika u Laravel aplikaciju kao da se prijavio našim klasičnim sustavom. To znači da će se kreirati session za tog korisnika i dalje će ga Laravel prepoznavati kroz uobičajeni Auth mehanizam.
    • Na kraju preusmjeravamo korisnika na neku sigurnu stranicu (npr. dashboard ili početnu stranicu aplikacije) kao prijavljenog korisnika.
  • U slučaju iznimke (npr. korisnik odbije pristup, ili dođe do greške u komunikaciji), hvatamo exception i preusmjeravamo korisnika nazad na login stranicu uz prikaz poruke o grešci. (U produkciji, dobro je i logirati detalje greške radi otklanjanja poteškoća.)

Napomena: Prije nego ovaj kod proradi, provjerite da ste dodali polje google_id u vašu tablicu korisnika (npr. preko migracije dodajte nullable string column google_id u tablicu users). Ovo polje će služiti za pohranu jedinstvenog Google ID-a korisnika kako bismo znali je li se već prijavljivao putem Googlea.

5. Testiranje integracije

Kad je sve konfigurirano, možete na svoj frontend (Blade template ili JavaScript aplikaciju) dodati gumb “Prijava putem Googlea” koji vodi korisnika na prethodno definiranu rutu (npr. <a href="{{ route('auth.google') }}">Prijava s Google</a>). Klikom na taj link, trebali biste biti preusmjereni na Google. Nakon što odaberete Google račun i date dozvolu, Google će vas vratiti na auth/google/callback rutu, a vaš backend će obraditi podatke i prijaviti vas.

Provjerite slijedeće u procesu testiranja:

  • Je li redirect URI identičan onom u Google konzoli (uključujući protokol, domenu i path)?
  • Jeste li omogućili odgovarajuće API pristupe na Google konzoli? (Za osnovni profil i email obično nije potrebno ništa dodatno uključiti jer Google Account daje te podatke, no starije Google API konzole tražile su npr. uključivanje Google+ API za dobivanje profila; za nove projekte to više nije slučaj i dovoljni su osnovni OpenID Connect scope-ovi.)
  • Nakon prijave, provjerite da li je korisnik kreiran/upućen u bazu kako ste zamislili i da li Auth::check() prepoznaje korisnika kao prijavljenog.

Sigurnosne napomene

Implementacija OAuth prijave poboljšava sigurnost aplikacije, ali potrebno je obratiti pozornost na nekoliko stvari kako bi sustav bio u potpunosti siguran:

  • HTTPS (SSL): Obavezno koristite SSL certifikat i HTTPS protokol na produkciji za bilo kakvu autentifikaciju. Google OAuth zahtijeva HTTPS redirect URI-je (osim u razvojnim okolinama za localhost). SSL sprječava prisluškivanje osjetljivih podataka (poput tokena) u prijenosu.
  • Država (state) parametar: OAuth 2.0 protokol koristi parametar “state” koji pomaže u sprječavanju CSRF napada. Laravel Socialite automatski brine o tome i generira state token u pozadini prilikom preusmjeravanja na providera, a zatim ga provjerava na povratku. Nemojte isključivati tu provjeru. (Korištenje stateless() metode u Socialite-u se ne preporučuje osim ako radite na stateless API autentikaciji, u kom slučaju morate sami brinuti o CSRF zaštiti.)
  • Pohrana tajni (Client Secret): Vaš Google Client ID i Client Secret čuvajte povjerljivo. Nemojte ih stavljati u javni frontend kod niti ih dijeliti. Držite ih u server-side konfiguraciji (npr. .env datoteka) i nikada ne commita-jte .env u repozitorij koda.
  • Validacija i provjera podataka: Iako dobijamo podatke o korisniku od Googlea (kojem uglavnom možemo vjerovati), dobro je napraviti osnovne provjere. Na primjer, provjerite je li email verificiran (Googleov API obično vraća informaciju je li email potvrđen). Također, ako se oslanjate na redirect nakon prijave (npr. intended URL), razmotrite sigurnost tog mehanizma kako biste spriječili open redirect napade.
  • Ograničenje opsega (scopes): Zatražite samo onaj opseg (scope) podataka koji vam je zaista potreban. U našem primjeru koristimo zadane scope-ove koje Socialite traži za Google (obično email i profile). Izbjegavajte tražiti osjetljivije dozvole od korisnika jer nepotrebno povećavaju rizik (i smanjuju šansu da će korisnik pristati na prijavu).
  • Ažuriranje paketa: Povremeno provjerite imate li najnoviju verziju Socialite paketa (i Laravel frameworka) kako biste imali ispravljene eventualne sigurnosne propuste ili bugove.

Prednosti za korisničko iskustvo i sigurnost

Implementacija Google OAuth prijave donosi brojne benefite kako za korisnike, tako i za vas kao developera i vašu aplikaciju:

  • Brza prijava i registracija: Korisnici mogu kreirati račun ili se prijaviti jednim klikom, koristeći postojeći Google račun. Nema potrebe za ispunjavanjem formulara ili potvrdom email adrese (Google već jamči za autentičnost emaila).
  • Manje zaporki za pamćenje: Korisnici ne moraju pamtiti još jednu lozinku niti koristiti istu lozinku na više mjesta (što je loša sigurnosna praksa). Smatrajte to svojevrsnim Single Sign-On iskustvom na koje su korisnici navikli.
  • Povjerenje i sigurnost: Korisnici možda više vjeruju velikom provideru poput Googlea da sigurno rukuje njihovim prijavama. Također, na strani aplikacije, vi uopće ne baratate korisničkim lozinkama, čime smanjujete odgovornost zaštite tih lozinki. Sve autentifikacijske operacije (poput provjere ispravnosti lozinke, 2FA, itd.) obavlja Google umjesto vas.
  • Verificirani podaci: Podaci koje dobijete od Googlea (ime, email) uglavnom su već verificirani. Email adresa će gotovo sigurno biti provjerena od strane Googlea, što pojednostavljuje proces verifikacije računa (nema potrebe da šaljete vlastiti verifikacijski email u tom slučaju).
  • Upravljanje sesijama i tokenima: Vaša aplikacija se ne mora baviti niskonivojskim detaljima OAuth tokova. Primjerice, Google Sign-In upravlja OAuth 2.0 protokom i životnim ciklusom tokena, što pojednostavljuje integraciju s Google API-jevima, a korisnik uvijek ima opciju opozvati pristup aplikaciji u bilo kojem trenutku preko svog Google računa (Integrating Google Sign-In into your web app  |  Authentication  |  Google for Developers). Drugim riječima, ako korisnik izgubi povjerenje u vašu aplikaciju, lako može poništiti dozvolu bez potrebe da mijenja svoju lozinku na Googleu.

Naravno, OAuth prijava nije zamjena za sve sigurnosne mjere – i dalje trebate voditi računa o zaštiti korisničkih podataka u vašoj bazi, pravilno označiti HTTPOnly cookie-je, koristiti zaštitu od XSS/CSRF u ostatku aplikacije itd. No, uklanjanjem lozinki iz jednadžbe, već ste napravili veliki korak ka sigurnijoj aplikaciji.

Vaš sustav i dalje upravlja korisničkim računima

Iako se korisnik autentificira preko Googlea, vaša backend aplikacija i dalje treba upravljati korisničkim računima i povezanim podacima. OAuth pruža samo način da potvrdite identitet korisnika, ali vaš sustav odlučuje kako će te informacije iskoristiti. Evo što to znači u praksi:

  • Kada se korisnik prvi put prijavi putem Googlea, vi ćete u bazi stvoriti novi korisnički račun (npr. zapis u tablici users). U njega ćete pohraniti osnovne podatke dobivene od Googlea (ime, email, Google ID, avatar URL…). Taj zapis može imati i interno generiranu lozinku (kao što smo u primjeru kreirali random string) u slučaju da kasnije poželite omogućiti i klasičnu prijavu lozinkom za tog korisnika.
  • Za svaku sljedeću prijavu tog istog korisnika preko Googlea, vaš sustav će prepoznati korisnika prema google_id ili email adresi i ulogirati ga na njegov postojeći račun. Dakle, korisnički podaci (poput uloge, postavki, sadržaja koji je kreirao u aplikaciji) vezani su uz taj račun u vašoj bazi.
  • Ako želite, možete omogućiti da jedan korisnik ima više načina prijave povezano s istim računom. Na primjer, korisnik može imati i zaporku za direktnu prijavu i povezanu Google prijavu. To se obično rješava dodavanjem kolona poput google_id, facebook_id u tablicu korisnika ili još bolje kroz zasebnu tablicu povezanu na korisnika s raznim providerima.
  • Bitno je shvatiti da Google ovdje služi samo za provjeru identiteta. Sva autorizacija unutar aplikacije (što korisnik smije ili ne smije raditi, koje podatke može vidjeti) i dalje se provodi u vašem kodu, na temelju podataka u vašoj bazi.

Zbog ovakvog modela, možete i dalje imati punu kontrolu nad korisničkim računima. Primjerice, možete deaktivirati korisnički račun u vašoj bazi i time onemogućiti pristup aplikaciji čak i ako je Google autentifikacija uspješna (korisnik bi se prijavio na Google, ali vaš sustav može provjeriti status i odlučiti odbiti pristup). Tako zadržavate mogućnost provođenja vlastitih pravila i politika nad korisničkim računima.

Zaključak

Integracija Google OAuth 2.0 prijave u vašu web aplikaciju može značajno unaprijediti korisničko iskustvo i sigurnost. Uz Laravel Socialite, implementacija ovakve funkcionalnosti relativno je jednostavna čak i za juniore – većina složenosti OAuth protokola je abstrahirana. Korisnici dobivaju brz i siguran način prijave, a vi smanjujete teret brige o pohrani lozinki i implementaciji cjelokupnog autentifikacijskog mehanizma.

Pri implementaciji nemojte zaboraviti na sigurnosne prakse: koristite HTTPS, čuvajte tajne ključeve, validirajte povratne podatke i pazite na tok preusmjeravanja. Također, tretirajte OAuth kao dodatak vašem sustavu autentifikacije – backend i dalje treba upravljati time koji su korisnici u sustavu i što im je dozvoljeno.

Nadamo se da vam je ovaj vodič pomogao razumjeti kako dodati OAuth (konkretno, Google prijavu) u vašu aplikaciju. Sada možete svojim korisnicima ponuditi praktičnu opciju “Prijava s Googleom” i iskoristiti prednosti moderne autentifikacije u praksi. Sretno s implementacijom!

Kontakt

Pošaljite nam poruku i pretvorite posjetitelje vaše web stranice u eure