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հղումում:
- Նշանի ստուգում սերվերում: Յուրաքանչյուր պաշտպանված ռեսուրսի հարցման ժամանակ, սերվերը ստանում է նշանը և ստուգում նրա օրինականությունը (օրինակ, ժամկետի ավարտ, ստորագրություն, սեսիայի առկայություն):
- Անվտանգություն: Եթե նշանը վավեր է, սերվերը որոշում է օգտվողին և ստուգում նրա իրավունքները:
- Հարցի կատարմամբ: Եթե օգտվողը նույնականացված և իրավունք ունի, սերվերը կատարում է հարցումը և ուղարկում պատասխան, հակառակ դեպքում՝ սխալ հաղորդագրություն:
Նույնականացման սխեմաները տարբեր են (սեսիաներ, 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
- Պահել նշանները անվտանգ
- Օգտագործել կարճաժամկետ թոքեններ
- Վալիդացնել տվյալները սերվերում