Junior
Kā notiek autentifikācijas process?
sobes.tech AI
Atbilde no AI
Lietotāja autentifikācijas process frontend lietotnē kopumā sastāv no šādiem soļiem:
- Datu pieprasījums: Lietotājs ievada pieteikšanās vārdu un paroli vietnes vai lietotnes formā.
- Datu nosūtīšana uz serveri: Frontend nosūta šos datus uz serveri (backend) ar HTTP pieprasījumu (parasti
POST) uz īpašu autentifikācijas galapunktu. Dati var tikt nosūtīti JSON vai FormData formātā. - Datu pārbaude serverī: Backend saņem datus, pārbauda to esamību savā datu bāzē (piemēram, vai pieteikšanās vārds atbilst esošajam lietotājam un vai ievadītā paroles hash sakrīt ar datu bāzes hash).
- Žetona/sesijas ģenerēšana: Ja dati ir pareizi, serveris ģenerē unikālu autentifikācijas marķieri. Tas var būt:
- Sesijas ID: serveris izveido sesiju un sasaista to ar lietotāju, nosūta klientam sesijas identifikatoru (piemēram,
HttpOnlysīkfailā). - Žetons (piemēram, JWT): serveris ģenerē žetonu, kas satur informāciju par lietotāju un viņa tiesībām, to parakstot ar savu slepeno atslēgu. Šis žetons tiek nosūtīts klientam.
- Sesijas ID: serveris izveido sesiju un sasaista to ar lietotāju, nosūta klientam sesijas identifikatoru (piemēram,
- Žetona/sesijas nosūtīšana klientam: Serveris atbild ar ģenerēto autentifikācijas marķieri:
- Ja tiek izmantots sesijas ID, tas parasti tiek nosūtīts ar
Set-Cookiegalveni. - Ja tiek izmantots žetons, tas var tikt nosūtīts ar atbildes ķermeni (JSON) vai
Authorizationgalveni (Bearer <žetons>).
- Ja tiek izmantots sesijas ID, tas parasti tiek nosūtīts ar
- Marķiera saglabāšana klienta pusē: Frontend saņem marķieri un saglabā to turpmākām pieprasījumiem:
- Sesijas ID tiek saglabāts pārlūkprogrammas sīkfailā (automātiski)
- Žetons var tikt saglabāts localStorage, sessionStorage vai sīkfailā (
HttpOnlyar zīmi, lai aizsargātu pret XSS). Drošāk ir izmantotHttpOnlysīkfailus.
- Marķiera izmantošana aizsargātajos pieprasījumos: Veicot turpmākos pieprasījumus aizsargātiem resursiem, frontend nosūta saglabāto marķieri katrā pieprasījumā:
- Pārlūkprogramma automātiski nosūta atbilstošos sīkfailus ar sesijas ID.
- Žetonu gadījumā frontend tam jāpievieno žetons
Authorizationgalvenē (Bearer <žetons>).
- Marķiera pārbaude serverī: Katram pieprasījumam serveris izvelk marķieri un pārbauda tā autentiskumu (piemēram, derīguma termiņu, parakstu, sesijas esamību).
- Autorizācija: Ja marķieris ir derīgs, serveris nosaka ar šo marķieri saistīto lietotāju un pārbauda viņa piekļuves tiesības pieprasītajam resursam.
- Pieprasījuma izpilde: Ja lietotājs ir autentificēts un tam ir tiesības, serveris izpilda pieprasījumu un nosūta atbildi. Pretējā gadījumā — kļūdas ziņojumu (
401 Unauthorizedvai403 Forbidden).
Autentifikācijas shēmas ir dažādas (sesijas, JWT, OAuth2, OpenID Connect u.c.), bet galvenie soļi paliek līdzīgi.
Piemērs datu nosūtīšanai uz serveri (izmantojot fetch API un žetonu):
// Lietotāja dati
const userData = {
username: 'user123',
password: 'securepassword'
};
// Datu nosūtīšana uz serveri
fetch('/api/login', { // Autentifikācijas galapunkts
method: 'POST',
headers: {
'Content-Type': 'application/json'
},
body: JSON.stringify(userData)
})
.then(response => {
if (!response.ok) {
throw new Error('Login failed');
}
return response.json(); // Sagaidām, ka serveris atgriezīs JSON ar žetonu
})
.then(data => {
const authToken = data.token; // Žetona saņemšana no atbildes
localStorage.setItem('authToken', authToken); // Saglabāšana
console.log('Login successful, token saved.');
// Lietotāja novirzīšana uz aizsargātu lapu
})
.catch(error => {
console.error('Authentication error:', error);
// Kļūdas ziņojuma rādīšana lietotājam
});
// Aizsargāts pieprasījums ar žetonu
const token = localStorage.getItem('authToken');
if (token) {
fetch('/api/protected-resource', {
method: 'GET',
headers: {
'Authorization': `Bearer ${token}` // Žetona pievienošana Authorization galvenē
}
})
.then(response => {
if (!response.ok) {
if (response.status === 401) {
console.log('Token expired or invalid. Redirecting to login.');
localStorage.removeItem('authToken');
// window.location.href = '/login';
}
throw new Error('Failed to fetch protected resource');
}
return response.json();
})
.then(data => {
console.log('Protected data:', data);
})
.catch(error => {
console.error('Error fetching protected resource:', error);
});
} else {
console.log('No auth token found. Redirecting to login.');
// window.location.href = '/login';
}
Svarīgi drošības aspekti:
- Vienmēr lietojiet HTTPS
- Saglabājiet žetonus droši
- Izmantojiet īslaicīgus žetonus
- Serverī veiciet datu validāciju