Sobes.tech
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:

  1. Datu pieprasījums: Lietotājs ievada pieteikšanās vārdu un paroli vietnes vai lietotnes formā.
  2. 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ā.
  3. 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).
  4. Ž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, HttpOnly sī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.
  5. Ž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-Cookie galveni.
    • Ja tiek izmantots žetons, tas var tikt nosūtīts ar atbildes ķermeni (JSON) vai Authorization galveni (Bearer <žetons>).
  6. 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ā (HttpOnly ar zīmi, lai aizsargātu pret XSS). Drošāk ir izmantot HttpOnly sīkfailus.
  7. 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 Authorization galvenē (Bearer <žetons>).
  8. 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).
  9. 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.
  10. 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 Unauthorized vai 403 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