Kas yra autentifikacija? Prisijungimai, sesijos ir OAuth paaiškinti
Autentifikacija – tai, kaip programa patvirtina, kas yra naudotojas, paprastai patikrindama tai, ką jis žino (slaptažodį), ką turi (kodą, išsiųstą į telefoną ar el. paštą) arba tapatybę iš kitos patikimos paslaugos (pavyzdžiui, „Prisijungti su Google“). Kai naudotojas autentifikuotas, programa jį prisimena naudodama sesiją arba prieigos raktą, kad jam nereikėtų prisijungti kiekviename puslapyje. Nustatyti, ką žinomas naudotojas gali daryti, yra atskiras žingsnis, vadinamas autorizacija.
Kodėl tai svarbu kuriant su DI
Prisijungimo pridėjimas – viena dažniausių užklausų DI kūrėjui ir viena lengviausiai subtiliai suklysti. Prisijungimo puslapį sugeneruoti paprasta. Sunkiausia yra viskas aplink jį:
- Ar slaptažodžiai saugomi saugiai?
- Ar kiekvienas privatus puslapis ir kiekvienas API galinis taškas tikrai patikrina, kas prašo?
- Ar prisijungęs klientas gali pamatyti kito kliento duomenis pakeitęs skaičių URL adrese?
- Kas nutinka, kai kas nors pamiršta slaptažodį?
Programa gali atrodyti visiškai saugi, nors neatitinka nė vieno iš šių punktų. Supratimas, kaip veikia jos dalys, padeda užduoti teisingus klausimus ir patikrinti tinkamus dalykus.
Kasdienis palyginimas
Pagalvokite apie registraciją viešbutyje.
Priimamajame parodai asmens dokumentą. Tai yra autentifikacija: įrodai, kas esi. Recepcijos darbuotojas tau įduoda kortelę su raktu. Ši kortelė yra tavo sesija: visą viešnagės laiką nebereikia rodyti dokumento, tiesiog prisilieti kortele.
Kortele atrakinamas tavo kambarys, sporto salė ir liftas į tavo aukštą – bet ne kitų svečių kambariai ar darbuotojų patalpos. Tai yra autorizacija: prieiga, kurią tavo tapatybė leidžia naudoti. Jei kortelę pametei, viešbutis ją gali deaktyvuoti prie recepcijos (sesijos panaikinimas). Išsiregistravus ji nustoja veikti (atsijungimas arba galiojimo pabaiga).
„Prisijungti su Google“ yra panašu į tai, kai viešbutis priima patikimo partnerio raštą, kuriame sakoma „šis asmuo yra toks“, vietoj to, kad patikrintų tavo dokumentą pats.
Pagrindiniai prisijungimo būdai
| Būdas | Kaip veikia | Privalumai | Trūkumai |
|---|---|---|---|
| El. paštas ir slaptažodis | Naudotojas pasirenka slaptažodį; programa saugo jo maišos kodą | Pažįstama, nėra išorinės priklausomybės | Reikia saugiai saugoti maišos kodus ir tvarkyti slaptažodžio atstatymą |
| Magiška nuoroda / vienkartinis kodas | Programa el. paštu išsiunčia nuorodą ar kodą, kuris prisijungia naudotoją | Nėra slaptažodžių, kuriuos būtų galima nutekinti ar pamiršti | Priklauso nuo el. laiškų pristatymo; prisijungimas lėtesnis |
| Socialinis prisijungimas (OAuth / OpenID Connect) | Naudotojas prisijungia su Google, Apple, GitHub ir pan. | Greita naudotojams; slaptažodžio nesaugote jūs | Sąranka su kiekvienu teikėju; naudotojai be tokių paskyrų |
| Patalpinta autentifikavimo paslauga | Paslauga, pavyzdžiui, Clerk, Auth0 ar Supabase Auth, tvarko registraciją, prisijungimą ir atstatymą | Mažiau saugumo darbo jums | Mėnesio mokestis augant; dar viena priklausomybė |
| Daugiafaktorė autentifikacija (MFA / 2FA) | Antras patikrinimas po pirmojo, pavyzdžiui, kodas iš autentifikatoriaus programos | Gerokai sunkiau įsilaužti | Šiek tiek daugiau trinties |
Kaip turėtų būti saugomi slaptažodžiai
Saugi programa niekada nesaugo tikro tavo slaptažodžio. Vietoj to ji saugo maišos kodą: vienakryptės funkcijos rezultatą, kuris slaptažodį paverčia fiksuota eilute. Kai prisijungi, programa sumaišo tai, ką įvedei, ir palygina rezultatą su saugomu maišos kodu.
Du dalykai daro tai saugų:
- Druska – atsitiktinė reikšmė, pridedama prie kiekvieno slaptažodžio prieš maišant, todėl du žmonės su tuo pačiu slaptažodžiu gauna skirtingus maišos kodus, o iš anksto apskaičiuotos paieškos lentelės tampa nenaudingos.
- Lėtas algoritmas, skirtas slaptažodžiams – pavyzdžiui, Argon2, bcrypt ar scrypt. Bendros paskirties maišos, tokios kaip MD5 ar SHA-256, pačios savaime yra per greitos; užpuolikai gali išbandyti milijardus spėjimų.
Maišymas nėra tas pats kas šifravimas. Užšifruotus duomenis galima iššifruoti raktu; slaptažodžio maišos kodas sukurtas taip, kad jo neįmanoma atvirkščiai atkurti.
Sesijos ir prieigos raktai
Prisijungus programai reikia atpažinti tave kiekvienoje užklausoje. Yra du įprasti būdai.
| Sesija (slapukas) | Prieigos raktas (pvz., JWT) | |
|---|---|---|
| Ką laiko naršyklė | Atsitiktinį sesijos ID slapuke | Pasirašytą raktą su naudotojo informacija ir galiojimo pabaiga |
| Kur laikoma prisijungimo būsena | Serveryje, duomenų bazėje ar saugykloje | Pačiame rakte |
| Atjungti žmogų visur | Lengva: serveryje ištrinti sesiją | Sunkiau: raktas galioja iki pabaigos, nebent palaikote juodąjį sąrašą |
| Tipinis naudojimas | Tradicinės žiniatinklio programos | API, mobiliosios programos, paslaugos, kurios bendrauja tarpusavyje |
Slapukams svarbūs trys nustatymai: HttpOnly (puslapio JavaScript negali nuskaityti slapuko), Secure (siunčiamas tik per HTTPS) ir SameSite (apriboja jo siuntimą užklausoms iš kitų svetainių). Prieigos raktų saugojimas naršyklės localStorage yra įprastas, bet juos atskleidžia bet kuris puslapyje veikiantis scenarijus.
OAuth ir „Prisijungti su Google“
OAuth 2.0 – tai deleguotos autorizacijos standartas: jis leidžia programai gauti ribotą prieigą prie tavo paskyros kitoje paslaugoje, pavyzdžiui, skaityti tavo Google kalendorių, niekada nematant tavo Google slaptažodžio. Tave nukreipia į Google, patvirtini konkrečius leidimus (vadinamus sritimis), o Google programai išduoda raktą tik tiems leidimams.
Pats OAuth buvo sukurtas suteikti prieigą, o ne nurodyti, kas esi. OpenID Connect (OIDC) – tai sluoksnis ant OAuth 2.0, pridedantis tapatybę; būtent jį naudoja „Prisijungti su Google“ ar „Prisijungti su Apple“. Norint jį nustatyti, programą užregistruojate pas teikėją ir gaunate kliento ID bei kliento paslaptį; paslaptis lieka jūsų serveryje.
Darbo pavyzdys: prisijungimas prie klientų portalo
Tarkime, kuriate portalą, kuriame dizaino agentūros klientai mato savo projektus ir sąskaitas.
- Autentifikacija: klientai prisijungia su el. paštu ir magine nuoroda, todėl nereikia tvarkyti slaptažodžių. Agentūros darbuotojai prisijungia su Google Workspace paskyromis.
- Vaidmenys: kiekvienas naudotojas turi vaidmenį –
clientarbastaff. - Autorizacijos taisyklės:
| Veiksmas | Klientas | Darbuotojas |
|---|---|---|
| Matyti savo įmonės projektus | Taip | Taip |
| Matyti kitų įmonių projektus | Ne | Taip |
| Įkelti failą į projektą | Tik savo projektus | Taip |
| Pažymėti sąskaitą apmokėta | Ne | Taip |
- Kur tai taikoma: serveryje, kiekvienai užklausai. Serveris suranda prisijungusį naudotoją ir grąžina tik tuos projektus, kurių
project.company_idsutampa su naudotojo įmone. Vien paslėpti mygtuką „Pažymėti apmokėta“ nepakanka – galinis taškas pats turi atmesti užklausą.
Dažniausių terminų paaiškinimai
| Terminas | Reikšmė |
|---|---|
| Autentifikacija (AuthN) | Patvirtinti, kas yra asmuo. |
| Autorizacija (AuthZ) | Nustatyti, ką jis gali daryti. |
| Sesija | Programa prisimena, kad esi prisijungęs, tarp užklausų. |
| Slapukas | Nedidelis duomenų fragmentas, kurį naršyklė kiekvienos užklausos metu siunčia atgal svetainei. |
| JWT | JSON Web Token: pasirašytas, kompaktiškas raktas, kuriame yra tokia informacija kaip naudotojo ID ir galiojimo pabaiga. |
| Vaidmuo / leidimas | Etiketės, pavyzdžiui, admin ar member, kurios nusprendžia prieigą. |
| MFA / 2FA | Reikalavimas antro įrodymo, pavyzdžiui, kodo iš autentifikatoriaus programos. |
| SSO | Vienkartinis prisijungimas: vienas prisijungimas (dažnai įmonės paskyra) daugeliui programų. |
| 401 ir 403 | „Kas tu?“ (neautentifikuotas) ir „Tu to negali daryti“ (neautorizuotas). |
Dažnos klaidos ir klaidingi įsitikinimai
- Leidimų tikrinimas tik puslapyje. Jei naršyklė paslepia mygtuką, bet API netikrina, bet kas gali kviesti API tiesiogiai.
- Pasitikėjimas ID iš URL.
/invoices/1042turi patikrinti, ar sąskaita 1042 priklauso prisijungusiam naudotojui. - Savo kriptografijos kūrimas. Naudokite žinomas bibliotekas ar teikėjus; neleiskite DI išrasti maišymo schemos.
- Silpnas slaptažodžio atstatymas. Atstatymo nuorodos turi būti vienkartinės, greitai pasibaigiančios ir neatskleisti, ar el. paštas turi paskyrą.
- Prisijungimo ir kūrimo įrankio paskyros painiojimas. Tavo programos naudotojai yra atskiri nuo tavo paskyros įrankyje, kuriuo kuri programą.
- Prisijungimo bandymų neriboti. Be ribojimo užpuolikai gali be galo bandyti slaptažodžius.
Ko paprašyti iš DI kūrėjo
- „Pridėk registraciją ir prisijungimą naudodamas [žinomą biblioteką ar teikėją]. Nerašyk pasirinktinio slaptažodžių maišymo.“
- „Saugok slaptažodžius, užmaišytus bcrypt ar Argon2.“
- „Sesijai naudok HttpOnly ir Secure slapukus.“
- „Pridėk vaidmenis: admin ir member. Išvardyk kiekvieną galinį tašką ir kurie vaidmenys gali jį kviesti.“
- „Serveryje užtikrink, kad naudotojai gali skaityti ir redaguoti tik savo įrašus. Tada parodyk, kaip tai patikrinai.“
- „Pridėk slaptažodžio atstatymą su vienkartinėmis nuorodomis, kurios pasibaigia per valandą.“
- „Riboti prisijungimo bandymų dažnį.“
Tada patikrink pats: sukurk dvi paskyras ir pabandyk pasiekti vienos naudotojo duomenis būdamas prisijungęs kaip kitas. Vadovas, kaip pridėti prisijungimą ir saugumo kontrolinis sąrašas padeda eiti toliau.
Autentifikacija Mythex
Mythex neteikia įmontuoto autentifikavimo produkto tavo programos naudotojams; pats pasirenki būdą – el. paštą ir slaptažodį, saugomus projekto duomenų bazėje, arba patalpintos paslaugos SDK – ir paprašai agento jį pridėti. Teikėjų raktai dedami į projekto paslaptis, o ne į pokalbį. Tai atskiras dalykas nuo to, kaip prisijungi prie pačio Mythex. Dokumentacijos receptas prisijungimo pridėjimas prie tavo programos turi pradinę užklausą, kurią gali pritaikyti, o kas yra API paaiškina, kur gyvena tie serverio pusės patikrinimai.
Klausimai
Koks skirtumas tarp autentifikacijos ir autorizacijos?
Autentifikacija patikrina, kas esi, pavyzdžiui, patikrindama slaptažodį. Autorizacija nusprendžia, ką tau leidžiama daryti, kai tavo tapatybė žinoma, pavyzdžiui, ar gali matyti administratoriaus puslapį ar redaguoti kito žmogaus rezervaciją. Programoms reikia abiejų.
Kas yra OAuth?
OAuth 2.0 – tai standartas, leidžiantis programai gauti ribotą prieigą prie tavo paskyros kitoje paslaugoje, nematant tavo slaptažodžio. Funkcija „Prisijungti su Google“ naudoja OpenID Connect – tapatybės sluoksnį, sukurtą ant OAuth 2.0, todėl programa iš Google sužino, kas tu esi.
Ar mano programa turėtų saugoti slaptažodžius?
Niekada įskaitoma forma. Jei naudojate prisijungimą su el. pašto adresu ir slaptažodžiu, slaptažodžiai turi būti saugomi kaip užsūdyti maišos kodai, sukurti lėtu algoritmu, skirtu slaptažodžiams, pavyzdžiui, Argon2 arba bcrypt. Daugelis programų šios problemos išvengia naudodamos patalpintą autentifikavimo paslaugą, socialinį prisijungimą ar el. pašto magines nuorodas.
Sesijos ar prieigos raktai – ką turėtų naudoti mano programa?
Tinka abu. Sesija saugo prisijungimo būseną serveryje ir naršyklei slapukuose pateikia atsitiktinį ID, kurį lengva panaikinti. Prieigos raktas, pavyzdžiui, JWT, pats talpina pasirašytą informaciją, todėl tinka API ir mobiliesiems klientams, bet jį sunkiau atšaukti prieš pasibaigiant galiojimui. Tipinei žiniatinklio programai slapukais grindžiamos sesijos yra patikimas numatytasis pasirinkimas.