ΠΡΡΠ΅Π½ΡΠΈΡΠΈΠΊΠ°ΡΠΈΡ Π½Π° ΠΎΡΠ½ΠΎΠ²Π΅ ΡΠΎΠΊΠ΅Π½ΠΎΠ²
ΠΡΠΎΡ ΡΠΏΠΎΡΠΎΠ± Π±ΡΠ» Π²Π²Π΅Π΄Π΅Π½ Π΄Π»Ρ ΡΡΡΡΠ°Π½Π΅Π½ΠΈΡ ΠΎΡΠ½ΠΎΠ²Π°Π½Π½ΠΎΠ³ΠΎ Π½Π° ΠΊΡΠΊΠ°Ρ Π°ΡΡΠ΅Π½ΡΠΈΡΠΈΠΊΠ°ΡΠΈΠΈ. ΠΡΠΎΠ±Π΅Π½Π½ΠΎΡΡΠΈ ΠΏΠΎΠ΄Ρ ΠΎΠ΄Π° β ΡΡΠ΅Π±ΡΠ΅ΡΡΡ ΡΡΡΠ½Π°Ρ ΡΠ΅Π°Π»ΠΈΠ·Π°ΡΠΈΡ ΠΈ ΡΠΎΠΊΠ΅Π½Ρ ΡΠΎΡ ΡΠ°Π½ΡΡΡΡΡ Π½Π° ΡΡΠΎΡΠΎΠ½Π΅ ΠΊΠ»ΠΈΠ΅Π½ΡΠ°.
ΠΠΎΠ³Π΄Π° Π²Ρ Π²Ρ
ΠΎΠ΄ΠΈΡΠ΅ Π²
Π²Π΅Π±-ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅, ΡΠ΅ΡΠ²Π΅Ρ ΠΏΡΠΎΠ²Π΅ΡΡΠ΅Ρ ΡΡΠ΅ΡΠ½ΡΠ΅ Π΄Π°Π½Π½ΡΠ΅ ΠΈ ΠΎΡΠΏΡΠ°Π²Π»ΡΠ΅Ρ Π·Π°ΡΠΈΡΡΠΎΠ²Π°Π½Π½ΡΠΉ
ΡΠΎΠΊΠ΅Π½ Π² Π±ΡΠ°ΡΠ·Π΅Ρ. ΠΡΠ°ΡΠ·Π΅Ρ ΡΠΎΡ
ΡΠ°Π½ΡΠ΅Ρ ΡΠΎΠΊΠ΅Π½ ΠΈ Π΄ΠΎΠ±Π°Π²Π»ΡΠ΅Ρ Π΅Π³ΠΎ Π² Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΎΠΊ Π°Π²ΡΠΎΡΠΈΠ·Π°ΡΠΈΠΈ
Π±ΡΠ΄ΡΡΠΈΡ
Π·Π°ΠΏΡΠΎΡΠΎΠ².
Π‘ΡΠ°Π½Π΄Π°ΡΡΠ½ΡΠ΅ ΡΠ΅Π°Π»ΠΈΠ·Π°ΡΠΈΠΈ
ΡΠΎΠΊΠ΅Π½-ΠΏΠΎΠ΄Ρ
ΠΎΠ΄Π° Π² ΡΠ°Π·Ρ ΡΠ»ΠΎΠΆΠ½Π΅Π΅ ΠΎΠΏΠΈΡΠ°Π½Π½ΡΡ
Π²ΡΡΠ΅. ΠΠ°ΠΏΡΠΈΠΌΠ΅Ρ, Π²
OpenID Connect ΠΏΡΠΈΠΌΠ΅Π½ΡΠ΅ΡΡΡ Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΎ ΠΏΠΎΡΠΎΠΊΠΎΠ² Π°ΡΡΠ΅Π½ΡΠΈΡΠΈΠΊΠ°ΡΠΈΠΈ Π΄Π»Ρ ΡΠ°Π·Π»ΠΈΡΠ½ΡΡ
ΡΡΠ΅Π½Π°ΡΠΈΠ΅Π² ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΡ. Π§ΡΠΎΠ±Ρ Π»ΡΡΡΠ΅ ΠΏΠΎΠ½ΡΡΡ, ΠΊΠ°ΠΊ ΡΠ°Π±ΠΎΡΠ°ΡΡ ΡΠΎΠΊΠ΅Π½Ρ, ΡΠ°Π·ΠΎΠ±ΡΠ΅ΠΌ ΠΏΡΠΎΡΠ΅ΡΡ Π½Π° ΡΠ΅ΡΡΡΠ΅ ΡΠ°ΡΡΠΈ ΠΈ Π² ΠΊΠ°ΡΠ΅ΡΡΠ²Π΅ ΠΏΡΠΈΠΌΠ΅ΡΠ° ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΠΌ JWT (JSON Web Token) β Π½Π°ΠΈΠ±ΠΎΠ»Π΅Π΅ ΡΠΈΡΠΎΠΊΠΎ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΠΌΡΠΉ ΡΡΠ°Π½Π΄Π°ΡΡ.
Π‘Π΅ΡΠ²Π΅Ρ ΠΏΡΠΎΠ²Π΅ΡΡΠ΅Ρ ΡΡΠ΅ΡΠ½ΡΠ΅ Π΄Π°Π½Π½ΡΠ΅, Π³Π΅Π½Π΅ΡΠΈΡΡΠ΅Ρ ΡΠΎΠΊΠ΅Π½, ΠΏΠΎΠ΄ΠΏΠΈΡΡΠ²Π°Π΅Ρ Π΅Π³ΠΎ ΡΠ΅ΠΊΡΠ΅ΡΠ½ΡΠΌ ΠΊΠ»ΡΡΠΎΠΌ ΠΈ ΠΎΡΠΏΡΠ°Π²Π»ΡΠ΅Ρ Π² Π±ΡΠ°ΡΠ·Π΅Ρ
ΠΡΠΈ ΠΏΠ΅ΡΠ΅Π΄Π°ΡΠ΅ ΠΎΠ±ΡΡΠ½ΠΎ Π½Π΅ΠΎΠ±Ρ
ΠΎΠ΄ΠΈΠΌΠΎ
ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ ΡΠΈΡΡΠΎΠ²Π°Π½ΠΈΠ΅ (Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ, SSL) Π΄Π»Ρ Π·Π°ΡΠΈΡΡ ΠΊΠ°Π½Π°Π»Π°.
ΠΠ° ΡΡΠΎΡΠΎΠ½Π΅ ΡΠ΅ΡΠ²Π΅ΡΠ° ΠΌΠΎΠΆΠ½ΠΎ
ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΡ NPM (ΡΠ°ΠΊΡΡ ΠΊΠ°ΠΊ jsonwebtoken) Π΄Π»Ρ
ΡΠΎΠ·Π΄Π°Π½ΠΈΡ ΡΠΎΠΊΠ΅Π½ΠΎΠ²:
Π‘Π΅ΡΠ²Π΅Ρ ΠΎΡΠΏΡΠ°Π²Π»ΡΠ΅Ρ ΡΠ°ΠΉΠ» cookie Π±ΡΠ°ΡΠ·Π΅ΡΡ, Π²ΠΊΠ»ΡΡΠ°Ρ Π΅Π³ΠΎ Π² Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΎΠΊ Set-Cookie
Π Π΄ΠΎΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ ΠΊ ΡΡΠΎΠΌΡ Π²
cookie ΠΌΠΎΠ³ΡΡ Ρ
ΡΠ°Π½ΠΈΡΡΡΡ ΡΠ°ΠΊΠΈΠ΅ ΡΠ²Π΅Π΄Π΅Π½ΠΈΡ, ΠΊΠ°ΠΊ Π΄Π°ΡΠ° ΠΈΡΡΠ΅ΡΠ΅Π½ΠΈΡ ΡΡΠΎΠΊΠ° Π΄Π΅ΠΉΡΡΠ²ΠΈΡ, Π΄ΠΎΠΌΠ΅Π½
ΠΈ Π²ΠΎΠ·ΡΠ°ΡΡ. ΠΡΠΈΠΌΠ΅Ρ ΠΎΡΠ²Π΅ΡΠ° Ρ Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΈΠΌΠΈ Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΊΠ°ΠΌΠΈ cookie Π±ΡΠ΄Π΅Ρ Π²ΡΠ³Π»ΡΠ΄Π΅ΡΡ
ΡΠ»Π΅Π΄ΡΡΡΠΈΠΌ ΠΎΠ±ΡΠ°Π·ΠΎΠΌ:
Π‘ΠΎΡ ΡΠ°Π½Π΅Π½ΠΈΠ΅ ΡΠΎΠΊΠ΅Π½Π° Π² Ρ ΡΠ°Π½ΠΈΠ»ΠΈΡΠ΅ Π±ΡΠ°ΡΠ·Π΅ΡΠ° ΠΈ Π΄ΠΎΠ±Π°Π²Π»Π΅Π½ΠΈΠ΅ Π² Π·Π°ΠΏΡΠΎΡΡ Ρ ΠΏΠΎΠΌΠΎΡΡΡ JavaScript
ΠΡΠ°ΡΠ·Π΅Ρ ΠΌΠΎΠΆΠ΅Ρ Ρ
ΡΠ°Π½ΠΈΡΡ
ΡΡΠΎΡ ΠΌΠ°ΡΠΊΠ΅Ρ Π² Π»ΠΎΠΊΠ°Π»ΡΠ½ΠΎΠΌ Ρ
ΡΠ°Π½ΠΈΠ»ΠΈΡΠ΅, Ρ
ΡΠ°Π½ΠΈΠ»ΠΈΡΠ΅ ΡΠ΅Π°Π½ΡΠΎΠ² ΠΈΠ»ΠΈ Π² Ρ
ΡΠ°Π½ΠΈΠ»ΠΈΡΠ΅ cookies.
ΠΠ°ΡΠ΅ΠΌ ΠΎΠ½ Π±ΡΠ΄Π΅Ρ Π΄ΠΎΠ±Π°Π²Π»Π΅Π½ Π² Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΎΠΊ Π°Π²ΡΠΎΡΠΈΠ·Π°ΡΠΈΠΈ ΠΈ ΠΎΡΠΏΡΠ°Π²Π»Π΅Π½ Π½Π° ΡΡΠΎΡΠΎΠ½Ρ ΡΠ΅ΡΠ²Π΅ΡΠ°
Π΄Π»Ρ Π²Π°Π»ΠΈΠ΄Π°ΡΠΈΠΈ Π·Π°ΠΏΡΠΎΡΠΎΠ².
ΠΠΎΠ±Π°Π²Π»Π΅Π½ΠΈΠ΅ ΡΠΎΠΊΠ΅Π½Π° Π² Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΎΠΊ Π΄ΠΎΠ»ΠΆΠ½ΠΎ Π±ΡΡΡ ΡΠ΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Π½ΠΎ Ρ ΠΏΠΎΠΌΠΎΡΡΡ JavaScript.
ΠΡΠΎΠΌΠ΅ ΡΠΎΠ³ΠΎ, ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ
ΡΡΠ½ΠΊΡΠΈΡ jwt.decode() ΠΈΠ· Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠΈ jsonwebtoken Π΄Π»Ρ Π΄Π΅ΠΊΠΎΠ΄ΠΈΡΠΎΠ²Π°Π½ΠΈΡ ΡΠΎΠΊΠ΅Π½Π°.
ΠΡΠ°ΡΠ·Π΅Ρ ΡΠΎΡ ΡΠ°Π½ΡΠ΅Ρ cookie Π² Ρ ΡΠ°Π½ΠΈΠ»ΠΈΡΠ΅ ΠΈ ΠΎΡΠΏΡΠ°Π²Π»ΡΠ΅Ρ Π΅Π³ΠΎ Ρ ΠΏΠΎΡΠ»Π΅Π΄ΡΡΡΠΈΠΌΠΈ Π·Π°ΠΏΡΠΎΡΠ°ΠΌΠΈ
ΠΠΎΠ³Π΄Π° ΡΠ΅ΡΠ²Π΅Ρ ΠΏΠΎΠ»ΡΡΠ°Π΅Ρ Π·Π°ΠΏΡΠΎΡ Ρ cookie, ΠΎΠ½ ΡΡΠ°Π²Π½ΠΈΠ²Π°Π΅Ρ ΠΈΠ΄Π΅Π½ΡΠΈΡΠΈΠΊΠ°ΡΠΎΡ ΡΠ΅Π°Π½ΡΠ° Π² ΡΠ°ΠΉΠ»Π΅ cookie Ρ ΡΠ΅Π°Π½ΡΠΎΠΌ Π² Π±Π°Π·Π΅ Π΄Π°Π½Π½ΡΡ Π΄Π»Ρ Π²Π°Π»ΠΈΠ΄Π°ΡΠΈΠΈ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Ρ.
ΠΠ°ΠΉΡΠΈ Π²ΡΠ΅ ΡΠΎΡ
ΡΠ°Π½Π΅Π½Π½ΡΠ΅ Π² Π±ΡΠ°ΡΠ·Π΅ΡΠ΅ ΡΠ°ΠΉΠ»Ρ cookie ΠΌΠΎΠΆΠ½ΠΎ Π² Ρ
ΡΠ°Π½ΠΈΠ»ΠΈΡΠ΅ ΡΠ°ΠΉΠ»ΠΎΠ² cookie Π² ΡΠ°Π·Π΄Π΅Π»Π΅
ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ Ρ ΠΏΠΎΠΌΠΎΡΡΡ ΠΈΠ½ΡΡΡΡΠΌΠ΅Π½ΡΠΎΠ² ΡΠ°Π·ΡΠ°Π±ΠΎΡΡΠΈΠΊΠ° (devtools).
ΠΠΎΠ³Π΄Π° ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Ρ Π²ΡΠΉΠ΄Π΅Ρ ΠΈΠ· ΡΠΈΡΡΠ΅ΠΌΡ, ΡΠ΅ΡΠ²Π΅Ρ ΡΠ΄Π°Π»ΠΈΡ ΡΠ΅Π°Π½Ρ ΠΈΠ· Π±Π°Π·Ρ Π΄Π°Π½Π½ΡΡ
ΠΠ°ΠΊ ΡΠΎΠ»ΡΠΊΠΎ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Ρ
Π²ΡΠΉΠ΄Π΅Ρ ΠΈΠ· ΡΠΈΡΡΠ΅ΠΌΡ, Ρ ΡΠ΅ΡΠ²Π΅ΡΠ° ΠΈΡΡΠ΅ΡΠ΅Ρ ΡΡΠΎΠΊ Π΄Π΅ΠΉΡΡΠ²ΠΈΡ ΡΠ°ΠΉΠ»Π° cookie ΠΈ ΡΠ΅Π°Π½Ρ Π² Π±Π°Π·Ρ Π΄Π°Π½Π½ΡΡ
Π±ΡΠ΄Π΅Ρ ΠΎΡΠΈΡΠ΅Π½. ΠΡΠ°ΡΠ·Π΅Ρ Π΄Π΅Π»Π°Π΅Ρ ΡΠΎ ΠΆΠ΅ ΡΠ°ΠΌΠΎΠ΅, ΡΠ΄Π°Π»ΡΡ ΡΠ°ΠΉΠ» cookie ΠΈΠ· Ρ
ΡΠ°Π½ΠΈΠ»ΠΈΡΠ°.
ΠΡ ΡΠ°Π·ΠΎΠ±ΡΠ°Π»ΠΈΡΡ, ΠΊΠ°ΠΊ
ΡΠ°Π±ΠΎΡΠ°Π΅Ρ Π°ΡΡΠ΅Π½ΡΠΈΡΠΈΠΊΠ°ΡΠΈΡ Π½Π° ΠΎΡΠ½ΠΎΠ²Π΅ cookie, ΡΠ΅ΠΏΠ΅ΡΡ ΡΠ°ΡΡΠΌΠΎΡΡΠΈΠΌ ΡΠΈΡΠΈ, ΠΏΠ»ΡΡΡ ΠΈ
ΠΌΠΈΠ½ΡΡΡ ΡΡΠΎΠΉ ΡΡ
Π΅ΠΌΡ.
Automatic logout
ΠΠ΅ΠΌΠ°Π»ΠΎ Π²ΠΎΠΏΡΠΎΡΠΎΠ² Π½Π° ΠΏΡΠ°ΠΊΡΠΈΠΊΠ΅ Π²ΠΎΠ·Π½ΠΈΠΊΠ°Π΅Ρ Ρ automatic logout. ΠΠΎΠΆΠ΅Ρ ΠΏΠΎΠΊΠ°Π·Π°ΡΡΡΡ, ΡΡΠΎ Π·Π°Π΄Π°ΡΡ ΠΌΠΎΠΆΠ½ΠΎ ΡΠ΅ΡΠΈΡΡ ΠΏΡΡΠ΅ΠΌ ΠΌΠ°Π½ΠΈΠΏΡΠ»ΡΡΠΈΠΈ ΡΡΠΎΠΊΠΎΠ² Π΄Π΅ΠΉΡΡΠ²ΠΈΡ access- ΠΈ refresh-ΡΠΎΠΊΠ΅Π½ΠΎΠ². Π’ΠΎ Π΅ΡΡΡ ΠΏΠΎΡΠ»Π΅ ΠΎΠ±ΡΠ°ΡΠ΅Π½ΠΈΡ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Ρ ΠΊ Π±ΡΠΊΠ΅Π½Π΄Ρ ΡΠΈΡΡΠ΅ΠΌΠ° Π²ΡΠ΄Π°Π΅Ρ Π΅ΠΌΡ ΡΡΠΈ ΡΠΎΠΊΠ΅Π½Ρ ΡΠΎ ΡΡΠΎΠΊΠΎΠΌ Π΄Π΅ΠΉΡΡΠ²ΠΈΡ, ΠΊΠΎΡΠΎΡΡΠΉ Π½ΡΠΆΠ΅Π½ ΡΠ΅ΡΠΊΠΎ Π΄Π»Ρ Π°Π²ΡΠΎΠΌΠ°ΡΠΈΡΠ΅ΡΠΊΠΎΠ³ΠΎ Π»ΠΎΠ³Π°ΡΡΠ°. Π ΡΠΎΠ³Π΄Π° Π΅ΡΠ»ΠΈ ΡΠΎΠΊΠ΅Π½ ΠΏΡΠΎΡΡΠΎΡΠ΅Π½, ΡΠΎ Π»ΠΎΠ³Π°ΡΡ ΡΠΎΡΡΠΎΠΈΡΡΡ. ΠΠΈΠΆΠ΅ Π½Π° ΠΈΠ»Π»ΡΡΡΡΠ°ΡΠΈΠΈ ΠΏΡΠΈΠ²Π΅Π΄Π΅Π½Π° ΠΈΠΌΠ΅Π½Π½ΠΎ ΡΠ°ΠΊΠ°Ρ ΡΡ Π΅ΠΌΠ°:
Best practices Π² jwt
Π Π² Π·Π°Π²Π΅ΡΡΠ΅Π½ΠΈΠΈ ΠΏΡΠΈΠ²Π΅Π΄Ρ best practices ΠΏΡΠΈ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠΈ ΡΡΠΎΠ³ΠΎ Π²ΠΈΠ΄Π° ΡΠΎΠΊΠ΅Π½ΠΎΠ², ΠΊΠΎΡΠΎΡΡΡ ΡΠ»Π΅Π΄ΡΠ΅Ρ ΠΏΡΠΈΠ΄Π΅ΡΠΆΠΈΠ²Π°ΡΡΡΡ:
Cookie-based authentication
ΠΡΡΠ΅Π½ΡΠΈΡΠΈΠΊΠ°ΡΠΈΡ β ΡΡΠΎ ΠΏΡΠΎΡΠ΅ΡΡ ΠΎΠ±ΠΌΠ΅Π½Π° ΡΡΠ΅ΡΠ½ΡΠΌΠΈ Π΄Π°Π½Π½ΡΠΌΠΈ Π΄Π»Ρ ΠΈΠ΄Π΅Π½ΡΠΈΡΠΈΠΊΠ°ΡΠΈΠΈ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Ρ. ΠΡΠΈ Π°ΡΡΠ΅Π½ΡΠΈΡΠΈΠΊΠ°ΡΠΈΠΈ Π½Π° ΠΎΡΠ½ΠΎΠ²Π΅ cookies ΡΠ½ΠΈΠΊΠ°Π»ΡΠ½ΡΠΉ ΠΈΠ΄Π΅Π½ΡΠΈΡΠΈΠΊΠ°ΡΠΎΡ (ΡΠ°ΠΉΠ» cookie) ΡΠΎΠ·Π΄Π°Π΅ΡΡΡ Π½Π° ΡΡΠΎΡΠΎΠ½Π΅ ΡΠ΅ΡΠ²Π΅ΡΠ° ΠΈ ΠΎΡΠΏΡΠ°Π²Π»ΡΠ΅ΡΡΡ Π² Π±ΡΠ°ΡΠ·Π΅Ρ.
ΠΠΎΠ³Π΄Π° Π²Ρ Π²Ρ
ΠΎΠ΄ΠΈΡΠ΅ Π² Π²Π΅Π±-ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅, Π±ΡΠ°ΡΠ·Π΅Ρ ΠΏΠΎΠ»ΡΡΠ°Π΅Ρ ΡΠ°ΠΉΠ» cookie Ρ ΡΠ΅ΡΠ²Π΅ΡΠ°, ΡΠΎΡ
ΡΠ°Π½ΡΠ΅Ρ Π΅Π³ΠΎ ΠΈ ΠΎΡΠΏΡΠ°Π²Π»ΡΠ΅Ρ Ρ ΠΊΠ°ΠΆΠ΄ΡΠΌ
ΠΏΠΎΡΠ»Π΅Π΄ΡΡΡΠΈΠΌ Π·Π°ΠΏΡΠΎΡΠΎΠΌ, ΡΡΠΎΠ±Ρ ΡΠ΅ΡΠ²Π΅Ρ ΠΌΠΎΠ³ ΡΠ±Π΅Π΄ΠΈΡΡΡΡ, ΡΡΠΎ Π·Π°ΠΏΡΠΎΡΡ ΠΏΠΎΡΡΡΠΏΠ°ΡΡ ΠΎΡ ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΠΈ ΡΠΎΠ³ΠΎ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Ρ.
Π§ΡΠΎΠ±Ρ Π»ΡΡΡΠ΅ ΠΏΠΎΠ½ΡΡΡ, ΠΊΠ°ΠΊ
ΡΠ°Π±ΠΎΡΠ°ΡΡ ΡΠ°ΠΉΠ»Ρ cookie, ΡΠ°Π·ΠΎΠ±ΡΠ΅ΠΌ ΡΡΠΎΡ ΠΏΡΠΎΡΠ΅ΡΡ Π½Π° 5 ΡΠ°ΡΡΠ΅ΠΉ.
Django rest framework
Π’Π΅ΠΏΠ΅ΡΡ Π½ΡΠΆΠ½ΠΎ ΡΡΡΠ°Π½ΠΎΠ²ΠΈΡΡ Django REST Framework. Django REST Framework Π±ΠΎΠ»ΡΡΠΎΠΉ ΠΏΡΠΎΠ΅ΠΊΡ Ρ ΠΎΡΠΊΡΡΡΡΠΌ ΠΈΡΡ ΠΎΠ΄Π½ΡΠΌ ΠΊΠΎΠ΄ΠΎΠΌ, Π΄Π»Ρ ΡΠ΅Ρ , ΠΊΡΠΎ Ρ ΠΎΡΠ΅Ρ ΡΠΎΠ·Π΄Π°Π²Π°ΡΡ ΠΎΠ΄Π½ΠΎΡΡΡΠ°Π½ΠΈΡΠ½ΡΠ΅ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ ΠΈ API Π΄Π»Ρ Π½ΠΈΡ .
ΠΡ Π½Π΅ Π±ΡΠ΄Π΅ΠΌ Π΄Π΅ΡΠ°Π»ΡΠ½ΠΎ ΡΠ°ΡΡΠΌΠ°ΡΡΠΈΠ²Π°ΡΡ, ΠΊΠ°ΠΊ ΡΠ°Π±ΠΎΡΠ°Π΅Ρ Django REST Framework, ΠΏΠΎΡΡΠΎΠΌΡ Π΅ΡΠ»ΠΈ Π²Ρ Π½Π΅ Π·Π½Π°ΠΊΠΎΠΌΡ Ρ Π½ΠΈΠΌ, ΠΏΠΎΡΠΌΠΎΡΡΠΈΡΠ΅ Π΄ΠΎΠΊΡΠΌΠ΅Π½ΡΠ°ΡΠΈΡ.
ΠΠ»Ρ ΡΡΡΠ°Π½ΠΎΠ²ΠΊΠΈ Django REST Framework, Π²ΡΠΏΠΎΠ»Π½ΠΈΡΠ΅ ΡΠ»Π΅Π΄ΡΡΡΡΡ ΠΊΠΎΠΌΠ°Π½Π΄Ρ:
$ pip install djangorestframework
Django REST Framework Π΄ΠΎΠ»ΠΆΠ΅Π½ Π±ΡΡΡ Π΄ΠΎΠ±Π°Π²Π»Π΅Π½ ΠΊ Π²Π°ΡΠΈΠΌ ΡΡΡΠ°Π½ΠΎΠ²Π»Π΅Π½Π½ΡΠΌ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡΠΌ (INSTALLED_APPS Π² django_angular_token_auth/settings.py:)
INSTALLED_APPS = (
...,
'rest_framework',
)
Π’Π°ΠΊ ΠΆΠ΅ Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΎ Π΄ΠΎΠ±Π°Π²ΠΈΡΡ ΡΠ»Π΅Π΄ΡΡΡΠΈΠ΅ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΡ Π² django_angular_token_auth/settings.py:
REST_FRAMEWORK = {
'DEFAULT_PERMISSION_CLASSES': (
'rest_framework.permissions.IsAuthenticated',
),
'DEFAULT_AUTHENTICATION_CLASSES': (
'rest_framework.authentication.SessionAuthentication',
'rest_framework.authentication.BasicAuthentication',
),
}
ΠΡ Π½Π΅ Π±ΡΠ΄Π΅ΠΌ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ SessionAuthentication ΠΈΠ»ΠΈ BasicAuthentication, Π½ΠΎ ΠΎΠ½ΠΈ ΠΈΠΌΠ΅ΡΡΡΡ Π² Django REST Framework ΠΈ ΠΏΡΠ΅Π΄Π»Π°Π³Π°ΡΡ ΡΠ°Π±ΠΎΡΠΎΡΠΏΠΎΡΠΎΠ±Π½ΡΠΉ API ΠΈΠ· ΠΊΠΎΡΠΎΠ±ΠΊΠΈ.
Django-rest-framework-jwt
ΠΠΎΡΠ»Π΅Π΄Π½Π΅Π΅, ΡΡΠΎ Π½ΡΠΆΠ½ΠΎ ΡΠ΄Π΅Π»Π°ΡΡ, ΡΡΠΎ ΡΡΡΠ°Π½ΠΎΠ²ΠΈΡΡ django-rest-framework-jwt. ΠΡΠΎΡ ΠΏΠ°ΠΊΠ΅Ρ ΠΎΠ±Π΅ΡΠΏΠ΅ΡΠΈΠ²Π°Π΅Ρ ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΊΡ JWT Π΄Π»Ρ Django REST Framework ΠΈ Π² ΠΊΠ°ΡΠ΅ΡΡΠ²Π΅ JSON Web Token ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅Ρ ΡΠ΅Π°Π»ΠΈΠ·Π°ΡΠΈΡ PyJWT. Π§ΡΠΎ Π±Ρ ΡΡΡΠ°Π½ΠΎΠ²ΠΈΡΡ django-rest-framework-jwt Π²ΡΠΏΠΎΠ»Π½ΠΈΡΠ΅ ΡΠ»Π΅Π΄ΡΡΡΡΡ ΠΊΠΎΠΌΠ°Π½Π΄Ρ:
$ pip install djangorestframework-jwt
ΠΡΠΆΠ½ΠΎ Π±ΡΠ΄Π΅Ρ Π΄ΠΎΠ±Π°Π²ΠΈΡΡ ΡΠ»Π΅Π΄ΡΡΡΠΈΠ΅ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΡ Π² django_angular_token_auth/settings.py:
import datetime
JWT_AUTH = {
'JWT_EXPIRATION_DELTA': datetime.timedelta(days=14)
}
ΠΡΠΎΡ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡ ΡΠΊΠ°Π·ΡΠ²Π°Π΅Ρ ΡΡΠΎΠΊ ΠΆΠΈΠ·Π½ΠΈ Π΄Π»Ρ Π½Π°ΡΠΈΡ ΠΌΠ°ΡΠΊΠ΅ΡΠΎΠ² ΠΈ Π² Π½Π°ΡΠ΅ΠΌ ΡΠ»ΡΡΠ°Π΅ ΡΡΠΎ Π±ΡΠ΄Π΅Ρ 14 Π΄Π½Π΅ΠΉ. ΠΡ ΠΌΠΎΠΆΠ΅ΡΠ΅ ΠΈΠ·ΠΌΠ΅Π½ΠΈΡΡ Π΅Π³ΠΎ, ΠΈΡΡ ΠΎΠ΄Ρ ΠΈΠ· ΡΠΎΠ±ΡΡΠ²Π΅Π½Π½ΡΡ ΠΏΡΠ΅Π΄ΠΏΠΎΡΡΠ΅Π½ΠΈΠΉ.
ΠΡ ΡΠ°ΠΊ ΠΆΠ΅ Π΄ΠΎΠ»ΠΆΠ½Ρ Π΄ΠΎΠ±Π°Π²ΠΈΡΡ ΠΎΠ±Π½ΠΎΠ²Π»Π΅Π½Π½ΡΠ΅ Π½Π°ΡΡΡΠΎΠΉΠΊΠΈ REST_FRAMEWORK:
REST_FRAMEWORK = {
'DEFAULT_PERMISSION_CLASSES': (
'rest_framework.permissions.IsAuthenticated',
),
'DEFAULT_AUTHENTICATION_CLASSES': (
'rest_framework.authentication.SessionAuthentication',
'rest_framework.authentication.BasicAuthentication',
'rest_framework_jwt.authentication.JSONWebTokenAuthentication',
)
}
ΠΠ±ΡΠ°ΡΠΈΡΠ΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅, ΡΡΠΎ ΠΌΡ Π΄ΠΎΠ±Π°Π²ΠΈΠ»ΠΈ:’rest_framework_jwt.authentication.JSONWebTokenAuthentication’, Π² ‘DEFAULT_AUTHENTICATION_CLASSES’.
Header
The header typically consists of two parts: the type of the token, which is JWT, and the signing algorithm being used, such as HMAC SHA256 or RSA.
For example:
{
"alg": "HS256",
"typ": "JWT"
}
Then, this JSON is Base64Url encoded to form the first part of the JWT.
Json web tokens
Π£ΡΠΈΡΡΠ²Π°Ρ ΡΠΊΠ°Π·Π°Π½Π½ΡΠ΅ ΠΏΡΠΎΠ±Π»Π΅ΠΌΡ, Π² ΡΠΎΠΎΠ±ΡΠ΅ΡΡΠ²Π΅ ΡΠ°Π·ΡΠ°Π±ΠΎΡΡΠΈΠΊΠΎΠ² ΠΌΠ½ΠΎΠ³ΠΎ Π»Π΅Ρ Π½Π°Π·Π°Π΄ ΠΏΠΎΡΠ²ΠΈΠ»Π°ΡΡ ΠΈΠ΄Π΅Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ Π½Π΅ΠΊΡΡ ΡΡΡΠΎΠΊΡ, ΠΊΠΎΡΠΎΡΡΡ Ρ ΠΎΠ΄Π½ΠΎΠΉ ΡΡΠΎΡΠΎΠ½Ρ Π½Π΅Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠΎΠ΄Π΄Π΅Π»Π°ΡΡ, Ρ Π΄ΡΡΠ³ΠΎΠΉ β ΠΊΠΎΡΠΎΡΡΡ ΠΊΠ°ΠΆΠ΄ΡΠΉ ΡΠ΅ΡΡΡΡΠ½ΡΠΉ ΡΠ΅ΡΠ²Π΅Ρ ΠΌΠΎΠ³ Π±Ρ ΡΠ°ΠΌ ΠΏΡΠΎΠ²Π΅ΡΠΈΡΡ Π½Π° Π²Π°Π»ΠΈΠ΄Π½ΠΎΡΡΡ. Π ΠΊΠ°ΡΠ΅ΡΡΠ²Π΅ ΡΠ°ΠΊΠΎΠΉ ΡΡΡΠΎΠΊΠΈ ΠΎΠΊΠ°Π·Π°Π»ΠΎΡΡ ΡΠ΄ΠΎΠ±Π½ΠΎ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ JWT β JSON Web Token.
JWT ΠΏΡΠ΅Π΄ΡΡΠ°Π²Π»ΡΠ΅Ρ ΡΠΎΠ±ΠΎΠΉ ΡΡΡΠΎΠΊΡ ΠΈΠ· ΡΡΠ΅Ρ ΡΠ°ΡΡΠ΅ΠΉ, ΡΠ°Π·Π΄Π΅Π»Π΅Π½Π½ΡΡ ΡΠΎΡΠΊΠ°ΠΌΠΈ. ΠΠ° ΠΈΠ»Π»ΡΡΡΡΠ°ΡΠΈΠΈ Π½ΠΈΠΆΠ΅ ΠΏΡΠΈΠ²Π΅Π΄Π΅Π½Ρ Π·Π½Π°ΡΠ΅Π½ΠΈΡ ΠΊΠ°ΠΆΠ΄ΠΎΠΉ ΡΠ°ΡΡΠΈ:
ΠΡΠΈ ΡΡΠΎΠΌ ΠΎΡΠΊΡΡΡΡ ΠΎΠ±ΡΠ°ΡΠ½ΠΎ ΠΏΠ΅ΡΠ²ΡΡ ΠΈ Π²ΡΠΎΡΡΡ ΡΠ°ΡΡΠΈ Π½Π΅ ΡΠΎΡΡΠ°Π²ΠΈΡ ΡΡΡΠ΄Π° Π΄Π»Ρ Π»ΡΠ±ΠΎΠ³ΠΎ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Ρ, ΠΈΠΌΠ΅ΡΡΠ΅Π³ΠΎ ΡΠΎΡ ΡΠ°ΠΌΡΠΉ Π΄Π²ΡΡΡΠΎΡΠΎΠ½Π½ΠΈΠΉ Π°Π»Π³ΠΎΡΠΈΡΠΌ.
ΠΠΎ Π½ΠΈΠΊΡΠΎ Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ ΠΏΡΠΎΡΠΈΡΠ°ΡΡ Π·Π°ΠΏΠΈΡΠ°Π½Π½ΠΎΠ΅ Π² ΡΡΠ΅ΡΡΠ΅ΠΉ ΡΠ°ΡΡΠΈ β ΠΈ ΡΠΎΠΎΡΠ²Π΅ΡΡΡΠ²Π΅Π½Π½ΠΎ Π½ΠΈΠΊΡΠΎ Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ ΠΏΠΎΠ΄Π΄Π΅Π»Π°ΡΡ ΡΠΎΠΊΠ΅Π½.
ΠΡΠ»ΠΈ Π·Π»ΠΎΡΠΌΡΡΠ»Π΅Π½Π½ΠΈΠΊ, Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ, ΡΠΊΠ°ΠΆΠ΅Ρ Π²ΠΎ Π²ΡΠΎΡΠΎΠΉ ΡΠ°ΡΡΠΈ Π΄ΡΡΠ³ΠΎΠ΅ ΠΈΠΌΡ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Ρ, ΡΠΎ ΠΈΠ·ΠΌΠ΅Π½ΠΈΡΡΡ ΠΈ ΠΏΠΎΠ΄ΠΏΠΈΡΡ Π² ΡΡΠ΅ΡΡΠ΅ΠΉ ΡΠ°ΡΡΠΈ. ΠΠΎ ΠΏΠΎΡΠΊΠΎΠ»ΡΠΊΡ Ρ Π·Π»ΠΎΡΠΌΡΡΠ»Π΅Π½Π½ΠΈΠΊΠ° Π½Π΅Ρ ΡΠ΅ΠΊΡΠ΅ΡΠ½ΠΎΠ³ΠΎ ΠΊΠ»ΡΡΠ°, ΡΠΎ ΠΎΠ½ Π½Π΅ ΡΠΌΠΎΠΆΠ΅Ρ ΠΏΡΠ°Π²ΠΈΠ»ΡΠ½ΠΎ ΠΏΠΎΠ΄ΠΏΠΈΡΠ°ΡΡ ΡΠΎΠΊΠ΅Π½. JWT ΠΏΠΎΠΏΡΠΎΡΡΡ Π½Π΅ Π±ΡΠ΄Π΅Ρ Π²Π°Π»ΠΈΠ΄Π½ΡΠΌ.
ΠΠ΅ΡΠ΅ΠΉΠ΄Π΅ΠΌ ΠΊ ΡΠ»Π΅Π΄ΡΡΡΠ΅ΠΉ ΡΡ Π΅ΠΌΠ΅ Π½Π° ΠΈΠ»Π»ΡΡΡΡΠ°ΡΠΈΠΈ Π½ΠΈΠΆΠ΅. Π‘Ρ Π΅ΠΌΠ° ΠΏΠΎΡ ΠΎΠΆΠ° Π½Π° Π°ΡΡΠ΅Π½ΡΠΈΡΠΈΠΊΠ°ΡΠΈΡ Ρ ΠΏΠΎΠΌΠΎΡΡΡ ΡΠ΅ΡΡΠΈΠΉ, Π½ΠΎ Π΅ΡΡΡ ΠΎΠ΄Π½ΠΎ ΠΎΡΠ»ΠΈΡΠΈΠ΅. ΠΠΎΡΠ»Π΅ Π²Π²Π΅Π΄Π΅Π½ΠΈΡ ΠΊΡΠ΅Π΄ΠΎΠ² ΡΠ΅ΡΠ²Π΅Ρ Π΄Π°Π΅Ρ ΡΠ·Π΅ΡΡ Π½Π΅ cookies Ρ Session ID, Π° ΡΠΎΠΊΠ΅Π½. ΠΠ°ΡΠ΅ΠΌ ΠΊΠ»ΠΈΠ΅Π½ΡΡΠΊΠΎΠ΅ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Π΄ΠΎΠ±Π°Π²Π»ΡΠ΅Ρ ΡΠΎΠΊΠ΅Π½ ΠΊ ΠΊΠ°ΠΆΠ΄ΠΎΠΌΡ Π·Π°ΠΏΡΠΎΡΡ Π² Π²ΠΈΠ΄Π΅ ΡΠΏΠ΅ΡΠΈΠ°Π»ΡΠ½ΠΎΠ³ΠΎ Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΊΠ° Authorization.
ΠΡΠΈ ΡΡΠΎΠΌ ΠΎΠ½ΠΎ Π²ΠΏΠΈΡΡΠ²Π°Π΅Ρ Π² Π½Π΅Π³ΠΎ ΡΠ»ΠΎΠ²ΠΎ Β«BearerΒ» (ΠΏΡΠ΅Π΄ΡΡΠ²ΠΈΡΠ΅Π»Ρ), Π° ΠΏΠΎΡΠ»Π΅ ΠΏΡΠΎΠ±Π΅Π»Π° β ΡΠ°ΠΌ ΡΠΎΠΊΠ΅Π½. Π’Π°ΠΊΠΆΠ΅ Π½Π° ΡΡ Π΅ΠΌΠ΅ ΠΏΡΠ΅Π΄ΡΡΠ°Π²Π»Π΅Π½ Auth middleware. ΠΡΠΎ Π΄ΠΎΡΡΠ°ΡΠΎΡΠ½ΠΎ ΡΡΠ°Π½Π΄Π°ΡΡΠ½Π°Ρ ΡΠ°ΡΡΡ Π»ΡΠ±ΠΎΠ³ΠΎ ΡΡΠ΅ΠΉΠΌΠ²ΠΎΡΠΊΠ°, ΠΊΠΎΡΠΎΡΠ°Ρ ΡΠΌΠ΅Π΅Ρ ΠΏΡΠΎΠ²Π΅ΡΡΡΡ, Π² ΡΠ°ΡΡΠ½ΠΎΡΡΠΈ, Π²Π°Π»ΠΈΠ΄Π½ΠΎΡΡΡ ΡΠΎΠΊΠ΅Π½Π°. Π’ΠΎ Π΅ΡΡΡ ΠΎΠ±ΡΠ°Π±ΠΎΡΠΊΠ° Π½Π° ΡΠ΅ΡΠ²Π΅ΡΠ΅ ΠΏΡΠΎΡ ΠΎΠ΄ΠΈΡ ΡΡΠ°ΠΏ ΠΏΡΠΎΠ²Π΅ΡΠΊΠΈ.
ΠΡΠ»ΠΈ ΡΠΎΠΊΠ΅Π½ Π½Π΅ Π·Π°ΡΠΊΡΠΏΠ°ΠΉΡΠΈΠ»ΡΡ ΠΈ ΠΏΡΠ°Π²ΠΈΠ»ΡΠ½ΠΎ ΠΏΠΎΠ΄ΠΏΠΈΡΠ°Π½ Ρ ΠΏΠΎΠΌΠΎΡΡΡ ΡΠ΅ΠΊΡΠ΅ΡΠ½ΠΎΠΉ ΡΡΡΠΎΠΊΠΈ, ΡΠΎ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Ρ Π°ΡΡΠ΅Π½ΡΠΈΡΠΈΡΠΈΡΠΎΠ²Π°Π½. Π ΡΠ΅Π·ΡΠ»ΡΡΠ°ΡΠ΅ ΠΏΡΠΈ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠΈ Π°ΡΡ ΠΈΡΠ΅ΠΊΡΡΡΡ ΠΌΠΈΠΊΡΠΎΡΠ΅ΡΠ²ΠΈΡΠΎΠ² Π½Π΅ Π½ΡΠΆΠ½ΠΎ ΠΊΠ°ΠΆΠ΄ΡΠΉ Π·Π°ΠΏΡΠΎΡ ΠΊ ΡΠ΅ΡΡΡΡΠ½ΡΠΌ ΡΠ΅ΡΠ²Π΅ΡΠ°ΠΌ ΠΏΡΠΎΠ³ΠΎΠ½ΡΡΡ ΡΠ΅ΡΠ΅Π· ΡΠ΅ΡΠ²Π΅Ρ Π°ΡΡΠ΅Π½ΡΠΈΡΠΈΠΊΠ°ΡΠΈΠΈ.
Logout ΠΈ only one active device
ΠΠ°Π²Π°ΠΉΡΠ΅ ΠΏΠΎΠ΄ΡΠΎΠ±Π½Π΅Π΅ ΡΠ°ΡΡΠΌΠΎΡΡΠΈΠΌ Π·Π°Π΄Π°ΡΠΈ Π°Π²ΡΠΎΡΠΈΠ·Π°ΡΠΈΠΈ Logout ΠΈ Only one active device. Π‘Π°ΠΌΠΈ ΠΏΠΎ ΡΠ΅Π±Π΅ ΡΠΎΠΊΠ΅Π½Ρ Π·Π°Π΄ΡΠΌΠ°Π½Ρ ΠΊΠ°ΠΊ stateless, ΡΠΎ Π΅ΡΡΡ ΠΎΠ½ΠΈ Π½Π΅ ΠΏΡΠ΅Π΄Π½Π°Π·Π½Π°ΡΠ΅Π½Ρ Π΄Π»Ρ ΡΠ°Π·ΠΌΠ΅ΡΠ΅Π½ΠΈΡ Π½Π° ΡΠ΅ΡΠ²Π΅ΡΠ΅. Π ΠΈΠ΄Π΅Ρ Π·Π°ΠΊΠ»ΡΡΠ°Π΅ΡΡΡ Π² ΡΠΎΠΌ, ΡΡΠΎΠ±Ρ ΠΏΡΠ΅Π΄ΡΡΠΌΠΎΡΡΠ΅ΡΡ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΡ Ρ ΡΠ°Π½Π΅Π½ΠΈΡ ΠΊΠ°ΠΊΠΎΠΉ-ΡΠΎ ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΠΈ ΠΎ Π½ΠΈΡ Π½Π° ΡΠ΅ΡΠ²Π΅ΡΠ΅.
Π’Π°ΠΊΠΈΠ΅ ΡΠΎΠΊΠ΅Π½Ρ Π±ΡΠ΄ΡΡ Ρ ΡΠ°Π½ΠΈΡΡΡΡ Π² Β«ΡΠ΅ΡΠ½ΠΎΠΌ ΡΠΏΠΈΡΠΊΠ΅Β», ΠΏΠΎΠΊΠ° Π½Π΅ ΠΈΡΡΠ΅ΡΠ΅Ρ ΡΡΠΎΠΊ ΠΈΡ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΡ. Π‘ Π΄ΡΡΠ³ΠΎΠΉ ΡΡΠΎΡΠΎΠ½Ρ, ΠΌΠΎΠΆΠ½ΠΎ ΡΠΎΠ·Π΄Π°ΡΡ Π½Π° ΡΠ΅ΡΠ²Π΅ΡΠ΅ whitelist, ΡΡΠΎ ΠΌΠΎΠΆΠ΅Ρ ΠΎΠΊΠ°Π·Π°ΡΡΡΡ Π΄Π°ΠΆΠ΅ Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΎ ΠΏΡΠΎΡΠ΅. ΠΡΠΎΡ ΡΠΏΠΈΡΠΎΠΊ ΡΡΠ°Π½Π΅Ρ ΡΠ΅Π΅ΡΡΡΠΎΠΌ Π²ΡΠ΄Π°Π½Π½ΡΡ ΡΠΎΠΊΠ΅Π½ΠΎΠ², Ρ ΠΊΠΎΡΠΎΡΡΠΌ ΠΌΠΎΠΆΠ΅Ρ ΡΠ²Π΅ΡΡΡΡΡΡ ΡΠΈΡΡΠ΅ΠΌΠ°. ΠΡΠ»ΠΈ ΠΏΡΠ΅Π΄ΡΡΠ²Π»Π΅Π½Π½ΡΠΉ ΡΠ·Π΅ΡΠΎΠΌ ΡΠΎΠΊΠ΅Π½ Π½Π΅ ΠΏΡΠΎΡΡΠΎΡΠ΅Π½ ΠΈ ΡΠΊΠ°Π·Π°Π½ Π² Β«Π±Π΅Π»ΠΎΠΌ ΡΠΏΠΈΡΠΊΠ΅Β», ΡΠΎ ΠΎΠ½ Π²Π°Π»ΠΈΠ΄Π΅Π½.
Π₯ΡΠ°Π½Π΅Π½ΠΈΠ΅ ΡΠ°ΠΌΠΈΡ ΡΠΎΠΊΠ΅Π½ΠΎΠ² Π² Π±Π°Π·Π΅ Π΄Π°Π½Π½ΡΡ ΡΠ»ΠΎΠΆΠ½ΠΎ Π½Π°Π·Π²Π°ΡΡ Π±Π΅Π·ΠΎΠΏΠ°ΡΠ½ΡΠΌ. ΠΠΎΠΆΠ½ΠΎ Π»ΠΈ ΠΊΠ°ΠΊ-ΡΠΎ Π²ΡΠΉΡΠΈ ΠΈΠ· ΡΡΠΎΠΉΒ ΡΠΈΡΡΠ°ΡΠΈΠΈ? ΠΠ°. ΠΠ±ΡΠ°ΡΠΈΡΠ΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅ Π½Π° ΠΈΠ»Π»ΡΡΡΡΠ°ΡΠΈΡ Π½ΠΈΠΆΠ΅: Π² ΡΠ°Π·Π΄Π΅Π»Π΅ payload Π΄ΠΎΠ±Π°Π²ΠΈΠ»ΡΡ ΠΏΡΠ½ΠΊΡ hash. ΠΡΠΎ Π½Π΅ΠΊΠ°Ρ ΡΠ°Π½Π΄ΠΎΠΌΠ½ΠΎ ΡΡΠΎΡΠΌΠΈΡΠΎΠ²Π°Π½Π½Π°Ρ ΡΡΡΠΎΠΊΠ°. ΠΠ½Π° Π·Π°ΠΏΠΈΡΡΠ²Π°Π΅ΡΡΡ Π² payload ΡΠΎΠΊΠ΅Π½Π° ΠΈ Π² Ρ ΡΠ°Π½ΠΈΠ»ΠΈΡΠ΅ Π½Π° ΡΠ΅ΡΠ²Π΅ΡΠ΅ Ρ ΠΏΡΠΈΠ²ΡΠ·ΠΊΠΎΠΉ ΠΊ ΠΈΠ΄Π΅Π½ΡΠΈΡΠΈΠΊΠ°ΡΠΎΡΡ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Ρ.
ΠΠΎΠ³Π΄Π° ΡΠ·Π΅Ρ ΠΏΡΠ΅Π΄ΡΡΠ²Π»ΡΠ΅Ρ ΡΠΎΠΊΠ΅Π½, ΡΠΈΡΡΠ΅ΠΌΠ° ΠΏΠ°ΡΡΠΈΡ Π΅Π³ΠΎ, ΠΏΡΠΎΠ²Π΅ΡΡΠ΅Ρ ΡΡΠΎΠΊ Π΄Π΅ΠΉΡΡΠ²ΠΈΡ ΡΠΎΠΊΠ΅Π½Π° ΠΈ Π΅Π³ΠΎ ΠΏΠΎΠ΄ΠΏΠΈΡΡ ΡΠ΅ΠΊΡΠ΅ΡΠ½ΠΎΠΉ ΡΡΡΠΎΠΊΠΎΠΉ. ΠΠ°ΡΠ΅ΠΌ Π²ΡΡΠ°ΡΠΊΠΈΠ²Π°Π΅Ρ hash ΠΈ ΡΠ²Π΅ΡΡΠ΅Ρ Π΅Π³ΠΎ Ρ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»ΡΡΠΊΠΈΠΌ ID Π² Ρ ΡΠ°Π½ΠΈΠ»ΠΈΡΠ΅. ΠΡΠΎ ΠΌΠΎΠΆΠ΅Ρ Π±ΡΡΡ key-value Ρ ΡΠ°Π½ΠΈΠ»ΠΈΡΠ΅, ΠΎΡΠ½ΠΎΠ²Π½Π°Ρ Π±Π°Π·Π° Π΄Π°Π½Π½ΡΡ ΠΈΠ»ΠΈ Π΄ΡΡΠ³ΠΎΠ΅ Ρ ΡΠ°Π½ΠΈΠ»ΠΈΡΠ΅, ΠΊΠΎΡΠΎΡΠΎΠ΅ ΠΏΡΠ΅Π΄ΠΎΡΡΠ°Π²ΠΈΡ ΡΠΎΠ²ΡΠ΅ΠΌΠ΅Π½Π½ΡΠΉ ΡΡΠ΅ΠΉΠΌΠ²ΠΎΡΠΊ.
Payload ΠΈΠ»ΠΈ ΠΏΠΎΠ»Π΅Π·Π½ΡΠ΅ Π΄Π°Π½Π½ΡΠ΅
ΠΡΠΎΡΡΠΌ Π±Π»ΠΎΠΊΠΎΠΌ ΠΈΠ΄Π΅Ρ eyJ1c2VyX2lkIjoxLCJleHAiOjE1ODEzNTcwMzl9
ΠΡΠΎ Π΅ΡΡΡ ΠΏΠΎΠ»Π΅Π·Π½ΡΠ΅ Π΄Π°Π½Π½ΡΠ΅, ΡΠ°ΠΊ ΠΆΠ΅ Π·Π°ΠΊΠΎΠ΄ΠΈΡΠΎΠ²Π°Π½Π½ΡΠ΅ Π² Base64. ΠΠΎΡΠ»Π΅ ΡΠ°ΡΠΊΠΎΠ΄ΠΈΡΠΎΠ²Π°Π½ΠΈΡ ΠΏΠΎΠ»ΡΡΠΈΠΌ:
Signature
To create the signature part you have to take the encoded header, the encoded payload, a secret, the algorithm specified in the header, and sign that.
For example if you want to use the HMAC SHA256 algorithm, the signature will be created in the following way:
HMACSHA256(
base64UrlEncode(header) "."
base64UrlEncode(payload),
secret)
The signature is used to verify the message wasn’t changed along the way, and, in the case of tokens signed with a private key, it can also verify that the sender of the JWT is who it says it is.
Url-Π°Π΄ΡΠ΅ΡΠ°
Π’Π΅ΠΏΠ΅ΡΡ Π½ΡΠΆΠ½ΠΎ Π½Π°ΡΡΡΠΎΠΈΡΡ URL-Π°Π΄ΡΠ΅ΡΠ° Π΄Π»Ρ Π½Π°ΡΠ΅Π³ΠΎ ΠΏΡΠΎΠ΅ΠΊΡΠ°.
ΠΡΠΊΡΠΎΠΉΡΠ΅ django_angular_token_auth/urls.py ΠΈ ΠΏΡΠΈΠ²Π΅Π΄ΠΈΡΠ΅ Π΅Π³ΠΎ ΠΊ ΡΠ»Π΅Π΄ΡΡΡΠ΅ΠΌΡ Π²ΠΈΠ΄Ρ:
What is json web token?
JSON Web Token (JWT) is an open standard (RFC 7519) that defines a compact and self-contained way for securely transmitting information between parties as a JSON object. This information can be verified and trusted because it is digitally signed.
Although JWTs can be encrypted to also provide secrecy between parties, we will focus on signed tokens. Signed tokens can verify the integrity of the claims contained within it, while encrypted tokens hide those claims from other parties.
What is the json web token structure?
In its compact form, JSON Web Tokens consist of three parts separated by dots (.), which are:
Therefore, a JWT typically looks like the following.
xxxxx.yyyyy.zzzzz
Let’s break down the different parts.
When should you use json web tokens?
Here are some scenarios where JSON Web Tokens are useful:
Why should we use json web tokens?
Let’s talk about the benefits of JSON Web Tokens (JWT) when compared to Simple Web Tokens (SWT) and Security Assertion Markup Language Tokens (SAML).
ΠΠ΅Π·ΠΎΠΏΠ°ΡΠ½ΠΎΡΡΡ
Cookie Π½Π΅ ΠΈΠΌΠ΅ΡΡ Π½Π°Π΄Π΅ΠΆΠ½ΠΎΠΉ Π·Π°ΡΠΈΡΡ ΠΎΡ Π°ΡΠ°ΠΊ, ΠΈ ΠΎΠ½ΠΈ Π² ΠΎΡΠ½ΠΎΠ²Π½ΠΎΠΌ ΡΡΠ·Π²ΠΈΠΌΡ Π΄Π»Ρ Π°ΡΠ°ΠΊ Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠ΅ΠΌ ΠΌΠ΅ΠΆΡΠ°ΠΉΡΠΎΠ²ΠΎΠ³ΠΎ ΡΠΊΡΠΈΠΏΡΠΈΠ½Π³Π° (XSS) ΠΈ ΠΏΠΎΠ΄Π΄Π΅Π»ΠΊΠΈ ΠΌΠ΅ΠΆΡΠ°ΠΉΡΠΎΠ²ΡΡ Π·Π°ΠΏΡΠΎΡΠΎΠ² (CSRF).
ΠΡ ΠΌΠΎΠΆΠ΅ΠΌ ΡΠ²Π½ΠΎ ΠΈΠ·ΠΌΠ΅Π½ΠΈΡΡ Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΊΠΈ ΡΠ°ΠΉΠ»ΠΎΠ² cookie, ΡΡΠΎΠ±Ρ Π·Π°ΡΠΈΡΠΈΡΡ ΠΈΡ ΠΎΡ ΡΠ°ΠΊΠΈΡ Π°ΡΠ°ΠΊ.
ΠΠΎ Π²ΡΠΎΡΠΎΠΉ ΡΠ°ΡΡΠΈ
ΠΠ° ΡΡΠΎΠΌ ΠΌΡ ΠΎΡΡΠ°Π½ΠΎΠ²ΠΈΠΌΡΡ. ΠΠΎ Π²ΡΠΎΡΠΎΠΉ ΡΠ°ΡΡΠΈ, ΠΏΠΎΡΡΡΠΎΠΈΠΌ ΠΊΠ»ΠΈΠ΅Π½ΡΡΠΊΠΎΠ΅ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ ΠΈ Π² ΠΎΡΠ½ΠΎΠ²Π½ΠΎΠΌ ΡΠΎΡΡΠ΅Π΄ΠΎΡΠΎΡΠΈΠΌΡΡ Π½Π° ΡΠ΅Π³ΠΈΡΡΡΠ°ΡΠΈΠΈ ΠΈ ΡΠ΅Π°Π½ΡΠ΅ Π²Ρ ΠΎΠ΄Π° Π² ΡΠΈΡΡΠ΅ΠΌΡ. ΠΠ°ΠΏΠΈΡΠ΅ΠΌ ΡΠ΅ΡΠ²ΠΈΡ, Π΄Π»Ρ ΡΠΎΠ³ΠΎ ΡΡΠΎ Π±Ρ ΠΌΠΎΠΆΠ½ΠΎ Π±ΡΠ»ΠΎ ΠΏΡΠ°Π²ΠΈΠ»ΡΠ½ΠΎ Π·Π°Ρ ΠΎΠ΄ΠΈΡΡ ΠΈ Π²ΡΡ ΠΎΠ΄ΠΈΡΡ ΠΈΠ· ΡΠΈΡΡΠ΅ΠΌΡ.
ΠΠ°Π³ΠΎΠ»ΠΎΠ²ΠΎΠΊ
ΠΠΎ ΡΠΌΠΎΠ»ΡΠ°Π½ΠΈΡ, Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΎΠΊ ΡΠΎΠ΄Π΅ΡΠΆΠΈΡ ΡΠΎΠ»ΡΠΊΠΎ ΡΠΈΠΏ ΠΌΠ°ΡΠΊΠ΅ΡΠ° ΠΈ Π°Π»Π³ΠΎΡΠΈΡΠΌ, ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΠΌΡΠΉ Π΄Π»Ρ ΡΠΈΡΡΠΎΠ²Π°Π½ΠΈΡ.
Π’ΠΈΠΏ ΠΌΠ°ΡΠΊΠ΅ΡΠ° Ρ ΡΠ°Π½ΠΈΡΡΡ Π² ΠΊΠ»ΡΡΠ΅ Β«typΒ». ΠΠ»ΡΡ Β«typΒ» ΠΈΠ³Π½ΠΎΡΠΈΡΡΠ΅ΡΡΡ Π² JWT (Π΄Π»Ρ ΡΡΠΎΠΉ ΡΡΠ°ΡΡΠΈ ΡΡΠΎ Π½Π΅ Π²Π°ΠΆΠ½ΠΎ, Π½ΠΎ Π²Ρ ΠΌΠΎΠΆΠ΅ΡΠ΅
, ΡΡΠΎΠ±Ρ ΡΠ·Π½Π°ΡΡ ΠΏΠΎΡΠ΅ΠΌΡ). ΠΡΠ»ΠΈ ΠΊΠ»ΡΡ Β«typΒ» ΠΏΡΠΈΡΡΡΡΡΠ²ΡΠ΅Ρ, Π΅Π³ΠΎ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ Π΄ΠΎΠ»ΠΆΠ½ΠΎ Π±ΡΡΡ JWT, ΡΡΠΎΠ±Ρ ΡΠΊΠ°Π·Π°ΡΡ, ΡΡΠΎ ΡΡΠΎΡ ΠΎΠ±ΡΠ΅ΠΊΡ ΡΠ²Π»ΡΠ΅ΡΡΡ JSON Web Token.
ΠΡΠΎΡΠΎΠΉ ΠΊΠ»ΡΡ Β«algΒ» ΠΎΠΏΡΠ΅Π΄Π΅Π»ΡΠ΅Ρ Π°Π»Π³ΠΎΡΠΈΡΠΌ, ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΠΌΡΠΉ Π΄Π»Ρ ΡΠΈΡΡΠΎΠ²Π°Π½ΠΈΡ ΠΌΠ°ΡΠΊΠ΅ΡΠ°. ΠΠΎ ΡΠΌΠΎΠ»ΡΠ°Π½ΠΈΡ ΠΎΠ½ Π΄ΠΎΠ»ΠΆΠ΅Π½ Π±ΡΡΡ ΡΡΡΠ°Π½ΠΎΠ²Π»Π΅Π½ Π² HS256. ΠΡΡΡ ΡΠ΅Π»ΡΠΉ ΡΡΠ΄ Π°Π»ΡΡΠ΅ΡΠ½Π°ΡΠΈΠ²Π½ΡΡ Π°Π»Π³ΠΎΡΠΈΡΠΌΠΎΠ², ΠΊΠΎΡΠΎΡΡΠ΅ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΡΡΡΡ Π² ΡΠ°Π·Π»ΠΈΡΠ½ΡΡ ΡΠ΅Π°Π»ΠΈΠ·Π°ΡΠΈΡΡ . ΠΠΎΠ»Π½ΡΠΉ ΡΠΏΠΈΡΠΎΠΊ Ρ ΡΠ°Π·Π±ΠΈΠ²ΠΊΠΎΠΉ ΠΏΠΎ Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠ°ΠΌ ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠΎΡΠΌΠΎΡΡΠ΅ΡΡ Π½Π° vhod-v-lichnyj-kabinet.ru.
ΠΠ°Π³ΠΎΠ»ΠΎΠ²ΠΎΠΊ ΠΊΠΎΠ΄ΠΈΡΡΠ΅ΡΡΡ Π² base64.
ΠΠ°ΡΠ΅ΠΌ 2 ΡΠΎΠΊΠ΅Π½Π°?
ΠΡΠ΅Π΄ΡΡΠ°Π²ΠΈΠΌ ΡΠΈΡΡΠ°ΡΠΈΡ, ΠΊΠΎΠ³Π΄Π° Ρ Π½Π°Ρ ΠΊΠ°ΠΊΠΈΠΌ-ΡΠΎ ΠΎΠ±ΡΠ°Π·ΠΎΠΌ ΡΠΊΡΠ°Π»ΠΈ Access ΡΠΎΠΊΠ΅Π½. ΠΠ°, ΡΡΠΎ ΡΠΆΠ΅ ΠΏΠ»ΠΎΡ ΠΎ ΠΈ Π³Π΄Π΅-ΡΠΎ Ρ Π½Π°Ρ Π±ΡΠ΅ΡΡ Π² Π±Π΅Π·ΠΎΠΏΠ°ΡΠ½ΠΎΡΡΠΈ. ΠΠ»ΠΎΡΠΌΡΡΠ»Π΅Π½Π½ΠΈΠΊ Π² ΡΡΠΎΠΌ ΡΠ»ΡΡΠ°Π΅ ΡΠΌΠΎΠΆΠ΅Ρ ΠΈΠΌ Π²ΠΎΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡΡΡ Π½Π΅ Π±ΠΎΠ»Π΅Π΅ ΡΠ΅ΠΌ Π½Π° 15-30 ΠΌΠΈΠ½ΡΡ. ΠΠΎΡΠ»Π΅ ΡΠ΅Π³ΠΎ ΡΠΎΠΊΠ΅Π½ “ΠΏΡΠΎΡΡΡ Π½Π΅Ρ” ΠΈ ΠΏΠ΅ΡΠ΅ΡΡΠ°Π½Π΅Ρ Π±ΡΡΡ Π°ΠΊΡΡΠ°Π»ΡΠ½ΡΠΌ. ΠΠ΅Π΄Ρ Π½ΡΠΆΠ΅Π½ Π²ΡΠΎΡΠΎΠΉ ΡΠΎΠΊΠ΅Π½ Π΄Π»Ρ ΠΏΡΠΎΠ΄Π»Π΅Π½ΠΈΡ.
ΠΡΠ»ΠΈ ΡΠΊΡΠ°Π»ΠΈ Refresh ΡΠΎΠΊΠ΅Π½, ΡΠΎ Π±Π΅Π· Access ΡΠΎΠΊΠ΅Π½Π° (ΠΊΠΎΡΠΎΡΡΠΉ Π½Π΅Π΄ΠΎΡΡΡΠΏΠ΅Π½ Π² JS) ΠΏΡΠΎΠ΄Π»ΠΈΡΡ Π½ΠΈΡΠ΅Π³ΠΎ Π½Π΅Π»ΡΠ·Ρ ΠΈ ΠΎΠ½ ΠΎΠΊΠ°Π·ΡΠ²Π°Π΅ΡΡΡ ΠΏΡΠΎΡΡΠΎ Π±Π΅ΡΠΏΠΎΠ»Π΅Π·Π½ΡΠΌ.
ΠΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠ΅ Π°Π»Π³ΠΎΡΠΈΡΠΌΠ° Ρ Π΅ΡΠΈΡΠΎΠ²Π°Π½ΠΈΡ none
ΠΠΎΠ΄ΠΎΠ±Π½Π°Ρ Π°ΡΠ°ΠΊΠ° ΠΏΡΠΎΠΈΡΡ ΠΎΠ΄ΠΈΡ, ΠΊΠΎΠ³Π΄Π° Π·Π»ΠΎΡΠΌΡΡΠ»Π΅Π½Π½ΠΈΠΊ ΠΈΠ·ΠΌΠ΅Π½ΡΠ΅Ρ ΡΠΎΠΊΠ΅Π½, Π° ΡΠ°ΠΊΠΆΠ΅ ΠΌΠ΅Π½ΡΠ΅Ρ Π°Π»Π³ΠΎΡΠΈΡΠΌ Ρ Π΅ΡΠΈΡΠΎΠ²Π°Π½ΠΈΡ (ΠΏΠΎΠ»Π΅ βalgβ), ΡΡΠΎΠ±Ρ ΡΠΊΠ°Π·Π°ΡΡ ΡΠ΅ΡΠ΅Π· ΠΊΠ»ΡΡΠ΅Π²ΠΎΠ΅ ΡΠ»ΠΎΠ²ΠΎ none, ΡΡΠΎ ΡΠ΅Π»ΠΎΡΡΠ½ΠΎΡΡΡ ΡΠΎΠΊΠ΅Π½Π° ΡΠΆΠ΅ ΠΏΡΠΎΠ²Π΅ΡΠ΅Π½Π°. ΠΠ΅ΠΊΠΎΡΠΎΡΡΠ΅ Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠΈ ΡΠ°ΡΡΠΌΠ°ΡΡΠΈΠ²Π°Π»ΠΈ ΡΠΎΠΊΠ΅Π½Ρ, ΠΏΠΎΠ΄ΠΏΠΈΡΠ°Π½Π½ΡΠ΅ Ρ ΠΏΠΎΠΌΠΎΡΡΡ Π°Π»Π³ΠΎΡΠΈΡΠΌΠ° none, ΠΊΠ°ΠΊ Π΄Π΅ΠΉΡΡΠ²ΠΈΡΠ΅Π»ΡΠ½ΡΠΉ ΡΠΎΠΊΠ΅Π½ Ρ ΠΏΡΠΎΠ²Π΅ΡΠ΅Π½Π½ΠΎΠΉ ΠΏΠΎΠ΄ΠΏΠΈΡΡΡ, ΠΏΠΎΡΡΠΎΠΌΡ Π·Π»ΠΎΡΠΌΡΡΠ»Π΅Π½Π½ΠΈΠΊ ΠΌΠΎΠ³ ΠΈΠ·ΠΌΠ΅Π½ΠΈΡΡ ΠΏΠΎΠ»Π΅Π·Π½ΡΡ Π½Π°Π³ΡΡΠ·ΠΊΡ (payload) ΡΠΎΠΊΠ΅Π½Π°, ΠΈ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Π΄ΠΎΠ²Π΅ΡΡΠ»ΠΎ Π±Ρ ΡΠΎΠΊΠ΅Π½Ρ.
ΠΠ»Ρ ΠΏΡΠ΅Π΄ΠΎΡΠ²ΡΠ°ΡΠ΅Π½ΠΈΡ Π°ΡΠ°ΠΊΠΈ Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΎ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΡ JWT, ΠΊΠΎΡΠΎΡΠ°Ρ Π½Π΅ ΠΏΠΎΠ΄Π²Π΅ΡΠΆΠ΅Π½Π° Π΄Π°Π½Π½ΠΎΠΉ ΡΡΠ·Π²ΠΈΠΌΠΎΡΡΠΈ. Π’Π°ΠΊΠΆΠ΅ Π²ΠΎ Π²ΡΠ΅ΠΌΡ ΠΏΡΠΎΠ²Π΅ΡΠΊΠΈ Π²Π°Π»ΠΈΠ΄Π½ΠΎΡΡΠΈ ΡΠΎΠΊΠ΅Π½Π° Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΎ ΡΠ²Π½ΠΎ Π·Π°ΠΏΡΠΎΡΠΈΡΡ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠ΅ ΠΎΠΆΠΈΠ΄Π°Π΅ΠΌΠΎΠ³ΠΎ Π°Π»Π³ΠΎΡΠΈΡΠΌΠ°.
ΠΡΠΈΠΌΠ΅Ρ ΡΠ΅Π°Π»ΠΈΠ·Π°ΡΠΈΠΈ:
// ΠΠ»ΡΡ HMAC Ρ
ΡΠ°Π½ΠΈΡΡΡ ΠΊΠ°ΠΊ String Π² ΠΏΠ°ΠΌΡΡΠΈ JVM
private transient byte[] keyHMAC = ...;
...
// Π‘ΠΎΠ·Π΄Π°Π½ΠΈΠ΅ ΠΊΠΎΠ½ΡΠ΅ΠΊΡΡΠ° Π²Π΅ΡΠΈΡΠΈΠΊΠ°ΡΠΈΠΈ Π΄Π»Ρ Π·Π°ΠΏΡΠΎΡΠ° ΠΊ ΡΠΎΠΊΠ΅Π½Ρ
// Π―Π²Π½ΠΎ ΡΠΊΠ°Π·ΡΠ²Π°Π΅ΡΡΡ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠ΅ HMAC-256 Ρ
Π΅Ρ-Π°Π»Π³ΠΎΡΠΈΡΠΌΠ°
JWTVerifier verifier = JWT.require(Algorithm.HMAC256(keyHMAC)).build();
// ΠΠ΅ΡΠΈΡΠΈΠΊΠ°ΡΠΈΡ ΡΠΎΠΊΠ΅Π½Π°
DecodedJWT decodedToken = verifier.verify(token);
ΠΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠ΅ ΡΠ»Π°Π±ΠΎΠ³ΠΎ ΠΊΠ»ΡΡΠ° ΠΏΡΠΈ ΡΠΎΠ·Π΄Π°Π½ΠΈΠΈ ΡΠΎΠΊΠ΅Π½Π°
ΠΡΠ»ΠΈ ΡΠ΅ΠΊΡΠ΅Ρ, ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΠΌΡΠΉ Π² ΡΠ»ΡΡΠ°Π΅ Π°Π»Π³ΠΎΡΠΈΡΠΌΠ° HMAC-SHA256, Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΡΠΉ Π΄Π»Ρ ΠΏΠΎΠ΄ΠΏΠΈΡΠΈ ΡΠΎΠΊΠ΅Π½Π°, ΡΠ²Π»ΡΠ΅ΡΡΡ ΡΠ»Π°Π±ΡΠΌ, ΡΠΎ ΠΎΠ½ ΠΌΠΎΠΆΠ΅Ρ Π±ΡΡΡ Π²Π·Π»ΠΎΠΌΠ°Π½ (ΠΏΠΎΠ΄ΠΎΠ±ΡΠ°Π½ c ΠΏΠΎΠΌΠΎΡΡΡ Π°ΡΠ°ΠΊΠΈ Π³ΡΡΠ±ΠΎΠΉ ΡΠΈΠ»Ρ). Π ΡΠ΅Π·ΡΠ»ΡΡΠ°ΡΠ΅ Π·Π»ΠΎΡΠΌΡΡΠ»Π΅Π½Π½ΠΈΠΊ ΠΌΠΎΠΆΠ΅Ρ ΠΏΠΎΠ΄Π΄Π΅Π»Π°ΡΡ ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ»ΡΠ½ΡΠΉ Π΄Π΅ΠΉΡΡΠ²ΠΈΡΠ΅Π»ΡΠ½ΡΠΉ ΡΠΎΠΊΠ΅Π½ Ρ ΡΠΎΡΠΊΠΈ Π·ΡΠ΅Π½ΠΈΡ ΠΏΠΎΠ΄ΠΏΠΈΡΠΈ.
ΠΠ»Ρ ΠΏΡΠ΅Π΄ΠΎΡΠ²ΡΠ°ΡΠ΅Π½ΠΈΡ ΡΡΠΎΠΉ ΠΏΡΠΎΠ±Π»Π΅ΠΌΡ Π½Π°Π΄ΠΎ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ ΡΠ»ΠΎΠΆΠ½ΡΠΉ ΡΠ΅ΠΊΡΠ΅ΡΠ½ΡΠΉ ΠΊΠ»ΡΡ: Π±ΡΠΊΠ²Π΅Π½Π½ΠΎ-ΡΠΈΡΡΠΎΠ²ΠΎΠΉ (ΡΠΌΠ΅ΡΠ°Π½Π½ΡΠΉ ΡΠ΅Π³ΠΈΡΡΡ) ΡΠΏΠ΅ΡΠΈΠ°Π»ΡΠ½ΡΠ΅ ΡΠΈΠΌΠ²ΠΎΠ»Ρ.
ΠΠΎΡΠΊΠΎΠ»ΡΠΊΡ ΠΊΠ»ΡΡ Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌ ΡΠΎΠ»ΡΠΊΠΎ Π΄Π»Ρ ΠΊΠΎΠΌΠΏΡΡΡΠ΅ΡΠ½ΡΡ Π²ΡΡΠΈΡΠ»Π΅Π½ΠΈΠΉ, ΡΠ°Π·ΠΌΠ΅Ρ ΡΠ΅ΠΊΡΠ΅ΡΠ½ΠΎΠ³ΠΎ ΠΊΠ»ΡΡΠ° ΠΌΠΎΠΆΠ΅Ρ ΠΏΡΠ΅Π²ΡΡΠ°ΡΡ 50 ΠΏΠΎΠ·ΠΈΡΠΈΠΉ.
ΠΠ°ΠΏΡΠΈΠΌΠ΅Ρ:
A&'/}Z57M(2hNg=;LE?~]YtRMS5(yZ<vcZTA3N-($>2j:ZeX-BGftaVk`)jKP~q?,jk)EMbgt*kW'
ΠΠ»Ρ ΠΎΡΠ΅Π½ΠΊΠΈ ΡΠ»ΠΎΠΆΠ½ΠΎΡΡΠΈ ΡΠ΅ΠΊΡΠ΅ΡΠ½ΠΎΠ³ΠΎ ΠΊΠ»ΡΡΠ°, ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΠΌΠΎΠ³ΠΎ Π΄Π»Ρ Π²Π°ΡΠ΅ΠΉ ΠΏΠΎΠ΄ΠΏΠΈΡΠΈ ΡΠΎΠΊΠ΅Π½Π°, Π²Ρ ΠΌΠΎΠΆΠ΅ΡΠ΅ ΠΏΡΠΈΠΌΠ΅Π½ΠΈΡΡ Π°ΡΠ°ΠΊΡ ΠΏΠΎ ΡΠ»ΠΎΠ²Π°ΡΡ ΠΏΠ°ΡΠΎΠ»Π΅ΠΉ ΠΊ ΡΠΎΠΊΠ΅Π½Ρ Π² ΡΠΎΡΠ΅ΡΠ°Π½ΠΈΠΈ Ρ JWT API.
ΠΠΎΠ³ΡΡ Π²ΠΎΠ·Π½ΠΈΠΊΠ½ΡΡΡ ΠΏΡΠΎΠ±Π»Π΅ΠΌΡ Ρ ΠΌΠ°ΡΡΡΠ°Π±ΠΈΡΡΠ΅ΠΌΠΎΡΡΡΡ
ΠΠ°ΠΊ ΡΠΆΠ΅ ΠΎΠ±ΡΡΡΠ½ΡΠ»ΠΎΡΡ, ΡΠ΅ΡΠ²Π΅Ρ ΠΎΡΠ²Π΅ΡΠ°Π΅Ρ Π·Π° ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΡ ΡΠ°ΠΉΠ»ΠΎΠ² cookie, ΠΈ Π½Π°ΠΌ Π½ΡΠΆΠ½ΠΎ ΡΠΎΡ ΡΠ°Π½ΠΈΡΡ ΡΠ΅Π°Π½ΡΡ Π² Π±Π°Π·Π΅ Π΄Π°Π½Π½ΡΡ Π΄Π»Ρ ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Ρ.
Π₯ΠΎΡΡ ΡΡΡΠ΅ΡΡΠ²ΡΡΡ Ρ
ΠΎΡΠΎΡΠΎ
Π·Π°ΡΠ΅ΠΊΠΎΠΌΠ΅Π½Π΄ΠΎΠ²Π°Π²ΡΠΈΠ΅ ΡΠ΅Π±Ρ ΡΠΏΠΎΡΠΎΠ±Ρ ΡΠΏΡΠ°Π²Π»Π΅Π½ΠΈΡ ΠΌΠ°ΡΡΡΠ°Π±ΠΈΡΡΠ΅ΠΌΠΎΡΡΡΡ (Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ,
ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠ΅ Π΄Π»Ρ Ρ
ΡΠ°Π½Π΅Π½ΠΈΡ ΡΠ΅Π°Π½ΡΠΎΠ² Π‘Π£ΠΠ Π½Π°ΠΏΠΎΠ΄ΠΎΠ±ΠΈΠ΅ Redis), ΡΡΠΎ Π²ΡΠ΅ ΡΠ°Π²Π½ΠΎ
Π΄ΠΎΠ±Π°Π²Π»ΡΠ΅Ρ ΡΠ»ΠΎΠΆΠ½ΠΎΡΡΠΈ. ΠΠΎ ΠΌΠ΅ΡΠ΅ ΡΠΎΡΡΠ° ΠΊΠΎΠ»ΠΈΡΠ΅ΡΡΠ²Π° ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Π΅ΠΉ, ΠΌΠΎΠ³ΡΡ Π²ΠΎΠ·Π½ΠΈΠΊΠ½ΡΡΡ
ΠΏΡΠΎΠ±Π»Π΅ΠΌΡ Ρ ΠΌΠ°ΡΡΡΠ°Π±ΠΈΡΠΎΠ²Π°Π½ΠΈΠ΅ΠΌ ΠΈ ΡΠΏΡΠ°Π²Π»Π΅Π½ΠΈΠ΅ΠΌ ΡΠ΅Π°Π½ΡΠ°ΠΌΠΈ.
ΠΠ΅ ΠΏΠΎΠ΄Ρ ΠΎΠ΄ΠΈΡ Π΄Π»Ρ api
ΠΡΠ»ΠΈ Π²Ρ ΡΠΎΠ·Π΄Π°Π΅ΡΠ΅ API Π΄Π»Ρ ΠΏΡΠ΅Π΄ΠΎΡΡΠ°Π²Π»Π΅Π½ΠΈΡ ΡΡΠ»ΡΠ³ ΠΊΠ»ΠΈΠ΅Π½ΡΠ°ΠΌ, cookie β ΡΡΠΎ Π½Π΅ Π»ΡΡΡΠΈΠΉ Π²Π°ΡΠΈΠ°Π½Ρ. ΠΡΠ»ΠΈ ΠΊΠ»ΠΈΠ΅Π½Ρ Π½Π΅ ΡΠ²Π»ΡΠ΅ΡΡΡ Π±ΡΠ°ΡΠ·Π΅ΡΠΎΠΌ, ΡΡΠΎ ΡΡΠ»ΠΎΠΆΠ½ΠΈΡ ΡΠ°Π±ΠΎΡΡ.
ΠΠ°ΠΏΡΠΈΠΌΠ΅Ρ, Π΅ΡΠ»ΠΈ Π²Ρ
ΡΠ°Π·ΡΠ°Π±Π°ΡΡΠ²Π°Π΅ΡΠ΅ ΠΌΠΎΠ±ΠΈΠ»ΡΠ½ΠΎΠ΅ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅, Π½Π°Π»ΠΈΡΠΈΠ΅ ΡΠ°ΠΉΠ»ΠΎΠ² cookie ΡΡΠ»ΠΎΠΆΠ½ΠΈΡ ΡΠΏΡΠ°Π²Π»Π΅Π½ΠΈΠ΅
ΡΠ°ΠΉΠ»Π°ΠΌΠΈ ΠΏΠΎ ΡΡΠ°Π²Π½Π΅Π½ΠΈΡ Ρ ΡΠΎΠΊΠ΅Π½ΠΎΠΌ.
ΠΠ±ΡΡΠ½ΠΎ ΡΠ°Π±ΠΎΡΠ°ΡΡ Π² ΠΎΠ΄Π½ΠΎΠΌ Π΄ΠΎΠΌΠ΅Π½Π΅
Π€Π°ΠΉΠ»Ρ cookie ΡΠ°Π±ΠΎΡΠ°ΡΡ ΡΠΎΠ»ΡΠΊΠΎ Π² ΠΎΠ΄Π½ΠΎΠΌ Π΄ΠΎΠΌΠ΅Π½Π΅, Π΅ΡΠ»ΠΈ Π²Ρ ΡΠΏΠ΅ΡΠΈΠ°Π»ΡΠ½ΠΎ ΠΈΡ Π½Π΅ Π½Π°ΡΡΡΠΎΠΈΠ»ΠΈ.
Π₯ΠΎΡΡ ΡΠΎ ΡΡΠΎΡΠΎΠ½Ρ ΡΡΠΎ
Π²ΡΠ³Π»ΡΠ΄ΠΈΡ ΠΊΠ°ΠΊ ΠΎΠ³ΡΠ°Π½ΠΈΡΠ΅Π½ΠΈΠ΅, Π½ΠΎ ΡΡΠΎ ΠΎΠ΄Π½Π° ΠΈΠ· ΡΠ°ΠΌΡΡ
ΡΠΈΠ»ΡΠ½ΡΡ
ΡΡΠ½ΠΊΡΠΈΠΉ Π΄Π»Ρ ΠΎΠ±Π΅ΡΠΏΠ΅ΡΠ΅Π½ΠΈΡ
Π΅Π΄ΠΈΠ½ΠΎΠ³ΠΎ ΠΈΡΡΠΎΡΠ½ΠΈΠΊΠ°.
ΠΡΠ»ΠΈ Π²Π°Ρ ΡΡΠΎΠ½ΡΠ΅Π½Π΄
ΠΈ Π±ΡΠΊΠ΅Π½Π΄ Π»Π΅ΠΆΠ°Ρ Π² ΡΠ°Π·Π½ΡΡ
Π΄ΠΎΠΌΠ΅Π½Π°Ρ
ΠΈΠ»ΠΈ ΠΏΠΎΠ΄Π΄ΠΎΠΌΠ΅Π½Π°Ρ
, Π½Π΅ΠΎΠ±Ρ
ΠΎΠ΄ΠΈΠΌΠΎ ΡΠ²Π½ΠΎ ΡΠΊΠ°Π·Π°ΡΡ ΡΡΠΎ
Π² ΡΠ°ΠΉΠ»Π΅ cookie Π² Π±Π΅Π»ΠΎΠΌ ΡΠΏΠΈΡΠΊΠ΅. Π ΠΏΡΠΎΡΠΈΠ²Π½ΠΎΠΌ ΡΠ»ΡΡΠ°Π΅ Π±ΡΠ°ΡΠ·Π΅Ρ Π½Π΅ ΠΎΡΠΏΡΠ°Π²ΠΈΡ ΠΊΡΠΊΠΈ Π²ΠΌΠ΅ΡΡΠ΅
Ρ Π·Π°ΠΏΡΠΎΡΠΎΠΌ.
ΠΠ°ΡΠ° ΡΠ»ΠΎΠ² ΠΎ Π±Π΅Π·ΠΎΠΏΠ°ΡΠ½ΠΎΡΡΠΈ Π΄Π°Π½Π½ΡΡ
Π’Π΅ΠΏΠ΅ΡΡ, ΠΊΠΎΠ³Π΄Π° Π²Ρ ΡΠ°Π·ΠΎΠ±ΡΠ°Π»ΠΈΡΡ Π² ΡΡΡΡΠΎΠΉΡΡΠ²Π΅ ΠΈ ΡΠ°Π±ΠΎΡΠ΅ JSON Π²Π΅Π±-ΡΠΎΠΊΠ΅Π½ΠΎΠ², Π²ΠΎΠ·Π½ΠΈΠΊΠ°Π΅Ρ Π΅ΡΡΠ΅ΡΡΠ²Π΅Π½Π½ΡΠΉ Π²ΠΎΠΏΡΠΎΡ β Π·Π°ΡΠΈΡΠ΅Π½Ρ Π»ΠΈ ΠΏΠ΅ΡΠ΅Π΄Π°Π²Π°Π΅ΠΌΡΠ΅ Π΄Π°Π½Π½ΡΠ΅?
ΠΡ Π²ΠΈΠ΄Π΅Π»ΠΈ, ΡΡΠΎ ΡΠΎΠΊΠ΅Π½ ΠΊΠΎΠ΄ΠΈΡΡΠ΅ΡΡΡ ΠΈ ΠΏΠΎΠ΄ΠΏΠΈΡΡΠ²Π°Π΅ΡΡΡ, Π½ΠΎ β Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅! β Π½Π΅ ΡΠΈΡΡΡΠ΅ΡΡΡ! (Π² ΡΠ΅ΠΌ ΡΠ°Π·Π½ΠΈΡΠ° ΠΌΠ΅ΠΆΠ΄Ρ ΠΊΠΎΠ΄ΠΈΡΠΎΠ²Π°Π½ΠΈΠ΅ΠΌ ΠΈ ΡΠΈΡΡΠΎΠ²Π°Π½ΠΈΠ΅ΠΌ?) Π’ΠΎ Π΅ΡΡΡ ΡΡΠ° ΠΎΠ±ΡΠ°Π±ΠΎΡΠΊΠ° Π½Π΅ ΠΎΠ±Π΅ΡΠΏΠ΅ΡΠΈΠ²Π°Π΅Ρ Π±Π΅Π·ΠΎΠΏΠ°ΡΠ½ΠΎΡΡΡ Π΄Π°Π½Π½ΡΡ . ΠΠ΅Ρ Π½ΠΈΠΊΠ°ΠΊΠΎΠΉ Π³Π°ΡΠ°Π½ΡΠΈΠΈ ΡΠΎΡ ΡΠ°Π½Π½ΠΎΡΡΠΈ, ΠΏΠΎΡΡΠΎΠΌΡ Π½Π΅ ΡΠ»Π΅Π΄ΡΠ΅Ρ ΠΏΠ΅ΡΠ΅Π΄Π°Π²Π°ΡΡ Π² ΡΠΎΠΊΠ΅Π½Π°Ρ ΡΡΠΎ-ΡΠΎ ΠΊΠΎΠ½ΡΠΈΠ΄Π΅Π½ΡΠΈΠ°Π»ΡΠ½ΠΎΠ΅.
ΠΠ΅ΡΠ΅Ρ Π²Π°Ρ ΡΠΎΠΊΠ΅Π½ΠΎΠ²
ΠΡΠ°ΠΊΠ° ΠΏΡΠΎΠΈΡΡ ΠΎΠ΄ΠΈΡ, ΠΊΠΎΠ³Π΄Π° ΡΠΎΠΊΠ΅Π½ Π±ΡΠ» ΠΏΠ΅ΡΠ΅Ρ Π²Π°ΡΠ΅Π½ ΠΈΠ»ΠΈ ΡΠΊΡΠ°Π΄Π΅Π½ Π·Π»ΠΎΡΠΌΡΡΠ»Π΅Π½Π½ΠΈΠΊΠΎΠΌ ΠΈ ΠΎΠ½ ΠΏΡΠΈΠΌΠ΅Π½ΡΠ΅Ρ Π΅Π³ΠΎ Π΄Π»Ρ ΠΏΠΎΠ»ΡΡΠ΅Π½ΠΈΡ Π΄ΠΎΡΡΡΠΏΠ° ΠΊ ΡΠΈΡΡΠ΅ΠΌΠ΅, ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΡ ΠΈΠ΄Π΅Π½ΡΠΈΡΠΈΠΊΠ°ΡΠΈΠΎΠ½Π½ΡΠ΅ Π΄Π°Π½Π½ΡΠ΅ ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½Π½ΠΎΠ³ΠΎ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Ρ.
ΠΠ°ΡΠΈΡΠ° Π·Π°ΠΊΠ»ΡΡΠ°Π΅ΡΡΡ Π² Π΄ΠΎΠ±Π°Π²Π»Π΅Π½ΠΈΠΈ Β«ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»ΡΡΠΊΠΎΠ³ΠΎ ΠΊΠΎΠ½ΡΠ΅ΠΊΡΡΠ°Β» Π² ΡΠΎΠΊΠ΅Π½. ΠΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»ΡΡΠΊΠΈΠΉ ΠΊΠΎΠ½ΡΠ΅ΠΊΡΡ Π±ΡΠ΄Π΅Ρ ΡΠΎΡΡΠΎΡΡΡ ΠΈΠ· ΡΠ»Π΅Π΄ΡΡΡΠ΅ΠΉ ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΠΈ:
ΠΠΎΠ΄ΠΏΠΈΡΡΠ²Π°Π΅ΠΌΡΡ ΠΏΠΎΠ΄ Π΄Π°Π½Π½ΡΠΌΠΈ
Π Π»ΡΠ΄ΡΠΌ, ΠΈ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠ°ΠΌ Π½ΡΠΆΠ½ΠΎ Π·Π½Π°ΡΡ, ΡΡΠΎ Π΄Π°Π½Π½ΡΠ΅ Π±ΡΠ»ΠΈ ΡΠΎΠ·Π΄Π°Π½Ρ Π΄ΠΎΠ²Π΅ΡΠ΅Π½Π½ΡΠΌ ΠΈΡΡΠΎΡΠ½ΠΈΠΊΠΎΠΌ ΠΈ ΠΎΡΡΠ°Π»ΠΈΡΡ Π½Π΅ΠΈΠ·ΠΌΠ΅Π½Π½ΡΠΌΠΈ. ΠΠ»Ρ ΡΡΠΎΠ³ΠΎ Π±ΡΠ»Π° ΠΏΡΠΈΠ΄ΡΠΌΠ°Π½Π° ΡΠ΅Ρ Π½ΠΎΠ»ΠΎΠ³ΠΈΡ Π³Π΅Π½Π΅ΡΠ°ΡΠΈΠΈ ΡΠΏΠ΅ΡΠΈΠ°Π»ΡΠ½ΠΎΠ³ΠΎ Ρ Π΅ΡΠ° (ΠΏΠΎΠ΄ΠΏΠΈΡΠΈ), ΠΊΠΎΡΠΎΡΡΠΉ ΠΏΠΎΠ΄ΡΠ²Π΅ΡΠΆΠ΄Π°Π΅Ρ ΡΠ΅Π»ΠΎΡΡΠ½ΠΎΡΡΡ ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΠΈ ΠΈ Π΄ΠΎΡΡΠΎΠ²Π΅ΡΠ½ΠΎΡΡΡ Π΅Π΅ ΠΎΡΠΏΡΠ°Π²ΠΈΡΠ΅Π»Ρ/ΡΠΎΠ·Π΄Π°ΡΠ΅Π»Ρ. ΠΠ»Ρ ΡΠΎΠ·Π΄Π°Π½ΠΈΡ ΡΡΠΎΠΉ ΡΠ°ΠΌΠΎΠΉ ΠΏΠΎΠ΄ΠΏΠΈΡΠΈ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΡΡΡ ΡΡ Π΅ΠΌΠ° ΠΈΠ· Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΈΡ ΡΠ°Π³ΠΎΠ², ΡΠ΅Π»Ρ ΠΊΠΎΡΠΎΡΡΡ β Π·Π°ΡΠΈΡΠΈΡΡ Π΄Π°Π½Π½ΡΠ΅ ΠΎΡ ΠΏΠΎΠ΄Π΄Π΅Π»ΠΊΠΈ.
ΠΠ»Π³ΠΎΡΠΈΡΠΌ Ρ Π΅ΡΠΈΡΠΎΠ²Π°Π½ΠΈΡ ΠΌΠΎΠΆΠ΅Ρ ΠΌΠ΅Π½ΡΡΡΡΡ, Π½ΠΎ ΡΡΡΡ ΡΡΠΎΠ³ΠΎ ΠΏΠΎΠ΄Ρ ΠΎΠ΄Π° ΠΏΡΠΎΡΡΠ° ΠΈ Π½Π΅ΠΈΠ·ΠΌΠ΅Π½Π½Π°: Π΄Π»Ρ ΠΏΠΎΠ΄ΡΠ²Π΅ΡΠΆΠ΄Π΅Π½ΠΈΡ ΡΠ΅Π»ΠΎΡΡΠ½ΠΎΡΡΠΈ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΡ Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΎ ΡΠ½ΠΎΠ²Π° Π½Π°ΠΉΡΠΈ ΠΏΠΎΠ΄ΠΏΠΈΡΡ Π·Π°ΡΠΈΡΠ°Π΅ΠΌΡΡ Π΄Π°Π½Π½ΡΡ ΠΈ ΡΡΠ°Π²Π½ΠΈΡΡ Π΅Π΅ Ρ ΠΈΠΌΠ΅ΡΡΠ΅ΠΉΡΡ ΠΏΠΎΠ΄ΠΏΠΈΡΡΡ.
ΠΠΎΠ΄ΠΏΠΈΡΡ
ΠΠΎΠ³Π΄Π° Ρ Π½Π°Ρ Π΅ΡΡΡ Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΎΠΊ ΠΈ ΠΏΠΎΠ»Π΅Π·Π½Π°Ρ Π½Π°Π³ΡΡΠ·ΠΊΠ°, ΠΌΠΎΠΆΠ½ΠΎ Π²ΡΡΠΈΡΠ»ΠΈΡΡ ΠΏΠΎΠ΄ΠΏΠΈΡΡ.
ΠΠ΅ΡΡΡΡΡ Π·Π°ΠΊΠΎΠ΄ΠΈΡΠΎΠ²Π°Π½Π½ΡΠ΅ Π² base64: Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΎΠΊ ΠΈ ΠΏΠΎΠ»Π΅Π·Π½Π°Ρ Π½Π°Π³ΡΡΠ·ΠΊΠ°, ΠΎΠ½ΠΈ ΠΎΠ±ΡΠ΅Π΄ΠΈΠ½ΡΡΡΡΡ Π² ΡΡΡΠΎΠΊΡ ΡΠ΅ΡΠ΅Π· ΡΠΎΡΠΊΡ. ΠΠ°ΡΠ΅ΠΌ ΡΡΠ° ΡΡΡΠΎΠΊΠ° ΠΈ ΡΠ΅ΠΊΡΠ΅ΡΠ½ΡΠΉ ΠΊΠ»ΡΡ ΠΏΠΎΡΡΡΠΏΠ°Π΅Ρ Π½Π° Π²Ρ ΠΎΠ΄ Π°Π»Π³ΠΎΡΠΈΡΠΌΠ° ΡΠΈΡΡΠΎΠ²Π°Π½ΠΈΡ, ΡΠΊΠ°Π·Π°Π½Π½ΠΎΠ³ΠΎ Π² Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΊΠ΅ (ΠΊΠ»ΡΡ Β«algΒ»). ΠΠ»ΡΡΠΎΠΌ ΠΌΠΎΠΆΠ΅Ρ Π±ΡΡΡ Π»ΡΠ±Π°Ρ ΡΡΡΠΎΠΊΠ°. ΠΠΎΠ»Π΅Π΅ Π΄Π»ΠΈΠ½Π½ΡΠ΅ ΡΡΡΠΎΠΊΠΈ Π±ΡΠ΄ΡΡ Π½Π°ΠΈΠ±ΠΎΠ»Π΅Π΅ ΠΏΡΠ΅Π΄ΠΏΠΎΡΡΠΈΡΠ΅Π»ΡΠ½Π΅Π΅, ΠΏΠΎΡΠΊΠΎΠ»ΡΠΊΡ ΠΏΠΎΡΡΠ΅Π±ΡΠ΅ΡΡΡ Π±ΠΎΠ»ΡΡΠ΅ Π²ΡΠ΅ΠΌΠ΅Π½ΠΈ Π½Π° ΠΏΠΎΠ΄Π±ΠΎΡ.
ΠΠΎΠ΄Ρ ΠΎΠ΄ΠΈΡ Π΄Π»Ρ Ρ ΡΠ°Π½Π΅Π½ΠΈΡ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡΠ΅Π»ΡΠ½ΡΡ Π΄Π°Π½Π½ΡΡ
ΠΠΎΡΠΊΠΎΠ»ΡΠΊΡ ΡΡΠΎΡ ΠΏΠΎΠ΄Ρ ΠΎΠ΄ ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΈΠ²Π°Π΅Ρ ΠΎΡΠ΄Π΅Π»ΡΠ½ΡΠ΅ ΡΠ΅ΡΡΠΈΠΈ Π΄Π»Ρ ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Ρ, ΠΌΡ ΠΌΠΎΠΆΠ΅ΠΌ Ρ ΡΠ°Π½ΠΈΡΡ ΠΏΡΠΈΠΊΡΠ΅ΠΏΠ»Π΅Π½Π½ΡΠ΅ ΠΊ Π½ΠΈΠΌ Π΄Π°Π½Π½ΡΠ΅.
Π‘ ΠΏΠΎΠΌΠΎΡΡΡ ΡΠ°ΠΉΠ»ΠΎΠ² cookie ΠΈ
ΡΠ΅ΡΡΠΈΠΉ ΠΌΠΎΠΆΠ½ΠΎ Ρ
ΡΠ°Π½ΠΈΡΡ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡΠ΅Π»ΡΠ½ΡΠ΅ Π΄Π°Π½Π½ΡΠ΅ ΠΏΠ΅ΡΡΠΎΠ½Π°Π»ΠΈΠ·Π°ΡΠΈΠΈ, ΠΊΠΎΠ½ΡΡΠΎΠ»Ρ Π΄ΠΎΡΡΡΠΏΠ° ΠΈ ΡΠ°ΠΌΠΈ ΡΠ΅ΡΡΠΈΠΈ β ΡΡΠΎ ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ΅Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ ΠΈΡ
Π΄Π»Ρ ΠΏΠΎΡΠ»Π΅Π΄ΡΡΡΠΈΡ
Π·Π°ΠΏΡΠΎΡΠΎΠ².
ΠΡΠ΅ ΡΡΠΈ ΠΌΠ°Π½ΠΈΠΏΡΠ»ΡΡΠΈΠΈ ΠΌΠΎΠΆΠ½ΠΎ ΠΏΡΠΎΠ²Π΅ΡΡΠΈ ΠΈ Ρ ΠΏΠΎΠΌΠΎΡΡΡ ΡΠΎΠΊΠ΅Π½ΠΎΠ². ΠΠ°ΠΏΡΠΈΠΌΠ΅Ρ, ΡΠΎΠΊΠ΅Π½Ρ JWT ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡΡ Ρ ΡΠ°Π½ΠΈΡΡ Claim-ΠΎΠ±ΡΠ΅ΠΊΡΡ. ΠΠΎΡΠΊΠΎΠ»ΡΠΊΡ ΡΡΠΎ ΡΠ²Π΅Π»ΠΈΡΠΈΡ ΡΠ°Π·ΠΌΠ΅Ρ ΡΠΎΠΊΠ΅Π½Π°, ΡΠΎΡ ΡΠ°Π½Π΅Π½ΠΈΠ΅ Π±ΠΎΠ»ΡΡΠ΅Π³ΠΎ ΠΈΡ ΠΊΠΎΠ»ΠΈΡΠ΅ΡΡΠ²Π° ΠΏΠΎΠ²Π»ΠΈΡΠ΅Ρ Π½Π° Π½Π°Π³ΡΡΠ·ΠΊΡ ΡΠ΅ΡΠΈ.
ΠΡΠΎ Π½Π΅ ΠΈΠΌΠ΅Π΅Ρ ΡΠΌΡΡΠ»Π°, Π΅ΡΠ»ΠΈ
ΡΠ΅ΡΡ ΠΈΠ΄Π΅Ρ ΠΎΠ± ΠΎΠ΄Π½ΠΎΠΌ Π·Π°ΠΏΡΠΎΡΠ΅, Π½ΠΎ ΠΏΡΠ΅ΠΈΠΌΡΡΠ΅ΡΡΠ²Π° ΡΡΠ°Π½ΠΎΠ²ΡΡΡΡ Π·Π°ΠΌΠ΅ΡΠ½Ρ, ΠΊΠΎΠ³Π΄Π° Π²ΡΠ΅
Π°Π³ΡΠ΅Π³ΠΈΡΡΠ΅ΡΡΡ ΠΈ ΠΌΠ°ΡΡΡΠ°Π±ΠΈΡΡΠ΅ΡΡΡ.
ΠΠΎΠ»Π΅Π·Π½Π°Ρ Π½Π°Π³ΡΡΠ·ΠΊΠ°
Π ΠΏΠΎΠ»Π΅Π·Π½ΠΎΠΉ Π½Π°Π³ΡΡΠ·ΠΊΠ΅ Ρ ΡΠ°Π½ΠΈΡΡΡ Π»ΡΠ±Π°Ρ ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΡ, ΠΊΠΎΡΠΎΡΡΡ Π½ΡΠΆΠ½ΠΎ ΠΏΡΠΎΠ²Π΅ΡΠΈΡΡ. ΠΠ°ΠΆΠ΄ΡΠΉ ΠΊΠ»ΡΡ Π² ΠΏΠΎΠ»Π΅Π·Π½ΠΎΠΉ Π½Π°Π³ΡΡΠ·ΠΊΠ΅ ΠΈΠ·Π²Π΅ΡΡΠ΅Π½ ΠΊΠ°ΠΊ Β«Π·Π°ΡΠ²Π»Π΅Π½ΠΈΠ΅Β». Π ΠΏΡΠΈΠΌΠ΅ΡΡ, ΡΠ°ΡΡΠΌΠΎΡΡΠΈΠΌ ΡΠΎΡΠΈΠ°Π»ΡΠ½ΡΡ ΡΠ΅ΡΡ, Π² ΠΊΠΎΡΠΎΡΠΎΠΉ ΠΏΡΠΈΡΠΎΠ΅Π΄ΠΈΠ½ΠΈΡΡΡΡ ΠΊ ΡΠΎΠΎΠ±ΡΠ΅ΡΡΠ²Ρ ΠΌΠΎΠΆΠ½ΠΎ ΡΠΎΠ»ΡΠΊΠΎ ΠΏΠΎ ΠΏΡΠΈΠ³Π»Π°ΡΠ΅Π½ΠΈΡ. ΠΠΎΠ³Π΄Π° ΠΌΡ Ρ ΠΎΡΠΈΠΌ ΠΏΡΠΈΠ³Π»Π°ΡΠΈΡΡ ΠΊΠΎΠ³ΠΎ-ΡΠΎ Π² ΡΠΎΠΎΠ±ΡΠ΅ΡΡΠ²ΠΎ, ΠΌΡ ΠΎΡΠΏΡΠ°Π²Π»ΡΠ΅ΠΌ Π΅ΠΌΡ ΠΏΠΈΡΡΠΌΠΎ Ρ ΠΏΡΠΈΠ³Π»Π°ΡΠ΅Π½ΠΈΠ΅ΠΌ.
{
"email": "[email protected]"
}
ΠΠ»ΡΡΠΈ Π² ΠΏΠΎΠ»Π΅Π·Π½ΠΎΠΉ Π½Π°Π³ΡΡΠ·ΠΊΠ΅ ΠΌΠΎΠ³ΡΡ Π±ΡΡΡ ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ»ΡΠ½ΡΠΌΠΈ. Π’Π΅ΠΌ Π½Π΅ ΠΌΠ΅Π½Π΅Π΅, Π΅ΡΡΡ Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΎ Π·Π°ΡΠ΅Π·Π΅ΡΠ²ΠΈΡΠΎΠ²Π°Π½Π½ΡΡ , ΠΊΠΎΡΠΎΡΡΠ΅ Π½ΡΠΆΠ½ΠΎ Π·Π½Π°ΡΡ:
JWT ΡΡΠ΅Π±ΡΠ΅Ρ, ΡΡΠΎΠ±Ρ Π²ΠΎ Π²ΡΠ΅Ρ Π΅Π³ΠΎ ΡΠ΅Π°Π»ΠΈΠ·Π°ΡΠΈΡΡ ΠΌΠ°ΡΠΊΠ΅ΡΡ Ρ ΠΈΡΡΠ΅ΠΊΡΠΈΠΌ ΡΡΠΎΠΊΠΎΠΌ Π΄Π΅ΠΉΡΡΠ²ΠΈΡ ΠΎΡΠΊΠ»ΠΎΠ½ΡΠ»ΠΈΡΡ. Π
ΠΌΠΎΠ³ΡΡ Π±ΡΡΡ Π΄ΠΎΠ±Π°Π²Π»Π΅Π½Ρ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡΠ΅Π»ΡΠ½ΡΠ΅ ΠΊΠ»ΡΡΠΈ, Π΄Π»Ρ ΡΡΠ΅ΡΠ° ΡΠ°ΡΡΠΈΠ½Ρ ΡΠΎΠ½ΠΈΠ·Π°ΡΠΈΠΈ Π²ΡΠ΅ΠΌΠ΅Π½ΠΈ. exp ΠΊΠ»ΡΡ Π΄ΠΎΠ»ΠΆΠ΅Π½ Π±ΡΡΡ ΠΎΡΠΌΠ΅ΡΠΊΠΎΠΉ Π²ΡΠ΅ΠΌΠ΅Π½ΠΈ Π² unix ΡΠΎΡΠΌΠ°ΡΠ΅.
ΠΠ°ΠΆΠ½ΠΎ ΠΏΠΎΠ½ΠΈΠΌΠ°ΡΡ, ΡΡΠΎ ΠΏΠΎΠ»Π΅Π·Π½Π°Ρ Π½Π°Π³ΡΡΠ·ΠΊΠ° Π½Π΅ ΠΏΠ΅ΡΠ΅Π΄Π°Π΅ΡΡΡ Π² Π·Π°ΡΠΈΡΡΠΎΠ²Π°Π½Π½ΠΎΠΌ Π²ΠΈΠ΄Π΅ (Ρ ΠΎΡΡ, ΠΌΠ°ΡΠΊΠ΅ΡΡ ΠΌΠΎΠ³ΡΡ Π±ΡΡΡ Π²Π»ΠΎΠΆΠ΅Π½Π½ΡΠΌΠΈ ΠΈ ΡΠΎΠ³Π΄Π° Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠ΅ΡΠ΅Π΄Π°Π²Π°ΡΡ Π·Π°ΡΠΈΡΡΠΎΠ²Π°Π½Π½ΡΠ΅ Π΄Π°Π½Π½ΡΠ΅). ΠΠΎΡΡΠΎΠΌΡ Π² Π½Π΅ΠΉ Π½Π΅Π»ΡΠ·Ρ Ρ ΡΠ°Π½ΠΈΡΡ Π»ΡΠ±ΡΡ ΡΠ΅ΠΊΡΠ΅ΡΠ½ΡΡ ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΡ. ΠΠ°ΠΏΡΠΈΠΌΠ΅Ρ, ΠΏΠ°ΡΠΎΠ»ΠΈ, Π½ΠΎΠΌΠ΅ΡΠ° ΡΠΎΡΠΈΠ°Π»ΡΠ½ΠΎΠ³ΠΎ ΡΡΡΠ°Ρ ΠΎΠ²Π°Π½ΠΈΡ ΠΈ Ρ.Π΄.
ΠΠ°ΠΊ ΠΈ Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΎΠΊ, ΠΏΠΎΠ»Π΅Π·Π½Π°Ρ Π½Π°Π³ΡΡΠ·ΠΊΠ° ΠΊΠΎΠ΄ΠΈΡΡΠ΅ΡΡΡ Π² base64.
ΠΠΎΡΡΡΠΊΡΠΈΠΏΡΡΠΌ
Π ΡΠ²ΠΎΠ΅ΠΉ ΡΠ΅Π°Π»ΠΈΠ·Π°ΡΠΈΠΈ Refresh ΡΠΎΠΊΠ΅Π½Π° ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π» ΠΎΠ±ΡΡΡ Π΄Π»ΠΈΠ½Ρ 24 Π·Π½Π°ΠΊΠ°. ΠΠ΅ΡΠ²ΡΠ΅ 6 Π·Π½Π°ΠΊΠΎΠ² – ΡΡΠΎ Π΄Π°ΡΠ° Π΅Π³ΠΎ “ΠΏΡΠΎΡΡΡ Π°Π½ΠΈΡ”, ΡΠ»Π΅Π΄ΡΡΡΠΈΠ΅ 12 Π·Π½Π°ΠΊΠΎΠ² – ΡΠ»ΡΡΠ°ΠΉΠ½ΠΎ ΡΠ³Π΅Π½Π΅ΡΠΈΡΠΎΠ²Π°Π½Π½ΡΠ΅ Π΄Π°Π½Π½ΡΠ΅. Π Π² ΠΊΠΎΠ½ΡΠ΅ 6 Π·Π½Π°ΠΊΠΎΠ² – ΡΡΠΎ ΡΠ°ΡΡΡ Access ΡΠΎΠΊΠ΅Π½Π° ΠΏΠΎΡΠ»Π΅Π΄Π½Π΅ΠΉ ΡΠ°ΡΡΠΈ ΡΠΈΠ³Π½Π°ΡΡΡΡ.
ΠΠ°ΡΡ ΠΏΡΠΎΡΡΡ Π°Π½ΠΈΡ Π²Π½Π΅Π΄ΡΠΈΠ» ΠΏΡΡΠΌ Π² ΡΠΎΠΊΠ΅Π½ Ρ ΡΠΎΠΉ ΡΠ΅Π»ΡΡ, ΡΡΠΎΠ±Ρ Π½Π΅ Ρ ΡΠ°Π½ΠΈΡΡ ΡΡΡ ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΡ Π³Π΄Π΅-ΡΠΎ Π² Π΄ΡΡΠ³ΠΎΠΌ ΠΌΠ΅ΡΡΠ΅, Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ, Π² Π±Π°Π·Π΅ Π΄Π°Π½Π½ΡΡ .
ΠΠ°ΡΠ° ΡΠΎΠ΄Π΅ΡΠΆΠΈΡ Π³ΠΎΠ΄, ΠΌΠ΅ΡΡΡ, Π΄Π΅Π½Ρ, ΡΠ°Ρ ΠΈ ΠΌΠΈΠ½ΡΡΡ. Π₯ΡΠ°Π½ΠΈΡΡΡ Π² ASCII
ΠΠΎΠ΄ΠΈΡΠΎΠ²Π°Π½ΠΈΠ΅ Π΄Π°ΡΡ Π½Π° Golang:
ΠΡΡ ΡΠ΅Π°Π»ΠΈΠ·Π°ΡΠΈΡ Π½Π° Go ΠΌΠΎΠΆΠ½ΠΎ ΠΈΠ·ΡΡΠΈΡΡ Π½Π° Github-Π΅
ΠΡΠ΅Π΄ΡΡΠ°Π²Π»Π΅Π½ΠΈΡ
Π‘ ΡΠ΅ΡΠΈΠ°Π»ΠΈΠ·Π°ΡΠΎΡΠ°ΠΌΠΈ ΡΠ°Π·ΠΎΠ±ΡΠ°Π»ΠΈΡΡ, Π΄Π°Π²Π°ΠΉΡΠ΅ ΡΠ΅ΠΏΠ΅ΡΡ ΠΏΠ΅ΡΠ΅ΠΉΠ΄Π΅ΠΌ ΠΊ ΠΏΡΠ΅Π΄ΡΡΠ°Π²Π»Π΅Π½ΠΈΡΠΌ.
ΠΠ»Ρ Π½Π°ΡΠΈΡ ΡΠ΅Π»Π΅ΠΉ Π½ΡΠΆΠ½ΠΎ ΡΠΎΠ»ΡΠΊΠΎ ΠΎΠ΄Π½ΠΎ ΠΏΡΠ΅Π΄ΡΡΠ°Π²Π»Π΅Π½ΠΈΠ΅, ΠΊΠΎΡΠΎΡΠΎΠ΅ Π±ΡΠ΄Π΅Ρ Π²ΠΎΠ·Π²ΡΠ°ΡΠ°ΡΡ ΡΠΏΠΈΡΠΎΠΊ ΠΎΠ±ΡΠ΅ΠΊΡΠΎΠ² ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Ρ.
Django REST Framework ΠΏΡΠ΅Π΄Π»Π°Π³Π°Π΅Ρ ΡΠ΅Π»ΡΠΉ ΡΡΠ΄ ΠΏΡΠ΅Π΄ΡΡΠ°Π²Π»Π΅Π½ΠΈΠΉ, ΠΊΠΎΡΠΎΡΡΠ΅ Π²ΡΠΏΠΎΠ»Π½ΡΡΡ ΡΠ°Π·Π»ΠΈΡΠ½ΡΠ΅ ΡΡΠ½ΠΊΡΠΈΠΈ, Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ ΠΏΡΠ΅Π΄ΡΡΠ°Π²Π»Π΅Π½ΠΈΠ΅ ΡΠΏΠΈΡΠΊΠ° ΠΎΠ±ΡΠ΅ΠΊΡΠΎΠ² ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΡΠΈΠΏΠ°. Π’Π°ΠΊΡΡ ΡΡΠ½ΠΊΡΠΈΠΎΠ½Π°Π»ΡΠ½ΠΎΡΡΡ ΠΏΡΠ΅Π΄Π»Π°Π³Π°Π΅Ρ ΠΊΠ»Π°ΡΡ ListAPIView.
ΠΠΎΠ±Π°Π²ΡΡΠ΅ ΡΠ»Π΅Π΄ΡΡΡΠ΅Π΅ Π² authentication/views.py:
ΠΡΠΈΠ΄ΡΠΌΡΠ²Π°Π΅ΠΌ ΠΊΠΎΠ΄Ρ Π΄ΠΎΡΡΡΠΏΠ°
ΠΡΠ΄ΠΈ, ΠΊΠΎΡΠΎΡΡΠ΅ ΠΏΡΠΈΠ΄ΡΠΌΠ°Π»ΠΈ Π΄Π²ΡΡ ΡΠ°ΠΊΡΠΎΡΠ½ΡΡ Π°ΡΡΠ΅Π½ΡΠΈΡΠΈΠΊΠ°ΡΠΈΡ, ΠΏΠΎ Π²ΡΠ΅ΠΉ Π²ΠΈΠ΄ΠΈΠΌΠΎΡΡΠΈ, ΡΡΠΊΠΎΠ²ΠΎΠ΄ΡΡΠ²ΠΎΠ²Π°Π»ΠΈΡΡ ΠΏΡΠΈΠ½ΡΠΈΠΏΠΎΠΌ Β«ΠΎΠ΄Π½Π° Π³ΠΎΠ»ΠΎΠ²Π° Ρ ΠΎΡΠΎΡΠΎ, Π° Π΄Π²Π΅ β Π»ΡΡΡΠ΅Β». Π Π΄Π΅ΠΉΡΡΠ²ΠΈΡΠ΅Π»ΡΠ½ΠΎ β Π΄Π²Π° ΠΏΠ°ΡΠΎΠ»Ρ ΡΠΎΡΠ½ΠΎ Π±Π΅Π·ΠΎΠΏΠ°ΡΠ½Π΅Π΅ ΠΎΠ΄Π½ΠΎΠ³ΠΎ. ΠΠΎ ΠΏΠ°ΡΠΎΠ»ΠΈ, ΠΊΠΎΡΠΎΡΡΠ΅ ΠΎΡΠΏΡΠ°Π²Π»ΡΠ΅Ρ ΡΠ°ΠΉΡ Π² SMS, Π½Π΅Π»ΡΠ·Ρ Π½Π°Π·Π²Π°ΡΡ Π°Π±ΡΠΎΠ»ΡΡΠ½ΠΎ Π·Π°ΡΠΈΡΠ΅Π½Π½ΡΠΌΠΈ: ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΠ΅ ΡΠ°ΡΠ΅ Π²ΡΠ΅Π³ΠΎ ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠ΅ΡΠ΅Ρ Π²Π°ΡΠΈΡΡ.
Π‘ΠΎΠ·Π΄Π°Π½ΠΈΠ΅ Π±Π΅Π·ΠΎΠΏΠ°ΡΠ½ΡΡ ΠΎΠ΄Π½ΠΎΡΠ°Π·ΠΎΠ²ΡΡ ΠΏΠ°ΡΠΎΠ»Π΅ΠΉ ΡΠΎΡΡΠΎΠΈΡ ΠΈΠ· Π΄Π²ΡΡ ΡΡΠ°ΠΏΠΎΠ²:
- ΠΠ΅ΡΠ²ΠΈΡΠ½Π°Ρ Π½Π°ΡΡΡΠΎΠΉΠΊΠ° β Π²ΠΊΠ»ΡΡΠ΅Π½ΠΈΠ΅ Π΄Π²ΡΡ ΡΠ°ΠΊΡΠΎΡΠ½ΠΎΠΉ Π°ΡΡΠ΅Π½ΡΠΈΡΠΈΠΊΠ°ΡΠΈΠΈ.
- ΠΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠ΅ ΠΏΠ°ΡΠΎΠ»Ρ β Π½Π΅ΠΏΠΎΡΡΠ΅Π΄ΡΡΠ²Π΅Π½Π½ΡΠΉ Π²Π²ΠΎΠ΄ ΠΊΠΎΠ΄Π° ΠΈ ΠΎΡΠΏΡΠ°Π²ΠΊΠ° Π΄Π»Ρ ΠΏΡΠΎΠ²Π΅ΡΠΊΠΈ.
Π ΡΠ°ΠΊΠΎΠΌ ΡΠ»ΡΡΠ°Π΅ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Ρ Ρ ΠΏΠΎΠΌΠΎΡΡΡ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ, Π΄ΠΎΡΡΡΠΏΠ½ΠΎΠ³ΠΎ Π½Π° Π»ΡΠ±ΠΎΠΌ ΡΡΡΡΠΎΠΉΡΡΠ²Π΅, ΡΠΌΠΎΠΆΠ΅Ρ Π³Π΅Π½Π΅ΡΠΈΡΠΎΠ²Π°ΡΡ ΠΊΠΎΠ΄Ρ Π² ΡΠΎΠΎΡΠ²Π΅ΡΡΡΠ²ΠΈΠΈ ΡΠΎ Π²ΡΠ΅ΠΌΠΈ ΡΡΠ°Π½Π΄Π°ΡΡΠ°ΠΌΠΈ.
ΠΠ΅ΡΠ²ΠΎΠ½Π°ΡΠ°Π»ΡΠ½Π°Ρ Π½Π°ΡΡΡΠΎΠΉΠΊΠ° ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ Π·Π°ΠΊΠ»ΡΡΠ°Π΅ΡΡΡ Π² ΠΎΠ±ΠΌΠ΅Π½Π΅ ΡΠ΅ΠΊΡΠ΅ΡΠ½ΡΠΌ ΠΊΠ»ΡΡΠΎΠΌ ΠΌΠ΅ΠΆΠ΄Ρ ΡΠ΅ΡΠ²Π΅ΡΠΎΠΌ ΠΈ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ΠΌ Π΄Π»Ρ Π°ΡΡΠ΅Π½ΡΠΈΡΠΈΠΊΠ°ΡΠΈΠΈ. ΠΠ°ΡΠ΅ΠΌ ΡΡΠΎΡ ΡΠ΅ΠΊΡΠ΅ΡΠ½ΡΠΉ ΠΊΠ»ΡΡ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΡΡΡ Π½Π° ΡΡΡΡΠΎΠΉΡΡΠ²Π΅ ΠΊΠ»ΠΈΠ΅Π½ΡΠ°, ΡΡΠΎΠ±Ρ ΠΏΠΎΠ΄ΠΏΠΈΡΠ°ΡΡ Π΄Π°Π½Π½ΡΠ΅, ΠΊΠΎΡΠΎΡΡΠ΅ ΠΈΠ·Π²Π΅ΡΡΠ½Ρ ΠΈ ΡΠ΅ΡΠ²Π΅ΡΡ, ΠΈ ΠΊΠ»ΠΈΠ΅Π½ΡΡ. ΠΡΠΎΡ ΠΊΠ»ΡΡ ΠΈ ΡΠ»ΡΠΆΠΈΡ Π³Π»Π°Π²Π½ΡΠΌ ΠΏΠΎΠ΄ΡΠ²Π΅ΡΠΆΠ΄Π΅Π½ΠΈΠ΅ΠΌ Π»ΠΈΡΠ½ΠΎΡΡΠΈ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Ρ ΠΏΡΠΈ Π²Π²ΠΎΠ΄Π΅ ΠΏΠ°ΡΠΎΠ»Ρ Π½Π° ΡΠ΅ΡΠ²Π΅ΡΠ΅.
ΠΠ° ΡΠ°ΠΌΠΎΠΌ Π΄Π΅Π»Π΅ Π²Π΅ΡΡ ΡΠ΅ΠΊΡΠ΅Ρ β ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°ΡΠ΅Π»ΡΠ½ΠΎΡΡΡ ΠΈΠ· ΡΠ»ΡΡΠ°ΠΉΠ½ΡΡ ΡΠΈΠΌΠ²ΠΎΠ»ΠΎΠ², ΠΊΠΎΡΠΎΡΡΠ΅ Π·Π°ΠΊΠΎΠ΄ΠΈΡΠΎΠ²Π°Π½Ρ Π² ΡΠΎΡΠΌΠ°ΡΠ΅ Base32. Π‘ΡΠΌΠΌΠ°ΡΠ½ΠΎ ΠΎΠ½ΠΈ Π·Π°Π½ΠΈΠΌΠ°ΡΡ Π½Π΅ ΠΌΠ΅Π½ΡΡΠ΅ 128 Π±ΠΈΡ, Π° ΡΠ°ΡΠ΅ ΠΈ Π²ΡΠ΅ 190 Π±ΠΈΡ. ΠΡΡ ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°ΡΠ΅Π»ΡΠ½ΠΎΡΡΡ ΠΈ Π²ΠΈΠ΄ΠΈΡ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Ρ ΠΊΠ°ΠΊ ΡΠ΅ΠΊΡΡ ΠΈΠ»ΠΈ QR-ΠΊΠΎΠ΄.
ΠΠ°ΠΊ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ ΡΠΎΠ·Π΄Π°Π΅Ρ ΠΎΠ΄Π½ΠΎΡΠ°Π·ΠΎΠ²ΡΠ΅ ΠΊΠΎΠ΄Ρ? ΠΡΠ΅ ΠΏΡΠΎΡΡΠΎ: ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Ρ ΠΏΠΎΠΌΠΎΡΡΡ ΠΊΠ»ΡΡΠ° Ρ Π΅ΡΠΈΡΡΠ΅Ρ ΠΊΠ°ΠΊΠΎΠ΅-ΡΠΎ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅, ΡΠ°ΡΠ΅ Π²ΡΠ΅Π³ΠΎ ΡΠΈΡΠ»ΠΎ, Π±Π΅ΡΠ΅Ρ ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½Π½ΡΡ ΡΠ°ΡΡΡ ΠΏΠΎΠ»ΡΡΠΈΠ²ΡΠ΅Π³ΠΎΡΡ Ρ Π΅ΡΠ° ΠΈ ΠΏΠΎΠΊΠ°Π·ΡΠ²Π°Π΅Ρ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Ρ Π² Π²ΠΈΠ΄Π΅ ΡΠΈΡΠ»Π° ΠΈΠ· ΡΠ΅ΡΡΠΈ ΠΈΠ»ΠΈ Π²ΠΎΡΡΠΌΠΈ ΡΠΈΡΡ.
Π‘ ΡΠ°ΠΌΠΎΠ³ΠΎ Π½Π°ΡΠ°Π»Π° Π΄Π»Ρ ΡΡΠΎΠ³ΠΎ ΡΠΈΡΠ»Π° ΡΠ°Π·ΡΠ°Π±ΠΎΡΡΠΈΠΊΠΈ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π»ΠΈ ΠΏΡΠΎΡΡΠΎΠΉ ΡΡΠ΅ΡΡΠΈΠΊ Π²Ρ ΠΎΠ΄ΠΎΠ². Π‘Π΅ΡΠ²Π΅Ρ ΡΡΠΈΡΠ°Π» ΠΊΠΎΠ»ΠΈΡΠ΅ΡΡΠ²ΠΎ ΡΠ°Π·, ΠΊΠΎΡΠΎΡΠΎΠ΅ ΡΡ Π·Π°Ρ ΠΎΠ΄ΠΈΠ», Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ, Π½Π° ΡΠ°ΠΉΡ, Π° ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ Π±ΡΠ»ΠΎ ΠΈΠ·Π²Π΅ΡΡΠ½ΠΎ, ΡΠΊΠΎΠ»ΡΠΊΠΎ ΡΠ°Π· ΡΡ Π·Π°ΠΏΡΠ°ΡΠΈΠ²Π°Π» ΠΎΠ΄Π½ΠΎΡΠ°Π·ΠΎΠ²ΡΠΉ ΠΏΠ°ΡΠΎΠ»Ρ. ΠΠΌΠ΅Π½Π½ΠΎ ΡΡΠΎ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ ΠΈ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π»ΠΎΡΡ Π΄Π»Ρ ΡΠΎΠ·Π΄Π°Π½ΠΈΡ ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ ΡΠ»Π΅Π΄ΡΡΡΠ΅Π³ΠΎ ΠΎΠ΄Π½ΠΎΡΠ°Π·ΠΎΠ²ΠΎΠ³ΠΎ ΠΊΠΎΠ΄Π°.
Π’Π΅ΠΏΠ΅ΡΡ Π΄Π°Π²Π°ΠΉ ΠΏΠΎΠΏΡΠΎΠ±ΡΠ΅ΠΌ ΠΏΠΎΡΡΠΈΡΠ°ΡΡ ΠΊΠΎΠ΄ Π΄Π»Ρ Π°Π²ΡΠΎΡΠΈΠ·Π°ΡΠΈΠΈ ΡΠ°ΠΌΠΎΡΡΠΎΡΡΠ΅Π»ΡΠ½ΠΎ. ΠΠ»Ρ ΠΏΡΠΈΠΌΠ΅ΡΠ° ΠΏΡΠ΅Π΄ΡΡΠ°Π²ΠΈΠΌ, ΡΡΠΎ ΠΌΡ ΡΠ΅ΡΠΈΠ»ΠΈ ΠΏΡΡΠΌΠΎ Π² ΠΠΎΠ²ΡΠΉ Π³ΠΎΠ΄ ΠΎΠΏΡΠ±Π»ΠΈΠΊΠΎΠ²Π°ΡΡ ΡΠΎΡΠΎΠ³ΡΠ°ΡΠΈΡ ΠΊΡΠ°ΡΠΈΠ²ΠΎΠ³ΠΎ ΡΠ΅ΠΉΠ΅ΡΠ²Π΅ΡΠΊΠ° ΠΈ, ΡΡΠΎΠ±Ρ ΡΡΠΎ ΡΠ΄Π΅Π»Π°ΡΡ, Π½ΡΠΆΠ½ΠΎ Π²ΠΎΠΉΡΠΈ Π² ΡΠ²ΠΎΠΉ Π°ΠΊΠΊΠ°ΡΠ½Ρ, Π° Π·Π½Π°ΡΠΈΡ, Π½Π°ΠΌ Π½Π΅ ΠΎΠ±ΠΎΠΉΡΠΈΡΡ Π±Π΅Π· ΠΎΠ΄Π½ΠΎΡΠ°Π·ΠΎΠ²ΠΎΠ³ΠΎ ΠΏΠ°ΡΠΎΠ»Ρ.
ΠΠΎΠ·ΡΠΌΠ΅ΠΌ Π²ΡΠ΅ΠΌΡ ΠΏΡΠ°Π·Π΄Π½ΠΎΠ²Π°Π½ΠΈΡ ΠΠΎΠ²ΠΎΠ³ΠΎ Π³ΠΎΠ΄Π° Π² ΡΠΎΡΠΌΠ°ΡΠ΅ UNIX (1577811600000) ΠΈ ΠΏΠΎΡΡΠΈΡΠ°Π΅ΠΌ ΠΏΠΎΡΡΠ΄ΠΊΠΎΠ²ΡΠΉ Π½ΠΎΠΌΠ΅Ρ Π½Π°ΡΠ΅Π³ΠΎ ΠΏΠ°ΡΠΎΠ»Ρ: ΠΏΠΎΠ΄Π΅Π»ΠΈΠΌ Π½Π° 30 ΡΠ΅ΠΊΡΠ½Π΄ β 52593720. ΠΠΎΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΠΌΡΡ Π½Π°ΡΠΈΠΌ ΡΠ΅ΠΊΡΠ΅ΡΠΎΠΌ ΠΈ Π²ΡΡΠΈΡΠ»ΠΈΠΌ Ρ Π΅Ρ β ΠΏΠΎ ΡΡΠ°Π½Π΄Π°ΡΡΡ RFC 6238 ΡΡΠΎ ΡΡΠ½ΠΊΡΠΈΡ SHA-1:
ΠΡΠΎΠ±Π»Π΅ΠΌΡ Π±Π΅Π·ΠΎΠΏΠ°ΡΠ½ΠΎΡΡΠΈ
Π₯ΠΎΡΡ Π²Π²Π΅Π΄Π΅Π½ΠΈΠ΅ΠΌ ΡΠΎΠΊΠ΅Π½ΠΎΠ²
ΠΏΡΡΠ°ΡΡΡΡ ΡΠ΅ΡΠΈΡΡ ΠΏΡΠΎΠ±Π»Π΅ΠΌΡ Π±Π΅Π·ΠΎΠΏΠ°ΡΠ½ΠΎΡΡΠΈ Π°ΡΡΠ΅Π½ΡΠΈΡΠΈΠΊΠ°ΡΠΈΠΈ Π½Π° ΠΎΡΠ½ΠΎΠ²Π΅ cookies, ΠΏΠΎΠ»Π½ΠΎΡΡΡΡ ΠΎΡ Π½ΠΈΡ
Π½Π΅ ΠΈΠ·Π±Π°Π²ΠΈΡΡΡΡ.
Π‘ΠΎΡ ΡΠ°Π½Π΅Π½Π½ΡΠ΅ Π² Π±ΡΠ°ΡΠ·Π΅ΡΠ΅ ΡΠΎΠΊΠ΅Π½Ρ ΠΌΠΎΠ³ΡΡ Π±ΡΡΡ ΡΡΠ·Π²ΠΈΠΌΡ Π΄Π»Ρ Π°ΡΠ°ΠΊ XSS, Π΅ΡΠ»ΠΈ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ΅Ρ Π²Π½Π΅Π΄ΡΡΡΡ Π²Π½Π΅ΡΠ½ΠΈΠ΅ ΡΡΠ΅Π½Π°ΡΠΈΠΈ JavaScript.
Π’ΠΎΠΊΠ΅Π½ Π½Π΅ ΠΈΠΌΠ΅Π΅Ρ ΡΠΎΡΡΠΎΡΠ½ΠΈΡ ΠΈ Π΅ΡΠ»ΠΈ ΠΎΠ½ ΡΡΡΠ°Π½ΠΎΠ²Π»Π΅Π½ ΡΠ½Π°ΡΡΠΆΠΈ, ΡΠΎ Π΅Π³ΠΎ Π½Π΅Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ ΠΎΡΠΎΠ·Π²Π°ΡΡ
Π΄ΠΎ ΠΈΡΡΠ΅ΡΠ΅Π½ΠΈΡ ΡΡΠΎΠΊΠ° ΠΆΠΈΠ·Π½ΠΈ. ΠΠΎΡΡΠΎΠΌΡ Π²Π°ΠΆΠ½ΠΎ, ΡΡΠΎΠ±Ρ ΠΎΠ½ ΠΈΠΌΠ΅Π» ΠΌΠΈΠ½ΠΈΠΌΠ°Π»ΡΠ½ΡΠΉ ΡΡΠΎΠΊ
Π³ΠΎΠ΄Π½ΠΎΡΡΠΈ.
ΠΡΠΎΠ±Π»Π΅ΠΌΡ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΡ ΡΠΎΠΊΠ΅Π½ΠΎΠ²
ΠΠ°ΠΊ ΠΈ Ρ Π»ΡΠ±ΠΎΠΉ ΡΠ΅Ρ Π½ΠΎΠ»ΠΎΠ³ΠΈΠ΅ΠΉ, Π² ΡΠ°Π±ΠΎΡΠ΅ Ρ ΡΠΎΠΊΠ΅Π½Π°ΠΌΠΈ Π΅ΡΡΡ Π½Π΅ΠΊΠΎΡΠΎΡΡΠ΅ ΠΎΠ³ΡΠ°Π½ΠΈΡΠ΅Π½ΠΈΡ ΠΈ ΠΏΡΠΎΠ±Π»Π΅ΠΌΡ. ΠΡ Π½Π°Π΄ΠΎ ΠΎΡΠΎΠ·Π½Π°Π²Π°ΡΡ ΠΈ ΠΏΡΠ°Π²ΠΈΠ»ΡΠ½ΠΎ ΠΎΠ±ΡΠ°ΡΠ°ΡΡΡΡ Ρ JWT ΠΏΡΠΈ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠΈ Π² ΠΏΡΠΎΠ΅ΠΊΡΠ°Ρ . Π― ΡΠΆΠ΅ ΠΎΡΠΌΠ΅ΡΠ°Π», ΡΡΠΎ ΡΠΎΠΊΠ΅Π½ ΠΌΠΎΠΆΠ΅Ρ Π±ΡΡΡ ΠΏΡΠΎΠ²Π΅ΡΠ΅Π½ ΡΠ΅ΡΡΡΡΠ½ΡΠΌ ΡΠ΅ΡΠ²Π΅ΡΠΎΠΌ Π½Π΅Π·Π°Π²ΠΈΡΠΈΠΌΠΎ Π½ΠΈ ΠΎΡ ΡΠ΅Π³ΠΎ, Π΄ΠΎΡΡΠ°ΡΠΎΡΠ½ΠΎ Π»ΠΈΡΡ ΡΠ΅ΠΊΡΠ΅ΡΠ½ΠΎΠΉ ΡΡΡΠΎΠΊΠΈ.
ΠΠΎ ΠΎΡΡΡΠ΄Π° ΡΠ»Π΅Π΄ΡΠ΅Ρ ΠΏΡΠΎΠ±Π»Π΅ΠΌΠ°: Π΅ΡΠ»ΠΈ Π²ΡΠ΄Π°ΡΡ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Ρ Π½ΠΎΠ²ΡΡ ΠΏΠ°ΡΡ ΡΠΎΠΊΠ΅Π½ΠΎΠ², Π° ΡΡΠ°ΡΠ°Ρ ΠΏΠ°ΡΠ° Π΅ΡΠ΅ Π²Π°Π»ΠΈΠ΄Π½Π°, ΡΠΎ ΡΡΠ΅Π΄ΡΡΠ² Π΅Π΅ Π·Π°ΡΠΊΡΠΏΠ°ΠΉΡΠΈΡΡ Π½Π΅Ρ.
ΠΠ΅Π΄Ρ ΡΠ°ΠΌ ΠΏΠΎ ΡΠ΅Π±Π΅ ΡΠΎΠΊΠ΅Π½ β ΡΡΠΎ ΡΡΡΠΎΠΊΠ°, ΠΊΠΎΡΠΎΡΠ°Ρ Π½ΠΈΠ³Π΄Π΅ Π½Π΅ Ρ ΡΠ°Π½ΠΈΡΡΡ. ΠΠΎΠΊΠ° ΠΎΠ½ Π²Π°Π»ΠΈΠ΄Π½ΡΠΉ, ΠΈΠΌ ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡΡΡ. Π ΠΈΡΠΎΠ³Π΅ ΡΠ·Π΅Ρ ΠΌΠΎΠΆΠ΅Ρ ΠΏΠΎΠ»ΡΡΠΈΡΡ Π²ΡΠΎΡΡΡ ΠΏΠ°ΡΡ, ΡΡΠ΅ΡΡΡ, ΡΠ΅ΡΠ²Π΅ΡΡΡΡ β Π° ΠΏΡΠ΅Π΄ΡΠ΄ΡΡΠΈΠ΅ Π΅ΡΠ΅ Π±ΡΠ΄ΡΡ ΡΠ°Π±ΠΎΡΠΎΡΠΏΠΎΡΠΎΠ±Π½Ρ.
ΠΡΠΎΠ²Π΅ΡΠΊΠ° ΡΠΎΠΊΠ΅Π½Π°
ΠΠ»Ρ ΠΏΡΠΎΠ²Π΅ΡΠΊΠ° ΡΠΎΠΊΠ΅Π½Π° Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΎ ΠΏΡΠΎΠ΄Π΅Π»Π°ΡΡ ΡΡ ΠΆΠ΅ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΡ.
ΠΠ΅ΡΠ΅ΠΌ ΡΠΊΠ»Π΅ΠΉΠΊΡ Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΎΠΊ Π΄Π°Π½Π½ΡΠ΅, ΠΊΠΎΠ΄ΠΈΡΡΠ΅ΠΌ Ρ ΠΏΠΎΠΌΠΎΡΡΡ Π°Π»Π³ΠΎΡΠΈΡΠΌΠ° HMAC-SHA256 ΠΈ Π½Π°ΡΠ΅Π³ΠΎ ΠΏΡΠΈΠ²Π°ΡΠ½ΠΎΠ³ΠΎ ΠΊΠ»ΡΡΠ°. Π Π΄Π°Π»Π΅Π΅ Π±Π΅ΡΠ΅ΠΌ ΡΠΈΠ³Π½Π°ΡΡΡΡ Ρ ΡΠΎΠΊΠ΅Π½Π° ΠΈ ΡΠ²Π΅ΡΡΠ΅ΠΌ Ρ ΡΠ΅Π·ΡΠ»ΡΡΠ°ΡΠΎΠΌ ΠΊΠΎΠ΄ΠΈΡΠΎΠ²Π°Π½ΠΈΡ. ΠΡΠ»ΠΈ ΡΠ΅Π·ΡΠ»ΡΡΠ°ΡΡ ΡΠΎΠ²ΠΏΠ°Π΄Π°ΡΡ – Π·Π½Π°ΡΠΈΡ Π΄Π°Π½Π½ΡΠ΅ ΠΏΠΎΠ΄ΡΠ²Π΅ΡΠΆΠ΄Π΅Π½Ρ ΠΈ ΠΌΠΎΠΆΠ½ΠΎ Π±ΡΡΡ ΡΠ²Π΅ΡΠ΅Π½Π½ΡΠΌ, ΡΡΠΎ ΠΎΠ½ΠΈ Π½Π΅ Π±ΡΠ»ΠΈ ΠΏΠΎΠ΄ΠΌΠ΅Π½Π΅Π½Ρ.
Π Π°Π·Π»ΠΈΡΠ½ΡΠ΅ ΡΠΈΠΏΠΎΠ²ΡΠ΅ Π·Π°Π΄Π°ΡΠΈ Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠ΅ΠΌ jwt
Π‘Π΅Π³ΠΎΠ΄Π½Ρ Π² ΠΏΡΠΎΠ΅ΠΊΡΠ°Ρ ΠΏΡΠΈΡ ΠΎΠ΄ΠΈΡΡΡ ΡΠ΅ΡΠ°ΡΡ Π·Π°Π΄Π°ΡΠΈ, ΠΊΠΎΡΠΎΡΡΠ΅ Π²ΡΡ ΠΎΠ΄ΡΡ Π·Π° ΡΠ°ΠΌΠΊΠΈ ΠΎΠΏΠΈΡΡΠ²Π°Π΅ΠΌΡΡ ΡΠΎΠΊΠ΅Π½ΠΎΠ², Π½ΠΎ ΠΏΡΠΈ ΡΡΠΎΠΌ ΠΎΠ½ΠΈ Π±Π°Π·ΠΈΡΡΡΡΡΡ Π½Π° ΠΈΡ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠΈ. ΠΠ΅ΡΠ²Π°Ρ ΠΏΠΎΠ΄ΠΎΠ±Π½Π°Ρ Π·Π°Π΄Π°ΡΠ° β lockout-ΠΌΠ΅Ρ Π°Π½ΠΈΠ·ΠΌ. ΠΠ½ ΠΏΡΠ΅Π΄ΠΏΠΎΠ»Π°Π³Π°Π΅Ρ Π±Π»ΠΎΠΊΠΈΡΠΎΠ²Π°Π½ΠΈΠ΅ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Ρ ΠΏΠΎΡΠ»Π΅ Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΈΡ Π±Π΅Π·ΡΡΠΏΠ΅ΡΠ½ΡΡ ΠΏΠΎΠΏΡΡΠΎΠΊ Π°ΡΡΠ΅Π½ΡΠΈΡΠΈΠΊΠ°ΡΠΈΠΈ.
Π― Π½Π΅ Π±ΡΠ΄Ρ ΠΏΠΎΠ΄ΡΠΎΠ±Π½ΠΎ ΠΎΡΡΠ°Π½Π°Π²Π»ΠΈΠ²Π°ΡΡΡΡ Π½Π° ΡΡΠΎΠΉ Π·Π°Π΄Π°ΡΠ΅, ΠΎΠ½Π° Π΄ΠΎΡΡΠ°ΡΠΎΡΠ½ΠΎ ΠΏΡΠΎΡΡΠ°Ρ. ΠΡΠ»ΠΈ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Ρ Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΎ ΡΠ°Π· ΠΏΠΎΠ΄ΡΡΠ΄ Π²Π²Π΅Π» ΠΊΠΎΡΡΠ΅ΠΊΡΠ½ΡΠ΅ ΠΈΠΌΡ ΠΈΠ»ΠΈ email, Π½ΠΎ Π½Π΅ΠΏΡΠ°Π²ΠΈΠ»ΡΠ½ΡΠΉ ΠΏΠ°ΡΠΎΠ»Ρ, Π½Π°Π΄ΠΎ Π·Π°Π±Π»ΠΎΠΊΠΈΡΠΎΠ²Π°ΡΡ ΡΡΠΎΠ³ΠΎ ΡΠ·Π΅ΡΠ° Π½Π° ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½Π½ΠΎΠ΅ Π²ΡΠ΅ΠΌΡ. ΠΠ»Ρ ΡΡΠΎΠ³ΠΎ Π½Π° ΡΠ΅ΡΠ²Π΅ΡΠ΅ Π½ΡΠΆΠ½ΠΎ Π·Π°ΠΏΠΈΡΠ°ΡΡ, Π΄ΠΎΠΏΡΡΡΠΈΠΌ, Π² Π±Π°Π·Ρ Π΄Π°Π½Π½ΡΡ ΠΈΠ»ΠΈ ΠΏΡΠΎΠΌΠ΅ΠΆΡΡΠΎΡΠ½ΠΎΠ΅ Ρ ΡΠ°Π½ΠΈΠ»ΠΈΡΠ΅ ΠΊΠΎΠ»ΠΈΡΠ΅ΡΡΠ²ΠΎ Π±Π΅Π·ΡΡΠΏΠ΅ΡΠ½ΡΡ ΠΏΠΎΠΏΡΡΠΎΠΊ ΠΈ Π·Π°Π΄Π°ΡΡ Π±Π»ΠΎΠΊΠΈΡΠΎΠ²ΠΊΡ Π΄ΠΎΡΡΡΠΏΠ° Π² ΡΠ»ΡΡΠ°Π΅ ΠΏΡΠ΅Π²ΡΡΠ΅Π½ΠΈΠΈ ΡΡΠΎΠ³ΠΎ ΠΏΠΎΠΊΠ°Π·Π°ΡΠ΅Π»Ρ.
ΠΠΎΠ»Π΅Π΅ ΠΈΠ½ΡΠ΅ΡΠ΅ΡΠ½ΡΠ΅ Π·Π°Π΄Π°ΡΠΈ β Logout ΠΈ Only one active device, ΠΊΠΎΡΠΎΡΡΠ΅ Π² ΠΏΡΠΈΠ½ΡΠΈΠΏΠ΅ ΡΠ²ΡΠ·Π°Π½Ρ ΠΌΠ΅ΠΆΠ΄Ρ ΡΠΎΠ±ΠΎΠΉ.
Logout ΠΏΡΠ΅Π΄ΠΏΠΎΠ»Π°Π³Π°Π΅Ρ, ΡΡΠΎ ΠΏΠΎΡΠ»Π΅ Π½Π°ΠΆΠ°ΡΠΈΡ ΠΊΠ½ΠΎΠΏΠΊΠΈ Π»ΠΎΠ³Π°ΡΡΠ° Π²ΠΎ ΡΡΠΎΠ½ΡΠ΅Π½Π΄-ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΈ Π½Π°Π΄ΠΎ Ρ ΠΏΠΎΠ΄ΡΠ²Π΅ΡΠΆΠ΄Π΅Π½ΠΈΠ΅ΠΌ Π²ΡΡ ΠΎΠ΄Π° Π΅ΡΠ΅ ΠΈ ΠΈΠ½Π²Π°Π»ΠΈΠ΄ΠΈΡΠΎΠ²Π°ΡΡ ΡΠ°ΠΌΠΈ ΡΠΎΠΊΠ΅Π½Ρ, ΡΠ΄Π΅Π»Π°ΡΡ ΠΈΡ Π½Π΅Π΄Π΅ΠΉΡΡΠ²ΠΈΡΠ΅Π»ΡΠ½ΡΠΌΠΈ.
Π Π°ΡΠΊΡΡΡΠΈΠ΅ ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΠΈ ΠΎ ΡΠΎΠΊΠ΅Π½Π΅
ΠΡΠ° Π°ΡΠ°ΠΊΠ° ΠΏΡΠΎΠΈΡΡ ΠΎΠ΄ΠΈΡ, ΠΊΠΎΠ³Π΄Π° Π·Π»ΠΎΡΠΌΡΡΠ»Π΅Π½Π½ΠΈΠΊ ΠΏΠΎΠ»ΡΡΠ°Π΅Ρ Π΄ΠΎΡΡΡΠΏ ΠΊ ΡΠΎΠΊΠ΅Π½Ρ (ΠΈΠ»ΠΈ ΠΊ Π½Π°Π±ΠΎΡΡ ΡΠΎΠΊΠ΅Π½ΠΎΠ²) ΠΈ ΠΈΠ·Π²Π»Π΅ΠΊΠ°Π΅Ρ ΡΠΎΡ ΡΠ°Π½Π΅Π½Π½ΡΡ Π² Π½Π΅ΠΌ ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΡ (ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΡ ΠΎ ΡΠΎΠΊΠ΅Π½Π΅ JWT ΠΊΠΎΠ΄ΠΈΡΡΠ΅ΡΡΡ Ρ ΠΏΠΎΠΌΠΎΡΡΡ base64) Π΄Π»Ρ ΠΏΠΎΠ»ΡΡΠ΅Π½ΠΈΡ ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΠΈ ΠΎ ΡΠΈΡΡΠ΅ΠΌΠ΅. ΠΠ½ΡΠΎΡΠΌΠ°ΡΠΈΡ ΠΌΠΎΠΆΠ΅Ρ Π±ΡΡΡ, Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ, ΡΠ°ΠΊΠΎΠΉ ΠΊΠ°ΠΊ, ΡΠΎΠ»ΠΈ Π±Π΅Π·ΠΎΠΏΠ°ΡΠ½ΠΎΡΡΠΈ, ΡΠΎΡΠΌΠ°Ρ Π²Ρ ΠΎΠ΄Π° Π² ΡΠΈΡΡΠ΅ΠΌΡ ΠΈ Ρ.Π΄.
Π‘ΠΏΠΎΡΠΎΠ± Π·Π°ΡΠΈΡΡ Π΄ΠΎΡΡΠ°ΡΠΎΡΠ½ΠΎ ΠΎΡΠ΅Π²ΠΈΠ΄Π΅Π½ ΠΈ Π·Π°ΠΊΠ»ΡΡΠ°Π΅ΡΡΡ Π² ΡΠΈΡΡΠΎΠ²Π°Π½ΠΈΠΈ ΡΠΎΠΊΠ΅Π½Π°. Π’Π°ΠΊΠΆΠ΅ Π²Π°ΠΆΠ½ΠΎ Π·Π°ΡΠΈΡΠΈΡΡ Π·Π°ΡΠΈΡΡΠΎΠ²Π°Π½Π½ΡΠ΅ Π΄Π°Π½Π½ΡΠ΅ ΠΎΡ Π°ΡΠ°ΠΊ Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠ΅ΠΌ ΠΊΡΠΈΠΏΡΠΎΠ°Π½Π°Π»ΠΈΠ·Π°. ΠΠ»Ρ Π΄ΠΎΡΡΠΈΠΆΠ΅Π½ΠΈΡ Π²ΡΠ΅Ρ ΡΡΠΈΡ ΡΠ΅Π»Π΅ΠΉ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΡΡΡ Π°Π»Π³ΠΎΡΠΈΡΠΌ AES-GCM, ΠΊΠΎΡΠΎΡΡΠΉ ΠΎΠ±Π΅ΡΠΏΠ΅ΡΠΈΠ²Π°Π΅Ρ Π°ΡΡΠ΅Π½ΡΠΈΡΠΈΡΠΈΡΠΎΠ²Π°Π½Π½ΠΎΠ΅ ΡΠΈΡΡΠΎΠ²Π°Π½ΠΈΠ΅ Ρ Π°ΡΡΠΎΡΠΈΠΈΡΠΎΠ²Π°Π½Π½ΡΠΌΠΈ Π΄Π°Π½Π½ΡΠΌΠΈ (Authenticated Encryption with Associated Data β AEAD).
ΠΡΠΈΠΌΠΈΡΠΈΠ² AEAD ΠΎΠ±Π΅ΡΠΏΠ΅ΡΠΈΠ²Π°Π΅Ρ ΡΡΠ½ΠΊΡΠΈΠΎΠ½Π°Π»ΡΠ½ΠΎΡΡΡ ΡΠΈΠΌΠΌΠ΅ΡΡΠΈΡΠ½ΠΎΠ³ΠΎ Π°ΡΡΠ΅Π½ΡΠΈΡΠΈΡΠΈΡΠΎΠ²Π°Π½Π½ΠΎΠ³ΠΎ ΡΠΈΡΡΠΎΠ²Π°Π½ΠΈΡ. Π Π΅Π°Π»ΠΈΠ·Π°ΡΠΈΠΈ ΡΡΠΎΠ³ΠΎ ΠΏΡΠΈΠΌΠΈΡΠΈΠ²Π° Π·Π°ΡΠΈΡΠ΅Π½Ρ ΠΎΡ Π°Π΄Π°ΠΏΡΠΈΠ²Π½ΡΡ Π°ΡΠ°ΠΊ Π½Π° ΠΎΡΠ½ΠΎΠ²Π΅ ΠΏΠΎΠ΄ΠΎΠ±ΡΠ°Π½Π½ΠΎΠ³ΠΎ ΡΠΈΡΡΡΠ΅ΠΊΡΡΠ°. ΠΡΠΈ ΡΠΈΡΡΠΎΠ²Π°Π½ΠΈΠΈ ΠΎΡΠΊΡΡΡΠΎΠ³ΠΎ ΡΠ΅ΠΊΡΡΠ° ΠΌΠΎΠΆΠ½ΠΎ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡΠ΅Π»ΡΠ½ΠΎ ΡΠΊΠ°Π·Π°ΡΡ ΡΠ²ΡΠ·Π°Π½Π½ΡΠ΅ Π΄Π°Π½Π½ΡΠ΅, ΠΊΠΎΡΠΎΡΡΠ΅ Π΄ΠΎΠ»ΠΆΠ½Ρ Π±ΡΡΡ Π°ΡΡΠ΅Π½ΡΠΈΡΠΈΡΠΈΡΠΎΠ²Π°Π½Ρ, Π½ΠΎ Π½Π΅ Π·Π°ΡΠΈΡΡΠΎΠ²Π°Π½Ρ.
Π’ΠΎ Π΅ΡΡΡ ΡΠΈΡΡΠΎΠ²Π°Π½ΠΈΠ΅ Ρ ΡΠΎΠΎΡΠ²Π΅ΡΡΡΠ²ΡΡΡΠΈΠΌΠΈ Π΄Π°Π½Π½ΡΠΌΠΈ ΠΎΠ±Π΅ΡΠΏΠ΅ΡΠΈΠ²Π°Π΅Ρ ΠΏΠΎΠ΄Π»ΠΈΠ½Π½ΠΎΡΡΡ ΠΈ ΡΠ΅Π»ΠΎΡΡΠ½ΠΎΡΡΡ Π΄Π°Π½Π½ΡΡ , Π½ΠΎ Π½Π΅ ΠΈΡ ΡΠ΅ΠΊΡΠ΅ΡΠ½ΠΎΡΡΡ.
ΠΠ΄Π½Π°ΠΊΠΎ Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΎ ΠΎΡΠΌΠ΅ΡΠΈΡΡ, ΡΡΠΎ ΡΠΈΡΡΠΎΠ²Π°Π½ΠΈΠ΅ Π΄ΠΎΠ±Π°Π²Π»ΡΠ΅ΡΡΡ Π² ΠΎΡΠ½ΠΎΠ²Π½ΠΎΠΌ Π΄Π»Ρ ΡΠΎΠΊΡΡΡΠΈΡ Π²Π½ΡΡΡΠ΅Π½Π½Π΅ΠΉ ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΠΈ, Π½ΠΎ ΠΎΡΠ΅Π½Ρ Π²Π°ΠΆΠ½ΠΎ ΠΏΠΎΠΌΠ½ΠΈΡΡ, ΡΡΠΎ ΠΏΠ΅ΡΠ²ΠΎΠ½Π°ΡΠ°Π»ΡΠ½ΠΎΠΉ Π·Π°ΡΠΈΡΠΎΠΉ ΠΎΡ ΠΏΠΎΠ΄Π΄Π΅Π»ΠΊΠΈ ΡΠΎΠΊΠ΅Π½Π° JWT ΡΠ²Π»ΡΠ΅ΡΡΡ ΠΏΠΎΠ΄ΠΏΠΈΡΡ, ΠΏΠΎΡΡΠΎΠΌΡ ΠΏΠΎΠ΄ΠΏΠΈΡΡ ΡΠΎΠΊΠ΅Π½Π° ΠΈ Π΅Π΅ ΠΏΡΠΎΠ²Π΅ΡΠΊΠ° Π΄ΠΎΠ»ΠΆΠ½Ρ Π±ΡΡΡ Π²ΡΠ΅Π³Π΄Π° ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½Ρ.
Π Π΅Π°Π»ΠΈΠ·Π°ΡΠΈΡ ΠΏΡΠΎΠ²Π΅ΡΠΊΠΈ ΠΏΠΎΠ΄Π»ΠΈΠ½Π½ΠΎΡΡΠΈ Ρ ΠΏΠΎΠΌΠΎΡΡΡ json web token
ΠΠ°Π²Π°ΠΉΡΠ΅ ΠΏΠΎΠΉΠ΄Π΅ΠΌ Π΄Π°Π»ΡΡΠ΅ ΠΈ ΡΠΎΠ·Π΄Π°Π΄ΠΈΠΌ Π½Π°Ρ ΠΏΡΠΎΠ΅ΠΊΡ.
ΠΠ΅ΡΠ΅ΠΉΠ΄ΠΈΡΠ΅ Π² ΠΊΠ°ΡΠ°Π»ΠΎΠ³ ΠΏΡΠΎΠ΅ΠΊΡΠ° ΠΈ Π²ΡΠΏΠΎΠ»Π½ΠΈΡΠ΅ ΠΊΠΎΠΌΠ°Π½Π΄Ρ:
Π‘Π΅ΡΠΈΠ°Π»ΠΈΠ·Π°ΡΠΎΡΡ
ΠΠ»Ρ ΠΏΡΠΎΠ²Π΅ΡΠΊΠΈ ΡΠ°Π±ΠΎΡΠΎΡΠΏΠΎΡΠΎΠ±Π½ΠΎΡΡΠΈ API Π½ΡΠΆΠ½ΠΎ ΠΎΡΠΏΡΠ°Π²Π»ΡΡΡ ΠΊΠ°ΠΊΠΈΠ΅-Π½ΠΈΠ±ΡΠ΄Ρ Π΄Π°Π½Π½ΡΠ΅ Π½Π° AJAX Π·Π°ΠΏΡΠΎΡΡ. Π‘Π°ΠΌΡΠΉ ΠΏΡΠΎΡΡΠΎΠΉ ΡΠΏΠΎΡΠΎΠ± ΡΡΠΎ ΡΠ΄Π΅Π»Π°ΡΡ β ΠΎΡΠΏΡΠ°Π²ΠΈΡΡ ΠΎΠ±ΡΠ°ΡΠ½ΠΎ Π΄Π°Π½Π½ΡΠ΅ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Ρ Π² Π½Π°ΡΠ΅ΠΉ ΡΠΈΡΡΠ΅ΠΌΠ΅.
ΠΠ΅ΡΠ²ΠΎΠ΅, ΡΡΠΎ Π½ΡΠΆΠ½ΠΎ ΡΠ΄Π΅Π»Π°ΡΡ, ΡΡΠΎ ΡΠΎΠ·Π΄Π°ΡΡ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Ρ. ΠΡΠΏΠΎΠ»Π½ΠΈΡΠ΅ ΡΠ»Π΅Π΄ΡΡΡΡΡ ΠΊΠΎΠΌΠ°Π½Π΄Ρ ΠΈ ΡΠ»Π΅Π΄ΡΠΉΡΠ΅ ΠΈΠ½ΡΡΡΡΠΊΡΠΈΡΠΌ Π½Π° ΡΠΊΡΠ°Π½Π΅:
Π‘ΠΈΠ³Π½Π°ΡΡΡΠ°
ΠΠΎΡΠ»Π΅Π΄Π½ΡΡ ΡΠ°ΡΡΡ ΡΠΎΠΊΠ΅Π½Π° – Π½Π°ΠΈΠ±ΠΎΠ»Π΅Π΅ Π²Π°ΠΆΠ½Π°Ρ. Π£ Π½Π°Ρ ΡΡΠΎ E4FNMef6tkjIsf7paNrWZnB88c3WyIfjONzAeEd4wF0
ΠΠ°ΠΊ Π²Ρ ΡΠΆΠ΅ ΠΌΠΎΠ³Π»ΠΈ Π·Π°ΠΌΠ΅ΡΠΈΡΡ – ΠΏΠ΅ΡΠ²ΡΠ΅ Π΄Π°Π½Π½ΡΠ΅ ΠΏΠ΅ΡΠ΅Π΄Π°ΡΡΡΡ ΠΏΡΠ°ΠΊΡΠΈΡΠ΅ΡΠΊΠΈ Π² ΠΎΡΠΊΡΡΡΠΎΠΌ Π²ΠΈΠ΄Π΅ ΠΈ ΡΠ°ΡΠΊΠΎΠ΄ΠΈΡΠΎΠ²Π°ΡΡ ΠΈΡ ΠΌΠΎΠΆΠ΅Ρ Π»ΡΠ±ΠΎΠΉ. ΠΠΎ ΡΠΈΡΡΠΎΠ²Π°ΡΡ ΠΈΡ Π½Π΅Ρ Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΎΡΡΠΈ. Π¦Π΅Π»Ρ ΡΠΎΠΊΠ΅Π½Π° – ΠΏΠΎΠ΄ΡΠ²Π΅ΡΠ΄ΠΈΡΡ, ΡΡΠΎ ΡΡΠΈ Π΄Π°Π½Π½ΡΠ΅ Π½Π΅ Π±ΡΠ»ΠΈ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½Ρ. ΠΠΎΡ Π΄Π»Ρ ΡΡΠΈΡ ΡΠ΅Π»Π΅ΠΉ ΠΈ Π²ΡΡΡΡΠΏΠ°Π΅Ρ ΡΠΈΠ³Π½Π°ΡΡΡΠ°. Π ΡΡΠΎΠ±Ρ Π΅Ρ ΡΠ³Π΅Π½Π΅ΡΠΈΡΠΎΠ²Π°ΡΡ Π½ΡΠΆΠ΅Π½ ΠΏΡΠΈΠ²Π°ΡΠ½ΡΠΉ ΠΊΠ»ΡΡ.
ΠΠ½Π° ΠΏΠΎΠ»ΡΡΠ°Π΅ΡΡΡ ΠΏΡΠΈΠΌΠ΅ΡΠ½ΠΎ ΡΠ»Π΅Π΄ΡΡΡΠΈΠΌ ΠΎΠ±ΡΠ°Π·ΠΎΠΌ:
Π‘ΠΎΠ·Π΄Π°Π½ΠΈΠ΅ django ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ
Π’Π΅ΠΏΠ΅ΡΡ Π΄Π°Π²Π°ΠΉΡΠ΅ ΡΠΎΠ·Π΄Π°Π΄ΠΈΠΌ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Django Π΄Π»Ρ Ρ ΡΠ°Π½Π΅Π½ΠΈΡ Π² Π½Π΅ΠΌ ΠΏΡΠ΅Π΄ΡΡΠ°Π²Π»Π΅Π½ΠΈΠΉ ΠΈ ΡΠ΅ΡΠΈΠ°Π»ΠΈΠ·Π°ΡΠΎΡΠΎΠ²:
$ python manage.py startapp authentication
ΠΠΎΠ±Π°Π²ΠΈΠΌ ‘authentication’ Π² Π½Π°Ρ INSTALLED_APPS (Π² django_angular_token_auth/settings.py like so):
INSTALLED_APPS = (
...,
'rest_framework',
'authentication',
)
ΠΠ°ΠΊ ΠΏΡΠΈΠ²ΠΈΠ»ΠΎ ΠΏΠΎΡΠ»Π΅ ΡΠΎΠ·Π΄Π°Π½ΠΈΡ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ Π½ΡΠΆΠ½ΠΎ Π²ΡΠΏΠΎΠ»Π½ΠΈΡΡ ΠΌΠΈΠ³ΡΠ°ΡΠΈΠΈ, Π΄Π»Ρ ΡΠΎΠ·Π΄Π°Π½ΠΈΡ ΠΌΠΎΠ΄Π΅Π»Π΅ΠΉ Π² ΠΠ. ΠΠΎ ΠΌΡ Π½Π΅ Π±ΡΠ΄Π΅ΠΌ ΡΠΎΠ·Π΄Π°Π²Π°ΡΡ ΡΠΎΠ±ΡΡΠ²Π΅Π½Π½ΡΠ΅ ΠΌΠΎΠ΄Π΅Π»ΠΈ, ΠΏΠΎΡΡΠΎΠΌΡ ΠΎΠ± ΡΡΠΎΠΌ Π½Π΅ Π½ΡΠΆΠ½ΠΎ Π±Π΅ΡΠΏΠΎΠΊΠΎΠΈΡΡΡΡ.
Π‘ΠΎΠΎΠ±ΡΠ°ΠΆΠ΅Π½ΠΈΡ ΠΏΠΎ ΠΏΠΎΠ²ΠΎΠ΄Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΡ jwt
ΠΠ°ΠΆΠ΅ Π΅ΡΠ»ΠΈ ΡΠΎΠΊΠ΅Π½ JWT ΠΏΡΠΎΡΡ Π² ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠΈ ΠΈ ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ΅Ρ ΠΏΡΠ΅Π΄ΠΎΡΡΠ°Π²Π»ΡΡΡ ΡΠ΅ΡΠ²ΠΈΡΡ (Π² ΠΎΡΠ½ΠΎΠ²Π½ΠΎΠΌ REST) Π±Π΅Π· ΡΠΎΡ ΡΠ°Π½Π΅Π½ΠΈΡ ΡΠΎΡΡΠΎΡΠ½ΠΈΡ (stateless), ΡΠ°ΠΊΠΎΠ΅ ΡΠ΅ΡΠ΅Π½ΠΈΠ΅ ΠΏΠΎΠ΄Ρ ΠΎΠ΄ΠΈΡ Π½Π΅ Π΄Π»Ρ Π²ΡΠ΅Ρ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ, ΠΏΠΎΡΠΎΠΌΡ ΡΡΠΎ ΠΎΠ½ΠΎ ΠΏΠΎΡΡΠ°Π²Π»ΡΠ΅ΡΡΡ Ρ Π½Π΅ΠΊΠΎΡΠΎΡΡΠΌΠΈ ΠΎΠ³ΠΎΠ²ΠΎΡΠΊΠ°ΠΌΠΈ, ΠΊΠ°ΠΊ, Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ, Π²ΠΎΠΏΡΠΎΡ Ρ ΡΠ°Π½Π΅Π½ΠΈΡ ΡΠΎΠΊΠ΅Π½Π°.
ΠΡΠ»ΠΈ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Π½Π΅ Π΄ΠΎΠ»ΠΆΠ½ΠΎ Π±ΡΡΡ ΠΏΠΎΠ»Π½ΠΎΡΡΡΡ stateless, ΡΠΎ ΠΌΠΎΠΆΠ½ΠΎ ΡΠ°ΡΡΠΌΠΎΡΡΠ΅ΡΡ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΡ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΡ ΡΡΠ°Π΄ΠΈΡΠΈΠΎΠ½Π½ΠΎΠΉ ΡΠΈΡΡΠ΅ΠΌΡ ΡΠ΅ΡΡΠΈΠΉ, ΠΏΡΠ΅Π΄ΠΎΡΡΠ°Π²Π»ΡΠ΅ΠΌΠΎΠΉ Π²ΡΠ΅ΠΌΠΈ Π²Π΅Π±-ΠΏΠ»Π°ΡΡΠΎΡΠΌΠ°ΠΌΠΈ. ΠΠ΄Π½Π°ΠΊΠΎ Π΄Π»Ρ stateless ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ JWT β ΡΡΠΎ Ρ ΠΎΡΠΎΡΠΈΠΉ Π²Π°ΡΠΈΠ°Π½Ρ, Π΅ΡΠ»ΠΈ ΠΎΠ½ ΠΏΡΠ°Π²ΠΈΠ»ΡΠ½ΠΎ ΡΠ΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Π½.
Π‘ΡΠ°Π²Π½Π΅Π½ΠΈΠ΅ ΡΠ΅ΡΡΠΈΠΉ ΠΈ jwt
ΠΠ°Π²Π΅ΡΠ½ΡΠΊΠ° ΠΊΡΠΎ-ΡΠΎ ΡΠΊΠ°ΠΆΠ΅Ρ: Β«Π£ΡΠ°, Π²Ρ ΠΏΠ΅ΡΠ΅ΠΎΡΠΊΡΡΠ»ΠΈ ΠΌΠ΅Ρ Π°Π½ΠΈΠ·ΠΌ ΡΠ΅ΡΡΠΈΠΉΒ», ΠΈ Π² ΡΡΠΎΠΌ Π΅ΡΡΡ Π΄ΠΎΠ»Ρ ΠΏΡΠ°Π²Π΄Ρ. Π’ΠΎΠΊΠ΅Π½ Π½ΡΠΆΠ΅Π½ Π΄Π»Ρ ΠΏΠΎΠ΄ΡΠ²Π΅ΡΠΆΠ΄Π΅Π½ΠΈΡ Π°ΡΡΠ΅Π½ΡΠΈΡΠΈΠΊΠ°ΡΠΈΠΈ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Ρ. Π ΠΈΠ΄Π΅Π½ΡΠΈΡΠΈΠΊΠ°ΡΠΎΡ ΡΠ΅ΡΠΈΠΈ β ΡΡΠΎ ΠΏΡΠΈΠ·Π½Π°ΠΊ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»ΡΡΠΊΠΎΠΉ ΡΠ΅ΡΡΠΈΠΈ: Π½Π°Ρ ΠΎΠ΄ΠΈΡΡΡ Π»ΠΈ ΡΠ΅ΠΉΡΠ°Ρ ΡΠ·Π΅Ρ Π² ΡΠΈΡΡΠ΅ΠΌΠ΅, ΠΌΠΎΠΆΠ΅Ρ Π»ΠΈ ΠΎΠ½ ΡΠ°Π±ΠΎΡΠ°ΡΡ Ρ Π½Π΅ΠΉ, ΠΈΠ»ΠΈ ΡΠ΅ΡΡΠΈΡ Π·Π°Π²Π΅ΡΡΠ΅Π½Π°.
Π ΠΈΠ½ΡΠ΅ΡΠ½Π΅ΡΠ΅ Π²Π°ΠΌ ΠΌΠΎΠΆΠ΅Ρ ΠΏΠΎΠΏΠ°ΡΡΡΡΡ ΡΠ°ΠΊΠ°Ρ Π½Π΅ΠΌΠ½ΠΎΠ³ΠΎ ΡΠ°ΡΠΊΠ°ΡΡΠΈΡΠ΅ΡΠΊΠ°Ρ ΠΊΠ°ΡΡΠΈΠ½ΠΊΠ°:
Π₯ΡΠ°Π½Π΅Π½ΠΈΠ΅ ΡΠΎΠΊΠ΅Π½ΠΎΠ² Π½Π° ΡΡΠΎΡΠΎΠ½Π΅ ΠΊΠ»ΠΈΠ΅Π½ΡΠ°
ΠΡΠ»ΠΈ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Ρ ΡΠ°Π½ΠΈΡ ΡΠΎΠΊΠ΅Π½ ΡΠ°ΠΊ, ΡΡΠΎ Π²ΠΎΠ·Π½ΠΈΠΊΠ°Π΅Ρ ΠΎΠ΄Π½Π° ΠΈΠ»ΠΈ Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΎ ΠΈΠ· ΡΠ»Π΅Π΄ΡΡΡΠΈΡ ΡΠΈΡΡΠ°ΡΠΈΠΉ:
ΠΠ»Ρ ΠΏΡΠ΅Π΄ΠΎΡΠ²ΡΠ°ΡΠ΅Π½ΠΈΡ Π°ΡΠ°ΠΊΠΈ:
- Π₯ΡΠ°Π½ΠΈΡΡ ΡΠΎΠΊΠ΅Π½ Π² Π±ΡΠ°ΡΠ·Π΅ΡΠ΅, ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΡ ΠΊΠΎΠ½ΡΠ΅ΠΉΠ½Π΅Ρ sessionStorage.
- ΠΠΎΠ±Π°Π²ΠΈΡΡ Π΅Π³ΠΎ Π² Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΎΠΊ Authorization, ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΡ ΡΡ
Π΅ΠΌΡ Bearer. ΠΠ°Π³ΠΎΠ»ΠΎΠ²ΠΎΠΊ Π΄ΠΎΠ»ΠΆΠ΅Π½ Π²ΡΠ³Π»ΡΠ΄Π΅ΡΡ ΡΠ»Π΅Π΄ΡΡΡΠΈΠΌ ΠΎΠ±ΡΠ°Π·ΠΎΠΌ:
Authorization: Bearer <token>
- ΠΠΎΠ±Π°Π²ΠΈΡΡ fingerprint ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΡ ΠΊ ΡΠΎΠΊΠ΅Π½Ρ.
Π‘ΠΎΡ ΡΠ°Π½ΡΡ ΡΠΎΠΊΠ΅Π½ Π² ΠΊΠΎΠ½ΡΠ΅ΠΉΠ½Π΅ΡΠ΅ sessionStorage, ΠΎΠ½ ΠΏΡΠ΅Π΄ΠΎΡΡΠ°Π²Π»ΡΠ΅Ρ ΡΠΎΠΊΠ΅Π½ Π΄Π»Ρ ΠΊΡΠ°ΠΆΠΈ Π² ΡΠ»ΡΡΠ°Π΅ XSS. ΠΠ΄Π½Π°ΠΊΠΎ fingerprint, Π΄ΠΎΠ±Π°Π²Π»Π΅Π½Π½ΡΠΉ Π² ΡΠΎΠΊΠ΅Π½, ΠΏΡΠ΅Π΄ΠΎΡΠ²ΡΠ°ΡΠ°Π΅Ρ ΠΏΠΎΠ²ΡΠΎΡΠ½ΠΎΠ΅ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠ΅ ΡΠΊΡΠ°Π΄Π΅Π½Π½ΠΎΠ³ΠΎ ΡΠΎΠΊΠ΅Π½Π° Π·Π»ΠΎΡΠΌΡΡΠ»Π΅Π½Π½ΠΈΠΊΠΎΠΌ Π½Π° Π΅Π³ΠΎ ΠΊΠΎΠΌΠΏΡΡΡΠ΅ΡΠ΅. Π§ΡΠΎΠ±Ρ Π·Π°ΠΊΡΡΡΡ ΠΌΠ°ΠΊΡΠΈΠΌΡΠΌ ΠΎΠ±Π»Π°ΡΡΠ΅ΠΉ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΡ Π΄Π»Ρ Π·Π»ΠΎΡΠΌΡΡΠ»Π΅Π½Π½ΠΈΠΊΠ°, Π΄ΠΎΠ±Π°Π²ΡΡΠ΅ ΠΠΎΠ»ΠΈΡΠΈΠΊΡ Π±Π΅Π·ΠΎΠΏΠ°ΡΠ½ΠΎΡΡΠΈ ΡΠΎΠ΄Π΅ΡΠΆΠΈΠΌΠΎΠ³ΠΎ Π±ΡΠ°ΡΠ·Π΅ΡΠ° (Content Security Policy), ΡΡΠΎΠ±Ρ ΠΎΠ³ΡΠ°Π½ΠΈΡΠΈΡΡ ΠΊΠΎΠ½ΡΠ΅ΠΊΡΡ Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΡ.
ΠΡΡΠ°Π΅ΡΡΡ ΡΠ»ΡΡΠ°ΠΉ, ΠΊΠΎΠ³Π΄Π° Π·Π»ΠΎΡΠΌΡΡΠ»Π΅Π½Π½ΠΈΠΊ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅Ρ ΠΊΠΎΠ½ΡΠ΅ΠΊΡΡ ΠΏΡΠΎΡΠΌΠΎΡΡΠ° ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Ρ Π² ΠΊΠ°ΡΠ΅ΡΡΠ²Π΅ ΠΏΡΠΎΠΊΡΠΈ-ΡΠ΅ΡΠ²Π΅ΡΠ°, ΡΡΠΎΠ±Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ ΡΠ΅Π»Π΅Π²ΠΎΠ΅ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ ΡΠ΅ΡΠ΅Π· Π»Π΅Π³ΠΈΡΠΈΠΌΠ½ΠΎΠ³ΠΎ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Ρ, Π½ΠΎ Content Security Policy ΠΌΠΎΠΆΠ΅Ρ ΠΏΡΠ΅Π΄ΠΎΡΠ²ΡΠ°ΡΠΈΡΡ ΡΠ²ΡΠ·Ρ Ρ Π½Π΅ΠΏΡΠ΅Π΄Π²ΠΈΠ΄Π΅Π½Π½ΡΠΌΠΈ Π΄ΠΎΠΌΠ΅Π½Π°ΠΌΠΈ.
Π’Π°ΠΊΠΆΠ΅ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ ΡΠ΅Π°Π»ΠΈΠ·ΠΎΠ²Π°ΡΡ ΡΠ»ΡΠΆΠ±Ρ Π°ΡΡΠ΅Π½ΡΠΈΡΠΈΠΊΠ°ΡΠΈΠΈ ΡΠ°ΠΊΠΈΠΌ ΠΎΠ±ΡΠ°Π·ΠΎΠΌ, ΡΡΠΎΠ±Ρ ΡΠΎΠΊΠ΅Π½ Π²ΡΠ΄Π°Π²Π°Π»ΡΡ Π²Π½ΡΡΡΠΈ Π·Π°ΡΠΈΡΠ΅Π½Π½ΠΎΠ³ΠΎ ΡΠ°ΠΉΠ»Π° cookie, Π½ΠΎ Π² ΡΡΠΎΠΌ ΡΠ»ΡΡΠ°Π΅ Π΄ΠΎΠ»ΠΆΠ½Π° Π±ΡΡΡ ΡΠ΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Π½Π° Π·Π°ΡΠΈΡΠ° ΠΎΡ CSRF.
Π¨Π°Π±Π»ΠΎΠ½Ρ
Π‘ΠΎΠ·Π΄Π°Π΄ΠΈΠΌ ΠΏΡΠΎΡΡΠΎΠΉ ΡΠ°Π±Π»ΠΎΠ½, ΠΊΠΎΡΠΎΡΡΠΉ Π±ΡΠ΄Π΅Ρ ΠΏΡΠ΅Π΄ΡΡΠ°Π²Π»ΡΡΡ Π½Π°ΡΠ΅ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅.
Π‘ΠΎΠ·Π΄Π°ΠΉΡΠ΅ ΡΠ°ΠΉΠ» Ρ ΠΈΠΌΠ΅Π½Π΅ΠΌ templates/index.html ΠΈ Π΄ΠΎΠ±Π°Π²ΡΡΠ΅ ΡΠ»Π΅Π΄ΡΡΡΠΈΠΉ ΠΊΠΎΠ΄ Π² Π½Π΅Π³ΠΎ:
Π Π΄Π°Π»ΡΠ½Π΅ΠΉΡΠ΅ΠΌ ΠΌΡ Π΄ΠΎΠ±Π°Π²ΠΈΠΌ Π½Π΅ΠΊΠΎΡΠΎΡΡΠΉ angular ΠΊΠΎΠ΄ Π² Π΄Π°Π½Π½ΡΠΉ ΡΠ°ΠΉΠ».
Π¨Π°Π³ 2. ΠΏΠΎΠ»Π΅Π·Π½Π°Ρ Π½Π°Π³ΡΡΠ·ΠΊΠ°
ΠΠΎ Π²ΡΠΎΡΠΎΠΌ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½ΡΠ΅ JSON Π²Π΅Π±-ΡΠΎΠΊΠ΅Π½ΠΎΠ² (payload) Ρ ΡΠ°Π½ΠΈΡΡΡ ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΡ ΠΎ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Π΅, ΠΊΠΎΡΠΎΡΡΡ ΡΠ΅ΡΠ²Π΅Ρ Π°ΡΡΠ΅Π½ΡΠΈΡΠΈΠΊΠ°ΡΠΈΠΈ ΠΏΠ΅ΡΠ΅Π΄Π°Π΅Ρ ΡΠ΅ΡΠ²Π΅ΡΡ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ. Π‘ΡΠ°Π½Π΄Π°ΡΡ ΠΏΡΠ΅Π΄ΡΡΠΌΠ°ΡΡΠΈΠ²Π°Π΅Ρ Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΎ Π½Π΅ΠΎΠ±ΡΠ·Π°ΡΠ΅Π»ΡΠ½ΡΡ Π΄Π»Ρ Π·Π°ΠΏΠΎΠ»Π½Π΅Π½ΠΈΡ ΡΠ»ΡΠΆΠ΅Π±Π½ΡΡ ΠΏΠΎΠ»Π΅ΠΉ, Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ:
exp
β ΡΡΠΎΠΊ ΠΎΠΊΠΎΠ½ΡΠ°Π½ΠΈΡ Π΄Π΅ΠΉΡΡΠ²ΠΈΡ ΡΠΎΠΊΠ΅Π½Π°;nbf
β Π²ΡΠ΅ΠΌΡ Π½Π°ΡΠ°Π»Π° Π΄Π΅ΠΉΡΡΠ²ΠΈΡ ΡΠΎΠΊΠ΅Π½Π°;sub
β ΡΠ½ΠΈΠΊΠ°Π»ΡΠ½ΡΠΉ ΠΈΠ΄Π΅Π½ΡΠΈΡΠΈΠΊΠ°ΡΠΎΡ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Ρ.
ΠΡΠ»ΠΈ ΠΈΠ½ΡΠ΅ΡΠ΅ΡΠ½ΠΎ, ΠΏΠΎΡΠΈΡΠ°ΠΉΡΠ΅ Π±ΠΎΠ»Π΅Π΅ ΠΏΠΎΠ΄ΡΠΎΠ±Π½ΠΎΠ΅ ΠΎΠΏΠΈΡΠ°Π½ΠΈΠ΅ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½ΡΠ° ΠΏΠΎΠ»Π΅Π·Π½ΠΎΠΉ Π½Π°Π³ΡΡΠ·ΠΊΠΈ Π² ΠΠΈΠΊΠΈΠΏΠ΅Π΄ΠΈΠΈ.
ΠΠΎΠΌΠΈΠΌΠΎ ΡΡΠ°Π½Π΄Π°ΡΡΠ½ΡΡ ΠΊΠ»ΡΡΠ΅ΠΉ, ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠ΅ΡΠ΅Π΄Π°Π²Π°ΡΡ Π»ΡΠ±ΡΠ΅ Π΄Π°Π½Π½ΡΠ΅:
Π¨Π°Π³ 3. ΠΏΠΎΠ΄ΠΏΠΈΡΡ
ΠΠΎΠ΄ΠΏΠΈΡΡ ΡΠΎΠΊΠ΅Π½Π° Π²ΡΡΠΈΡΠ»ΡΠ΅ΡΡΡ Π½Π° ΠΎΡΠ½ΠΎΠ²Π΅ Π΅Π³ΠΎ Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΊΠ° ΠΈ ΠΏΠΎΠ»Π΅Π·Π½ΠΎΠΉ Π½Π°Π³ΡΡΠ·ΠΊΠΈ ΠΏΠΎ ΡΠ»Π΅Π΄ΡΡΡΠ΅ΠΉ ΡΡ Π΅ΠΌΠ΅ (ΠΏΡΠ΅Π²Π΄ΠΎΠΊΠΎΠ΄):
data = base64urlEncode(header) "." base64urlEncode(payload) hashedData = hash(data, secret) signature = base64urlEncode(hashedData)
Π Π°Π·Π±Π΅ΡΠ΅ΠΌ ΠΏΠΎ ΡΠ°Π³Π°ΠΌ:
// header eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9 // payload eyJ1c2VySWQiOiJiMDhmODZhZi0zNWRhLTQ4ZjItOGZhYi1jZWYzOTA0NjYwYmQifQ
// signature -xN_h82PHVTCMA9vdoHrcZxH-x5mb11y1537t3rGzcM
Π¨Π°Π³ 4. cΠ±ΠΎΡΠΊΠ° jwt
Π£ Π½Π°Ρ ΡΠΆΠ΅ Π΅ΡΡΡ Π²ΡΠ΅ Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΡΠ΅ Π±Π»ΠΎΠΊΠΈ Π΄Π»Ρ ΡΠΎΠ·Π΄Π°Π½ΠΈΡ ΡΠΎΠΊΠ΅Π½Π°:
- Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΎΠΊ Ρ ΡΠΊΠ°Π·Π°Π½ΠΈΠ΅ΠΌ Π°Π»Π³ΠΎΡΠΈΡΠΌΠ° Ρ Π΅ΡΠΈΡΠΎΠ²Π°Π½ΠΈΡ;
- ΠΏΠΎΠ»Π΅Π·Π½Π°Ρ Π½Π°Π³ΡΡΠ·ΠΊΠ° Ρ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»ΡΡΠΊΠΈΠΌΠΈ Π΄Π°Π½Π½ΡΠΌΠΈ;
- ΡΠ³Π΅Π½Π΅ΡΠΈΡΠΎΠ²Π°Π½Π½Π°Ρ ΠΏΠΎΠ΄ΠΏΠΈΡΡ.
Π’Π΅ΠΏΠ΅ΡΡ ΠΌΠΎΠΆΠ½ΠΎ ΡΠΎΠ±ΡΠ°ΡΡ ΠΈΠ· Π½ΠΈΡ ΠΏΠΎΠ»Π½ΠΎΡΠ΅Π½Π½ΡΠΉ Π²Π΅Π±-ΡΠΎΠΊΠ΅Π½ ΠΏΠΎ ΡΠΆΠ΅ Π·Π½Π°ΠΊΠΎΠΌΠΎΠΉ ΡΡ Π΅ΠΌΠ΅:
header.payload.signature
ΠΠ°Π³ΠΎΠ»ΠΎΠ²ΠΎΠΊ ΠΈ ΠΏΠΎΠ»Π΅Π·Π½Π°Ρ Π½Π°Π³ΡΡΠ·ΠΊΠ° ΠΏΡΠ΅Π΄Π²Π°ΡΠΈΡΠ΅Π»ΡΠ½ΠΎ ΠΊΠΎΠ΄ΠΈΡΡΡΡΡΡ Π² Base64URL, Π° ΠΏΠΎΠ΄ΠΏΠΈΡΡ ΡΠΆΠ΅ Π² ΠΏΡΠ°Π²ΠΈΠ»ΡΠ½ΠΎΠΌ ΡΠΎΡΠΌΠ°ΡΠ΅:
// JWT eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1nij9.eyJ1c2VySWQiOiJiMDhmODZhZi0zNWRhltq4zjitogzhyi1jzwyzota0njywymqifq.-xN_h82PHVTCMA9vdoHrcZxH-x5mb11y1537t3rGzcM
ΠΡΠΎΡ ΡΠΎΠΊΠ΅Π½ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Ρ ΠΏΠΎΠ»ΡΡΠΈΡ ΠΎΡ ΡΠ΅ΡΠ²Π΅ΡΠ° Π°ΡΡΠ΅Π½ΡΠΈΡΠΈΠΊΠ°ΡΠΈΠΈ ΠΈ Π±ΡΠ΄Π΅Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ ΠΏΡΠΈ Π·Π°ΠΏΡΠΎΡΠ°Ρ ΠΊ ΡΠ΅ΡΠ²Π΅ΡΡ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ.
ΠΡΠΎ stateless-ΠΌΠ΅Ρ Π°Π½ΠΈΠ·ΠΌ
Π ΠΎΡΠ»ΠΈΡΠΈΠ΅ ΠΎΡ cookie-ΠΏΠΎΠ΄Ρ
ΠΎΠ΄Π°, Π²Π°ΡΠΈΠ°Π½Ρ Ρ ΡΠΎΠΊΠ΅Π½Π°ΠΌΠΈ Π½Π΅ ΠΈΠΌΠ΅Π΅Ρ ΡΠΎΡΡΠΎΡΠ½ΠΈΡ. ΠΡΠΎ ΠΎΠ·Π½Π°ΡΠ°Π΅Ρ, ΡΡΠΎ ΠΎΠ½ Π½Π΅ ΡΠΎΡ
ΡΠ°Π½ΡΠ΅Ρ Π½ΠΈΠΊΠ°ΠΊΠΎΠΉ
ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΠΈ ΠΎ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»ΡΡ
Π² Π±Π°Π·Π΅ Π΄Π°Π½Π½ΡΡ
ΠΈΠ»ΠΈ Π½Π° ΡΠ΅ΡΠ²Π΅ΡΠ΅. Π‘Π΅ΡΠ²Π΅Ρ ΠΎΡΠ²Π΅ΡΠ°Π΅Ρ ΡΠΎΠ»ΡΠΊΠΎ Π·Π°
ΡΠΎΠ·Π΄Π°Π½ΠΈΠ΅ ΠΈ ΠΏΡΠΎΠ²Π΅ΡΠΊΡ ΡΠΎΠΊΠ΅Π½ΠΎΠ², ΡΡΠΎ ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ΅Ρ ΡΠ΅Π°Π»ΠΈΠ·ΠΎΠ²ΡΠ²Π°ΡΡ Π±ΠΎΠ»Π΅Π΅ ΠΌΠ°ΡΡΡΠ°Π±ΠΈΡΡΠ΅ΠΌΡΠ΅
ΡΠ΅ΡΠ΅Π½ΠΈΡ.
ΠΡΠΎ ΠΏΠΎΠ»Π½ΠΎΡΡΡΡ Π°Π²ΡΠΎΠΌΠ°ΡΠΈΠ·ΠΈΡΠΎΠ²Π°Π½Π½ΡΠΉ ΠΏΡΠΎΡΠ΅ΡΡ
ΠΡΠ»ΠΈ Π²Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΡΠ΅ ΡΠ°ΠΉΠ»Ρ
cookie Π΄Π»Ρ Π°ΡΡΠ΅Π½ΡΠΈΡΠΈΠΊΠ°ΡΠΈΠΈ, Π²Π°ΠΌ Π½Π΅ Π½ΡΠΆΠ½ΠΎ Π½ΠΈΡΠ΅Π³ΠΎ Π±ΠΎΠ»ΡΡΠ΅ ΡΠ°Π·ΡΠ°Π±Π°ΡΡΠ²Π°ΡΡ Π΄Π»Ρ
Π΄ΠΎΠ±Π°Π²Π»Π΅Π½ΠΈΡ ΠΈΡ
Π² Π·Π°ΠΏΡΠΎΡΡ. ΠΡΠ°ΡΠ·Π΅Ρ ΠΏΠΎΠ·Π°Π±ΠΎΡΠΈΡΡΡ ΠΎΠ± ΠΎΠ±ΡΠ°Π±ΠΎΡΠΊΠ΅ ΡΠ°ΠΉΠ»ΠΎΠ² ΠΈ
Π°Π²ΡΠΎΠΌΠ°ΡΠΈΡΠ΅ΡΠΊΠΈ Π΄ΠΎΠ±Π°Π²ΠΈΡ cookie Π΄Π»Ρ Π²ΡΠ΅Ρ
Π·Π°ΠΏΡΠΎΡΠΎΠ².
Π₯ΠΎΡΡ ΡΡΠΎΡ Π°Π²ΡΠΎΠΌΠ°ΡΠΈΠ·ΠΈΡΠΎΠ²Π°Π½Π½ΡΠΉ ΠΏΡΠΎΡΠ΅ΡΡ ΠΎΠ±Π»Π΅Π³ΡΠ°Π΅Ρ ΡΡΡΠ΄ ΡΠ°Π·ΡΠ°Π±ΠΎΡΡΠΈΠΊΠΎΠ², Π·Π΄Π΅ΡΡ Π΅ΡΡΡ Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΎ Π½Π΅Π΄ΠΎΡΡΠ°ΡΠΊΠΎΠ². ΠΠ°ΠΏΡΠΈΠΌΠ΅Ρ, Π½Π΅ΠΊΠΎΡΠΎΡΡΠ΅ Π·Π°ΠΏΡΠΎΡΡ Π½Π΅ ΡΡΠ΅Π±ΡΡΡ Π½ΠΈΠΊΠ°ΠΊΠΎΠΉ Π°ΡΡΠ΅Π½ΡΠΈΡΠΈΠΊΠ°ΡΠΈΠΈ, Π½ΠΎ ΠΏΡΠΈ ΡΠ°ΠΊΠΎΠΌ ΠΏΠΎΠ΄Ρ ΠΎΠ΄Π΅ ΠΊΡΠΊΠΈ Π±ΡΠ΄ΡΡ ΠΎΡΠΏΡΠ°Π²Π»ΡΡΡΡΡ Π² ΠΊΠ°ΠΆΠ΄ΠΎΠΌ Π·Π°ΠΏΡΠΎΡΠ΅.
ΠΡΠΎΠΌΠ΅ ΡΠΎΠ³ΠΎ, ΠΏΡΠΈ CSRF-Π°ΡΠ°ΠΊΠ΅
Π·Π»ΠΎΠ΄Π΅ΠΈ ΠΌΠΎΠ³ΡΡ Π²ΠΎΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡΡΡ ΡΡΠΈΠΌ ΠΌΠ΅Ρ
Π°Π½ΠΈΠ·ΠΌΠΎΠΌ, ΡΡΠΎΠ±Ρ Π·Π°ΡΡΠ°Π²ΠΈΡΡ Π±ΡΠ°ΡΠ·Π΅Ρ ΠΎΡΠΏΡΠ°Π²ΠΈΡΡ Π·Π°ΠΏΡΠΎΡΡ Ρ cookie Π½Π° ΠΌΠΎΡΠ΅Π½Π½ΠΈΡΠ΅ΡΠΊΠΈΠ΅ ΡΠ°ΠΉΡΡ.
Π―Π²Π½ΠΎΠ΅ Π°Π½Π½ΡΠ»ΠΈΡΠΎΠ²Π°Π½ΠΈΠ΅ ΡΠΎΠΊΠ΅Π½Π° ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Π΅ΠΌ
ΠΠΎΡΠΊΠΎΠ»ΡΠΊΡ ΡΠΎΠΊΠ΅Π½ ΡΡΠ°Π½ΠΎΠ²ΠΈΡΡΡ Π½Π΅Π΄Π΅ΠΉΡΡΠ²ΠΈΡΠ΅Π»ΡΠ½ΡΠΌ ΡΠΎΠ»ΡΠΊΠΎ ΠΏΠΎΡΠ»Π΅ ΠΈΡΡΠ΅ΡΠ΅Π½ΠΈΡ ΡΡΠΎΠΊΠ° Π΅Π³ΠΎ Π΄Π΅ΠΉΡΡΠ²ΠΈΡ, Ρ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Ρ Π½Π΅Ρ Π²ΡΡΡΠΎΠ΅Π½Π½ΠΎΠΉ ΡΡΠ½ΠΊΡΠΈΠΈ, ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡΡΠ΅ΠΉ ΡΠ²Π½ΠΎ ΠΎΡΠΌΠ΅Π½ΠΈΡΡ Π΄Π΅ΠΉΡΡΠ²ΠΈΠ΅ ΡΠΎΠΊΠ΅Π½Π°. Π’Π°ΠΊΠΈΠΌ ΠΎΠ±ΡΠ°Π·ΠΎΠΌ, Π² ΡΠ»ΡΡΠ°Π΅ ΠΊΡΠ°ΠΆΠΈ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Ρ Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ ΡΠ°ΠΌ ΠΎΡΠΎΠ·Π²Π°ΡΡ ΡΠΎΠΊΠ΅Π½ ΠΈ Π·Π°ΡΠ΅ΠΌ Π·Π°Π±Π»ΠΎΠΊΠΈΡΠΎΠ²Π°ΡΡ Π°ΡΠ°ΠΊΡΡΡΠ΅Π³ΠΎ.
ΠΠ΄Π½ΠΈΠΌ ΠΈΠ· ΡΠΏΠΎΡΠΎΠ±ΠΎΠ² Π·Π°ΡΠΈΡΡ ΡΠ²Π»ΡΠ΅ΡΡΡ Π²Π½Π΅Π΄ΡΠ΅Π½ΠΈΠ΅ ΡΠ΅ΡΠ½ΠΎΠ³ΠΎ ΡΠΏΠΈΡΠΊΠ° ΡΠΎΠΊΠ΅Π½ΠΎΠ², ΠΊΠΎΡΠΎΡΡΠΉ Π±ΡΠ΄Π΅Ρ ΠΏΡΠΈΠ³ΠΎΠ΄Π΅Π½ Π΄Π»Ρ ΠΈΠΌΠΈΡΠ°ΡΠΈΠΈ ΡΡΠ½ΠΊΡΠΈΠΈ Β«Π²ΡΡ ΠΎΠ΄ ΠΈΠ· ΡΠΈΡΡΠ΅ΠΌΡΒ», ΡΡΡΠ΅ΡΡΠ²ΡΡΡΠ΅ΠΉ Π² ΡΡΠ°Π΄ΠΈΡΠΈΠΎΠ½Π½ΠΎΠΉ ΡΠΈΡΡΠ΅ΠΌΠ΅ ΡΠ΅Π°Π½ΡΠΎΠ².
Π ΡΠ΅ΡΠ½ΠΎΠΌ ΡΠΏΠΈΡΠΊΠ΅ Π±ΡΠ΄Π΅Ρ Ρ ΡΠ°Π½ΠΈΡΡΡΡ ΡΠ±ΠΎΡΠ½ΠΈΠΊ (Π² ΠΊΠΎΠ΄ΠΈΡΠΎΠ²ΠΊΠ΅ SHA-256 Π² HEX) ΡΠΎΠΊΠ΅Π½Π° Ρ Π΄Π°ΡΠΎΠΉ Π°Π½Π½ΡΠ»ΠΈΡΠΎΠ²Π°Π½ΠΈΡ, ΠΊΠΎΡΠΎΡΠ°Ρ Π΄ΠΎΠ»ΠΆΠ½Π° ΠΏΡΠ΅Π²ΡΡΠ°ΡΡ ΡΡΠΎΠΊ Π΄Π΅ΠΉΡΡΠ²ΠΈΡ Π²ΡΠ΄Π°Π½Π½ΠΎΠ³ΠΎ ΡΠΎΠΊΠ΅Π½Π°.
ΠΠΎΠ³Π΄Π° ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Ρ Ρ ΠΎΡΠ΅Ρ Β«Π²ΡΠΉΡΠΈΒ», ΠΎΠ½ Π²ΡΠ·ΡΠ²Π°Π΅Ρ ΡΠΏΠ΅ΡΠΈΠ°Π»ΡΠ½ΡΡ ΡΠ»ΡΠΆΠ±Ρ, ΠΊΠΎΡΠΎΡΠ°Ρ Π΄ΠΎΠ±Π°Π²Π»ΡΠ΅Ρ ΠΏΡΠ΅Π΄ΠΎΡΡΠ°Π²Π»Π΅Π½Π½ΡΠΉ ΡΠΎΠΊΠ΅Π½ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Ρ Π² ΡΠ΅ΡΠ½ΡΠΉ ΡΠΏΠΈΡΠΎΠΊ, ΡΡΠΎ ΠΏΡΠΈΠ²ΠΎΠ΄ΠΈΡ ΠΊ Π½Π΅ΠΌΠ΅Π΄Π»Π΅Π½Π½ΠΎΠΌΡ Π°Π½Π½ΡΠ»ΠΈΡΠΎΠ²Π°Π½ΠΈΡ ΡΠΎΠΊΠ΅Π½Π° Π΄Π»Ρ Π΄Π°Π»ΡΠ½Π΅ΠΉΡΠ΅Π³ΠΎ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΡ Π² ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΈ.
ΠΡΠΈΠΌΠ΅Ρ ΡΠ΅Π°Π»ΠΈΠ·Π°ΡΠΈΠΈ:
Π₯ΡΠ°Π½ΠΈΠ»ΠΈΡΠ΅ ΡΠ΅ΡΠ½ΠΎΠ³ΠΎ ΡΠΏΠΈΡΠΊΠ°:ΠΠ»Ρ ΡΠ΅Π½ΡΡΠ°Π»ΠΈΠ·ΠΎΠ²Π°Π½Π½ΠΎΠ³ΠΎ Ρ ΡΠ°Π½Π΅Π½ΠΈΡ ΡΠ΅ΡΠ½ΠΎΠ³ΠΎ ΡΠΏΠΈΡΠΊΠ° Π±ΡΠ΄Π΅Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡΡΡ Π±Π°Π·Π° Π΄Π°Π½Π½ΡΡ ΡΠΎ ΡΠ»Π΅Π΄ΡΡΡΠ΅ΠΉ ΡΡΡΡΠΊΡΡΡΠΎΠΉ:
create table if not exists revoked_token(jwt_token_digest varchar(255) primary key,
revokation_date timestamp default now());
Π£ΠΏΡΠ°Π²Π»Π΅Π½ΠΈΠ΅ Π°Π½Π½ΡΠ»ΠΈΡΠΎΠ²Π°Π½ΠΈΡΠΌΠΈ ΡΠΎΠΊΠ΅Π½ΠΎΠ²:
// ΠΠΎΠ½ΡΡΠΎΠ»ΠΈΡΠΎΠ²Π°Π½ΠΈΠ΅ ΠΎΡΠΊΠ°ΡΠ° ΡΠΎΠΊΠ΅Π½Π° (logout).
// ΠΡΠΏΠΎΠ»ΡΠ·ΡΠΉΡΠ΅ ΠΠ, ΡΡΠΎΠ±Ρ ΡΠ°Π·ΡΠ΅ΡΠΈΡΡ Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΈΠΌ ΡΠΊΠ·Π΅ΠΌΠΏΠ»ΡΡΠ°ΠΌ ΠΏΡΠΎΠ²Π΅ΡΡΡΡ
// ΠΎΡΠΎΠ·Π²Π°Π½Π½ΡΠΉ ΡΠΎΠΊΠ΅Π½ ΠΈ ΡΠ°Π·ΡΠ΅ΡΠΈΡΡ ΠΎΡΠΈΡΡΠΊΡ Π½Π° ΡΡΠΎΠ²Π½Π΅ ΡΠ΅Π½ΡΡΠ°Π»ΠΈΠ·ΠΎΠ²Π°Π½Π½ΠΎΠΉ ΠΠ.
public class TokenRevoker {
// ΠΠΎΠ΄ΠΊΠ»ΡΡΠ΅Π½ΠΈΠ΅ ΠΊ ΠΠ
@Resource("jdbc/storeDS")
private DataSource storeDS;
// ΠΡΠΎΠ²Π΅ΡΠΊΠ° ΡΠ²Π»ΡΠ΅ΡΡΡ Π»ΠΈ ΡΠΎΠΊΠ΅Π½ ΠΎΡΠΎΠ·Π²Π°Π½Π½ΡΠΌ
public boolean isTokenRevoked(String jwtInHex) throws Exception {
boolean tokenIsPresent = false;
if (jwtInHex != null && !jwtInHex.trim().isEmpty()) {
// ΠΠ΅ΠΊΠΎΠ΄ΠΈΡΠΎΠ²Π°Π½ΠΈΠ΅ ΡΠΎΠΊΠ΅Π½Π°
byte[] cipheredToken = DatatypeConverter.parseHexBinary(jwtInHex);
// ΠΡΡΠΈΡΠ»Π΅Π½ΠΈΠ΅ SHA256 ΠΎΡ ΡΠΎΠΊΠ΅Π½Π°
MessageDigest digest = MessageDigest.getInstance("SHA-256");
byte[] cipheredTokenDigest = digest.digest(cipheredToken);
String jwtTokenDigestInHex = DatatypeConverter.printHexBinary(cipheredTokenDigest);
// ΠΠΎΠΈΡΠΊ ΡΠΎΠΊΠ΅Π½Π° Π² ΠΠ
try (Connection con = this.storeDS.getConnection()) {
String query = "select jwt_token_digest from revoked_token where jwt_token_digest = ?";
try (PreparedStatement pStatement = con.prepareStatement(query)) {
pStatement.setString(1, jwtTokenDigestInHex);
try (ResultSet rSet = pStatement.executeQuery()) {
tokenIsPresent = rSet.next();
}
}
}
}
return tokenIsPresent;
}
// ΠΠΎΠ±Π°Π²Π»Π΅Π½ΠΈΠ΅ Π·Π°ΠΊΠΎΠ΄ΠΈΡΠΎΠ²Π°Π½Π½ΠΎΠ³ΠΎ Π² HEX ΡΠΎΠΊΠ΅Π½Π° Π² ΡΠ°Π±Π»ΠΈΡΠ° ΠΎΡΠΎΠ·Π²Π°Π½Π½ΡΡ
ΡΠΎΠΊΠ΅Π½ΠΎΠ²
public void revokeToken(String jwtInHex) throws Exception {
if (jwtInHex != null && !jwtInHex.trim().isEmpty()) {
// ΠΠ΅ΠΊΠΎΠ΄ΠΈΡΠΎΠ²Π°Π½ΠΈΠ΅ ΡΠΎΠΊΠ΅Π½Π°
byte[] cipheredToken = DatatypeConverter.parseHexBinary(jwtInHex);
// ΠΡΡΠΈΡΠ»Π΅Π½ΠΈΠ΅ SHA256 ΠΎΡ ΡΠΎΠΊΠ΅Π½Π°
MessageDigest digest = MessageDigest.getInstance("SHA-256");
byte[] cipheredTokenDigest = digest.digest(cipheredToken);
String jwtTokenDigestInHex = DatatypeConverter.printHexBinary(cipheredTokenDigest);
// ΠΡΠΎΠ²Π΅ΡΠΊΠ° Π½Π° Π½Π°Π»ΠΈΡΠΈΠ΅ ΡΠΎΠΊΠ΅Π½Π° ΡΠΆΠ΅ Π² ΠΠ ΠΈ Π·Π°Π½Π΅ΡΠ΅Π½ΠΈΠ΅ Π² ΠΠ Π²
// ΠΎΠ±ΡΠ°ΡΠ½ΠΎΠΌ ΡΠ»ΡΡΠ°Π΅
if (!this.isTokenRevoked(jwtInHex)) {
try (Connection con = this.storeDS.getConnection()) {
String query = "insert into revoked_token(jwt_token_digest) values(?)";
int insertedRecordCount;
try (PreparedStatement pStatement = con.prepareStatement(query)) {
pStatement.setString(1, jwtTokenDigestInHex);
insertedRecordCount = pStatement.executeUpdate();
}
if (insertedRecordCount != 1) {
throw new IllegalStateException("Number of inserted record is invalid," " 1 expected but is " insertedRecordCount);
}
}
}
}
}
ΠΠ°ΠΊΠ»ΡΡΠ΅Π½ΠΈΠ΅
ΠΠΎΠ΄Ρ ΠΎΠ΄Ρ, ΠΎΡΠ½ΠΎΠ²Π°Π½Π½ΡΠ΅ Π½Π° ΡΠΎΠΊΠ΅Π½Π°Ρ ΠΈ ΡΠ°ΠΉΠ»Π°Ρ cookie β Π΄Π²Π° Π½Π°ΠΈΠ±ΠΎΠ»Π΅Π΅ ΡΠ°ΡΡΠΎ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΠΌΡΡ Π² Π²Π΅Π±-ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡΡ ΠΌΠ΅Ρ Π°Π½ΠΈΠ·ΠΌΠ° Π°ΡΡΠ΅Π½ΡΠΈΡΠΈΠΊΠ°ΡΠΈΠΈ. Π ΡΡΠΎΠΉ ΡΡΠ°ΡΡΠ΅ ΠΌΡ Π²ΡΡΡΠ½ΠΈΠ»ΠΈ, ΠΊΠ°ΠΊ ΠΎΠ½ΠΈ ΡΠ°Π±ΠΎΡΠ°ΡΡ, Π° ΡΠ°ΠΊΠΆΠ΅ ΡΠ°Π·ΠΎΠ±ΡΠ°Π»ΠΈ ΠΈΡ ΠΎΡΠΎΠ±Π΅Π½Π½ΠΎΡΡΠΈ, ΠΏΠ»ΡΡΡ ΠΈ ΠΌΠΈΠ½ΡΡΡ.
ΠΠΈ ΠΎΠ΄ΠΈΠ½ ΠΈΠ· ΡΡΠΈΡ
ΠΌΠ΅ΡΠΎΠ΄ΠΎΠ²
Π½Π΅ ΡΠ²Π»ΡΠ΅ΡΡΡ Π½Π° 100% ΡΠΎΠ²Π΅ΡΡΠ΅Π½Π½ΡΠΌ, ΠΈ ΠΊΠ°ΠΆΠ΄ΡΠΉ ΠΈΠΌΠ΅Π΅Ρ ΡΠ²ΠΎΠΈ Π½Π΅Π΄ΠΎΡΡΠ°ΡΠΊΠΈ. ΠΡΠΈ
Π²ΡΠ±ΠΎΡΠ΅ ΠΌΠ΅ΡΠΎΠ΄Π° Π°ΡΡΠ΅Π½ΡΠΈΡΠΈΠΊΠ°ΡΠΈΠΈ ΡΡΠΎΠΈΡ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ Π½Π°ΠΈΠ±ΠΎΠ»Π΅Π΅ ΡΠΎΠΎΡΠ²Π΅ΡΡΡΠ²ΡΡΡΠΈΠΉ ΡΡΠ΅Π±ΠΎΠ²Π°Π½ΠΈΡΠΌ ΠΏΡΠΎΠ΅ΠΊΡΠ° ΠΈ Π΄ΠΎΠΏΠΈΠ»ΠΈΡΡ Π΅Π³ΠΎ, Π° Π½Π΅ ΡΡΡΠ΅ΠΌΠΈΡΡΡΡ ΠΊ ΠΈΠ΄Π΅Π°Π»Ρ.
Π‘ΠΏΠ°ΡΠΈΠ±ΠΎ Π·Π° Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅!
***
ΠΠΎΠΏΠΎΠ»Π½ΠΈΡΠ΅Π»ΡΠ½ΡΠ΅ ΠΌΠ°ΡΠ΅ΡΠΈΠ°Π»Ρ: