Junior
Kako se odvija proces autentifikacije?
sobes.tech АИ
Одговор од АИ
Proces autentifikacije korisnika u frontend aplikaciji obično se sastoji od sledećih koraka:
- Zahtev za korisničkim podacima: Korisnik unosi korisničko ime i lozinku u formu na sajtu ili u aplikaciji.
- Slanje podataka na server: Frontend šalje te podatke na server (backend) putem HTTP zahteva (obično
POST) na poseban endpoint za autentifikaciju. Podaci mogu biti poslati u telu zahteva u JSON ili FormData formatu. - Provera podataka na serveru: Backend prima podatke, proverava ih u svojoj bazi podataka (na primer, da li korisničko ime postoji i da li se hash unete lozinke poklapa sa hash-om u bazi).
- Generisanje tokena/sesije: Ako su podaci tačni, server generiše jedinstveni token za autentifikaciju. To može biti:
- ID sesije: Server kreira sesiju i povezuje je sa korisnikom, šaljući klijentu identifikator sesije (na primer, u
HttpOnlykolačiću). - Token (na primer JWT): Server generiše token koji sadrži informacije o korisniku i njegovim pravima, potpisujući ga svojim tajnim ključem. Ovaj token se šalje klijentu.
- ID sesije: Server kreira sesiju i povezuje je sa korisnikom, šaljući klijentu identifikator sesije (na primer, u
- Slanje tokena/sesije klijentu: Server odgovara frontend-u, šaljući generisani token za autentifikaciju.
- Ako se koristi ID sesije, on se obično prosleđuje u
Set-CookieHTTP zaglavlju. - Ako se koristi token, može biti prosleđen u telu odgovora (JSON) ili u
Authorizationzaglavlju (Bearer <token>).
- Ako se koristi ID sesije, on se obično prosleđuje u
- Skladištenje tokena na klijentu: Frontend prima token i čuva ga za buduće zahteve.
- ID sesije se automatski čuva u kolačićima pretraživača.
- Token može biti sačuvan u
localStorage,sessionStorageili kolačićima (saHttpOnlyzastavicom za zaštitu od XSS). Preporučuje se korišćenjeHttpOnlykolačića za pristupne tokene, jer to smanjuje rizik od krađe tokena putem XSS.
- Korišćenje tokena za zaštićene zahteve: Pri izvršavanju narednih zahteva za zaštićene resurse (zahtevaju autentifikaciju), frontend šalje sačuvani token u svakom zahtevu.
- Za sesije, pretraživač automatski šalje odgovarajuće kolačiće sa ID sesije.
- Za tokene, frontend mora eksplicitno dodati token u
Authorizationzaglavlje (na primer,Authorization: Bearer <token>).
- Provera tokena na serveru: Pri primanju svakog zahteva za zaštićeni resurs, server izvlači token iz zahteva i proverava njegovu autentičnost (na primer, validnost tokena, potpis tokena, prisustvo sesije sa takvim ID-jem).
- Autorizacija: Ako je token validan, server određuje korisnika povezanog sa tim tokenom i proverava njegova prava pristupa traženom resursu (ovo je već proces autorizacije, nakon autentifikacije).
- Izvršenje zahteva: Ako je korisnik autentifikovan i autorizovan, server izvršava zahtev i šalje odgovor. U suprotnom, server šalje grešku (na primer,
401 Unauthorizedili403 Forbidden).
Šemati autentifikacije mogu biti različiti (na osnovu sesija, JWT tokena, OAuth2, OpenID Connect itd.), ali osnovni koraci dobijanja i korišćenja tokena za identifikaciju korisnika ostaju slični.
Primer slanja podataka na server (korišćenjem fetch API i tokena):
// Primer podataka korisnika
const userData = {
username: 'user123',
password: 'securepassword'
};
// Slanje podataka na server
fetch('/api/login', { // Endpoint za autentifikaciju na serveru
method: 'POST',
headers: {
'Content-Type': 'application/json'
},
body: JSON.stringify(userData)
})
.then(response => {
if (!response.ok) {
throw new Error('Prijava nije uspela');
}
return response.json(); // Očekujemo da server vrati JSON sa tokenom
})
.then(data => {
const authToken = data.token; // Dobijanje tokena iz odgovora
localStorage.setItem('authToken', authToken); // Čuvanje tokena (na primer, u localStorage)
console.log('Uspešna prijava, token sačuvan.');
// Preusmeravanje korisnika na zaštićenu stranicu
})
.catch(error => {
console.error('Greška pri autentifikaciji:', error);
// Prikazivanje poruke o grešci korisniku
});
// Primer zaštićenog zahteva sa korišćenjem sačuvanog tokena
const token = localStorage.getItem('authToken');
if (token) {
fetch('/api/protected-resource', {
method: 'GET',
headers: {
'Authorization': `Bearer ${token}` // Dodavanje tokena u zaglavlje Authorization
}
})
.then(response => {
if (!response.ok) {
if (response.status === 401) {
console.log('Token je istekao ili je nevažeći. Preusmeravanje na login.');
// Token je nevažeći, ukloniti token i preusmeriti na login
localStorage.removeItem('authToken');
// window.location.href = '/login';
}
throw new Error('Neuspešno učitavanje zaštićenog resursa');
}
return response.json();
})
.then(data => {
console.log('Zaštićeni podaci:', data);
})
.catch(error => {
console.error('Greška pri učitavanju zaštićenog resursa:', error);
});
} else {
console.log('Nema pronađenog auth tokena. Preusmeravanje na login.');
// window.location.href = '/login';
}
Važni sigurnosni aspekti:
- Uvek koristite HTTPS za slanje podataka i tokena, kako biste sprečili presretanje.
- Sigurno čuvajte tokene (izbegavajte čuvanje osetljivih informacija poput lozinki ili tokena za pristup u kodu ili javnim poljima).
- Za JWT tokene: koristite kratak rok trajanja za tokene za pristup i osvežavajte ih pomoću tokena za osvežavanje koji se čuvaju u
HttpOnlykolačićima. Pristupni tokeni mogu biti u memoriji ili localStorage, ali treba uzeti u obzir rizike od XSS. - Validirajte sve podatke na serveru.