Sobes.tech
Junior

როგორ მიმდინარეობს ავტორიზაციის პროცესი?

sobes.tech AI

პასუხი AI-სგან

მომხმარებლის ავტორიზაციის პროცესი ფრონტენდ-აპლიკაციაში ზოგადად შედგება შემდეგი ნაბიჯებისგან:

  1. მომხმარებლის მონაცემების მოთხოვნა: მომხმარებელი вводит ლოგინსა და პაროლს საიტის ან აპლიკაციის ფორმაში.
  2. მომხმარებლის მონაცემების გაგზავნა სერვერზე: ფრონტენდმა ამ მონაცემები გაგზავნა სერვერზე (ბექენდზე) HTTP მოთხოვნით (საშუალოდ POST) ავტორიზაციის სპეციალურ წერტილზე. მონაცემები შეიძლება იყოს JSON ან FormData ფორმატში.
  3. მომხმარებლის მონაცემების სერვერზე შემოწმება: ბექენდმა იღებს მონაცემებს, ამოწმებს მათ თავის მონაცემთა ბაზაში (მაგალითად, შეესაბამება თუ არა ლოგინი არსებულ მომხმარებელს და შეესაბამება თუ არა შეყვანილი პაროლის ჰეში ბაზის ჰეშს).
  4. ტოკენის/სესიის შექმნა: თუ მონაცემები სწორია, სერვერი ქმნის უნიკალურ ავტორიზაციის მარკერს. ეს შეიძლება იყოს:
    • სესიის ID: სერვერი ქმნის სესიას და უკავშირებს მას მომხმარებელს, აგზავნის კლიენტს სესიის იდენტიფიკატორს (მაგალითად, HttpOnly ქუქით).
    • ტოკენი (მაგალითად, JWT): სერვერი ქმნის ტოკენს, რომელიც შეიცავს ინფორმაციას მომხმარებლის და მისი უფლებების შესახებ, ხელს აწერს მას თავისი საიდუმლო გასაღებით. ამ ტოკენს აგზავნის კლიენტს.
  5. ტოკენის/სესიის გაგზავნა კლიენტზე: სერვერი პასუხობს ფრონტენდს, გაგზავნით შექმნილ მარკერს:
    • თუ გამოიყენება სესიის ID, ის ჩვეულებრივ გადაეცემა Set-Cookie HTTP-თითით.
    • თუ გამოიყენება ტოკენი, ის შეიძლება იყოს პასუხის სხეულში (JSON) ან Authorization სათაურით (Bearer <ტოკენი>).
  6. მარკერის შენახვა კლიენტზე: ფრონტენდმა იღებს მარკერს და ინახავს მას შემდეგი მოთხოვნებისთვის:
    • სესიის ID ინახება ბრაუზერის კუკში (ავტომატურად)
    • ტოკენი შეიძლება იყოს შენახული localStorage, sessionStorage ან კუკში (HttpOnly ნიშნით — XSS-ისგან დაცვისთვის). უმჯობესია HttpOnly კუკში შენახვა.
  7. მარკერის გამოყენება დაცულ მოთხოვნებში: როდესაც ხორციელდება შემდეგი მოთხოვნები დაცულ რესურსებზე, ფრონტენდმა აგზავნის შენახულ მარკერს ყოველ მოთხოვნაზე:
    • ბრაუზერი ავტომატურად აგზავნის შესაბამის კუკებს სესიის ID-სთვის.
    • ტოკენების შემთხვევაში, ფრონტენდმა უნდა დაამატოს ტოკენი Authorization სათაურში (Bearer <ტოკენი>).
  8. მარკერის სერვერზე შემოწმება: თითოეულ მოთხოვნაზე, სერვერი იღებს მარკერს და ამოწმებს მის ნამდვილობას (მაგალითად, ვადაგასული ტოკენი, ხელმოწერა, სესიის არსებობა).
  9. ავტორიზაცია: თუ მარკერი ვალიდურია, სერვერი იპოვის ამ მარკერთან დაკავშირებულ მომხმარებელს და შემოწმებს მის უფლებებს მოთხოვნაზე.
  10. მოთხოვნის შესრულება: თუ მომხმარებელი ავტორიზებულია და აქვს უფლება, სერვერი ასრულებს მოთხოვნას და პასუხს აგზავნის. წინააღმდეგ შემთხვევაში, სერვერი აგზავნის შეცდომას (401 Unauthorized ან 403 Forbidden).

ავტორიზაციის სქემები სხვადასხვაა (სესია, JWT, OAuth2, OpenID Connect და ა.შ.), მაგრამ ძირითადი ნაბიჯები იგივე რჩება.

მაგალითი — fetch API და ტოკენის გამოყენებით მონაცემების სერვერზე გაგზავნა:

// მომხმარებლის მონაცემები
const userData = {
  username: 'user123',
  password: 'securepassword'
};

// მონაცემების გაგზავნა სერვერზე
fetch('/api/login', { // ავტორიზაციის ბოლო წერტილი
  method: 'POST',
  headers: {
    'Content-Type': 'application/json'
  },
  body: JSON.stringify(userData)
})
.then(response => {
  if (!response.ok) {
    throw new Error('Login failed');
  }
  return response.json(); // ველით სერვერი დაბრუნდეს JSON ტოკენთან
})
.then(data => {
  const authToken = data.token; // ტოკენის მიღება პასუხიდან
  localStorage.setItem('authToken', authToken); // შენახვა
  console.log('Login successful, token saved.');
  // მომხმარებლის გადამისამართება დაცულ გვერდზე
})
.catch(error => {
  console.error('Authentication error:', error);
  // შეცდომის შეტყობინების ჩვენება
});

// დაცული მოთხოვნა ტოკენით
const token = localStorage.getItem('authToken');
if (token) {
  fetch('/api/protected-resource', {
    method: 'GET',
    headers: {
      'Authorization': `Bearer ${token}` // ტოკენის დამატება Authorization სათაურში
    }
  })
  .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';
}

საფრთხის მნიშვნელოვანი ასპექტები:

  • გამოიყენეთ მხოლოდ HTTPS
  • უსაფრთხოდ ინახეთ მარკერები
  • გამოიყენეთ მოკლევადიანი ტოკენები
  • სერვერზე დაარეგულირეთ მონაცემები