Junior
როგორ მიმდინარეობს ავტორიზაციის პროცესი?
sobes.tech AI
პასუხი AI-სგან
მომხმარებლის ავტორიზაციის პროცესი ფრონტენდ-აპლიკაციაში ზოგადად შედგება შემდეგი ნაბიჯებისგან:
- მომხმარებლის მონაცემების მოთხოვნა: მომხმარებელი вводит ლოგინსა და პაროლს საიტის ან აპლიკაციის ფორმაში.
- მომხმარებლის მონაცემების გაგზავნა სერვერზე: ფრონტენდმა ამ მონაცემები გაგზავნა სერვერზე (ბექენდზე) HTTP მოთხოვნით (საშუალოდ
POST) ავტორიზაციის სპეციალურ წერტილზე. მონაცემები შეიძლება იყოს JSON ან FormData ფორმატში. - მომხმარებლის მონაცემების სერვერზე შემოწმება: ბექენდმა იღებს მონაცემებს, ამოწმებს მათ თავის მონაცემთა ბაზაში (მაგალითად, შეესაბამება თუ არა ლოგინი არსებულ მომხმარებელს და შეესაბამება თუ არა შეყვანილი პაროლის ჰეში ბაზის ჰეშს).
- ტოკენის/სესიის შექმნა: თუ მონაცემები სწორია, სერვერი ქმნის უნიკალურ ავტორიზაციის მარკერს. ეს შეიძლება იყოს:
- სესიის ID: სერვერი ქმნის სესიას და უკავშირებს მას მომხმარებელს, აგზავნის კლიენტს სესიის იდენტიფიკატორს (მაგალითად,
HttpOnlyქუქით). - ტოკენი (მაგალითად, JWT): სერვერი ქმნის ტოკენს, რომელიც შეიცავს ინფორმაციას მომხმარებლის და მისი უფლებების შესახებ, ხელს აწერს მას თავისი საიდუმლო გასაღებით. ამ ტოკენს აგზავნის კლიენტს.
- სესიის ID: სერვერი ქმნის სესიას და უკავშირებს მას მომხმარებელს, აგზავნის კლიენტს სესიის იდენტიფიკატორს (მაგალითად,
- ტოკენის/სესიის გაგზავნა კლიენტზე: სერვერი პასუხობს ფრონტენდს, გაგზავნით შექმნილ მარკერს:
- თუ გამოიყენება სესიის ID, ის ჩვეულებრივ გადაეცემა
Set-CookieHTTP-თითით. - თუ გამოიყენება ტოკენი, ის შეიძლება იყოს პასუხის სხეულში (JSON) ან
Authorizationსათაურით (Bearer <ტოკენი>).
- თუ გამოიყენება სესიის ID, ის ჩვეულებრივ გადაეცემა
- მარკერის შენახვა კლიენტზე: ფრონტენდმა იღებს მარკერს და ინახავს მას შემდეგი მოთხოვნებისთვის:
- სესიის ID ინახება ბრაუზერის კუკში (ავტომატურად)
- ტოკენი შეიძლება იყოს შენახული localStorage, sessionStorage ან კუკში (
HttpOnlyნიშნით — XSS-ისგან დაცვისთვის). უმჯობესიაHttpOnlyკუკში შენახვა.
- მარკერის გამოყენება დაცულ მოთხოვნებში: როდესაც ხორციელდება შემდეგი მოთხოვნები დაცულ რესურსებზე, ფრონტენდმა აგზავნის შენახულ მარკერს ყოველ მოთხოვნაზე:
- ბრაუზერი ავტომატურად აგზავნის შესაბამის კუკებს სესიის ID-სთვის.
- ტოკენების შემთხვევაში, ფრონტენდმა უნდა დაამატოს ტოკენი
Authorizationსათაურში (Bearer <ტოკენი>).
- მარკერის სერვერზე შემოწმება: თითოეულ მოთხოვნაზე, სერვერი იღებს მარკერს და ამოწმებს მის ნამდვილობას (მაგალითად, ვადაგასული ტოკენი, ხელმოწერა, სესიის არსებობა).
- ავტორიზაცია: თუ მარკერი ვალიდურია, სერვერი იპოვის ამ მარკერთან დაკავშირებულ მომხმარებელს და შემოწმებს მის უფლებებს მოთხოვნაზე.
- მოთხოვნის შესრულება: თუ მომხმარებელი ავტორიზებულია და აქვს უფლება, სერვერი ასრულებს მოთხოვნას და პასუხს აგზავნის. წინააღმდეგ შემთხვევაში, სერვერი აგზავნის შეცდომას (
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
- უსაფრთხოდ ინახეთ მარკერები
- გამოიყენეთ მოკლევადიანი ტოკენები
- სერვერზე დაარეგულირეთ მონაცემები