--- /dev/null
+# OAuth2 Ρ ΠΏΠ°ΡΠΎΠ»Π΅ΠΌ (ΠΈ Ρ
Π΅ΡΠΈΡΠΎΠ²Π°Π½ΠΈΠ΅ΠΌ), Bearer Ρ JWT-ΡΠΎΠΊΠ΅Π½Π°ΠΌΠΈ
+
+Π’Π΅ΠΏΠ΅ΡΡ, ΠΊΠΎΠ³Π΄Π° Ρ Π½Π°Ρ ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½ ΠΏΡΠΎΡΠ΅ΡΡ ΠΎΠ±Π΅ΡΠΏΠ΅ΡΠ΅Π½ΠΈΡ Π±Π΅Π·ΠΎΠΏΠ°ΡΠ½ΠΎΡΡΠΈ, Π΄Π°Π²Π°ΠΉΡΠ΅ ΡΠ΄Π΅Π»Π°Π΅ΠΌ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Π΄Π΅ΠΉΡΡΠ²ΠΈΡΠ΅Π»ΡΠ½ΠΎ Π±Π΅Π·ΠΎΠΏΠ°ΡΠ½ΡΠΌ, ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΡ ΡΠΎΠΊΠ΅Π½Ρ <abbr title="JSON Web Tokens">JWT</abbr> ΠΈ Π±Π΅Π·ΠΎΠΏΠ°ΡΠ½ΠΎΠ΅ Ρ
Π΅ΡΠΈΡΠΎΠ²Π°Π½ΠΈΠ΅ ΠΏΠ°ΡΠΎΠ»Π΅ΠΉ.
+
+ΠΡΠΎΡ ΠΊΠΎΠ΄ ΠΌΠΎΠΆΠ½ΠΎ ΡΠ΅Π°Π»ΡΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ Π² ΡΠ²ΠΎΠ΅ΠΌ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΈ, ΡΠΎΡ
ΡΠ°Π½ΡΡΡ Ρ
ΡΡΠΈ ΠΏΠ°ΡΠΎΠ»Π΅ΠΉ Π² Π±Π°Π·Π΅ Π΄Π°Π½Π½ΡΡ
ΠΈ Ρ.Π΄.
+
+ΠΡ ΠΏΡΠΎΠ΄ΠΎΠ»ΠΆΠΈΠΌ ΡΠ°Π·Π±ΠΈΡΠ°ΡΡΡΡ, Π½Π°ΡΠΈΠ½Π°Ρ Ρ ΡΠΎΠ³ΠΎ ΠΌΠ΅ΡΡΠ°, Π½Π° ΠΊΠΎΡΠΎΡΠΎΠΌ ΠΎΡΡΠ°Π½ΠΎΠ²ΠΈΠ»ΠΈΡΡ Π² ΠΏΡΠ΅Π΄ΡΠ΄ΡΡΠ΅ΠΉ Π³Π»Π°Π²Π΅.
+
+## ΠΡΠΎ JWT
+
+JWT ΠΎΠ·Π½Π°ΡΠ°Π΅Ρ "JSON Web Tokens".
+
+ΠΡΠΎ ΡΡΠ°Π½Π΄Π°ΡΡ Π΄Π»Ρ ΠΊΠΎΠ΄ΠΈΡΠΎΠ²Π°Π½ΠΈΡ JSON-ΠΎΠ±ΡΠ΅ΠΊΡΠ° Π² Π²ΠΈΠ΄Π΅ Π΄Π»ΠΈΠ½Π½ΠΎΠΉ ΡΡΡΠΎΠΊΠΈ Π±Π΅Π· ΠΏΡΠΎΠ±Π΅Π»ΠΎΠ². ΠΡΠ³Π»ΡΠ΄ΠΈΡ ΡΡΠΎ ΡΠ»Π΅Π΄ΡΡΡΠΈΠΌ ΠΎΠ±ΡΠ°Π·ΠΎΠΌ:
+
+```
+eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c
+```
+
+ΠΠ½ Π½Π΅ Π·Π°ΡΠΈΡΡΠΎΠ²Π°Π½, ΠΏΠΎΡΡΠΎΠΌΡ Π»ΡΠ±ΠΎΠΉ ΡΠ΅Π»ΠΎΠ²Π΅ΠΊ ΠΌΠΎΠΆΠ΅Ρ Π²ΠΎΡΡΡΠ°Π½ΠΎΠ²ΠΈΡΡ ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΡ ΠΈΠ· Π΅Π³ΠΎ ΡΠΎΠ΄Π΅ΡΠΆΠΈΠΌΠΎΠ³ΠΎ.
+
+ΠΠΎ ΠΎΠ½ ΠΏΠΎΠ΄ΠΏΠΈΡΠ°Π½. Π‘Π»Π΅Π΄ΠΎΠ²Π°ΡΠ΅Π»ΡΠ½ΠΎ, ΠΊΠΎΠ³Π΄Π° Π²Ρ ΠΏΠΎΠ»ΡΡΠ°Π΅ΡΠ΅ ΡΠΎΠΊΠ΅Π½, ΠΊΠΎΡΠΎΡΡΠΉ Π²Ρ ΡΠΌΠΈΡΠΈΡΠΎΠ²Π°Π»ΠΈ (Π²ΡΠ΄Π°Π²Π°Π»ΠΈ), Π²Ρ ΠΌΠΎΠΆΠ΅ΡΠ΅ ΡΠ±Π΅Π΄ΠΈΡΡΡΡ, ΡΡΠΎ ΡΡΠΎ ΠΈΠΌΠ΅Π½Π½ΠΎ Π²Ρ Π΅Π³ΠΎ ΡΠΌΠΈΡΠΈΡΠΎΠ²Π°Π»ΠΈ.
+
+Π’Π°ΠΊΠΈΠΌ ΠΎΠ±ΡΠ°Π·ΠΎΠΌ, ΠΌΠΎΠΆΠ½ΠΎ ΡΠΎΠ·Π΄Π°ΡΡ ΡΠΎΠΊΠ΅Π½ ΡΠΎ ΡΡΠΎΠΊΠΎΠΌ Π΄Π΅ΠΉΡΡΠ²ΠΈΡ, ΡΠΊΠ°ΠΆΠ΅ΠΌ, 1 Π½Π΅Π΄Π΅Π»Ρ. Π ΠΊΠΎΠ³Π΄Π° ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Ρ Π²Π΅ΡΠ½Π΅ΡΡΡ Π½Π° ΡΠ»Π΅Π΄ΡΡΡΠΈΠΉ Π΄Π΅Π½Ρ Ρ ΡΠ΅ΠΌ ΠΆΠ΅ ΡΠΎΠΊΠ΅Π½ΠΎΠΌ, Π²Ρ Π±ΡΠ΄Π΅ΡΠ΅ Π·Π½Π°ΡΡ, ΡΡΠΎ ΠΎΠ½ Π²ΡΠ΅ Π΅ΡΠ΅ Π°Π²ΡΠΎΡΠΈΠ·ΠΈΡΠΎΠ²Π°Π½ Π² Π²Π°ΡΠ΅ΠΉ ΡΠΈΡΡΠ΅ΠΌΠ΅.
+
+Π§Π΅ΡΠ΅Π· Π½Π΅Π΄Π΅Π»Ρ ΡΡΠΎΠΊ Π΄Π΅ΠΉΡΡΠ²ΠΈΡ ΡΠΎΠΊΠ΅Π½Π° ΠΈΡΡΠ΅ΡΠ΅Ρ, ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Ρ Π½Π΅ Π±ΡΠ΄Π΅Ρ Π°Π²ΡΠΎΡΠΈΠ·ΠΎΠ²Π°Π½ ΠΈ Π΅ΠΌΡ ΠΏΡΠΈΠ΄Π΅ΡΡΡ Π·Π°Π½ΠΎΠ²ΠΎ Π²Ρ
ΠΎΠ΄ΠΈΡΡ Π² ΡΠΈΡΡΠ΅ΠΌΡ, ΡΡΠΎΠ±Ρ ΠΏΠΎΠ»ΡΡΠΈΡΡ Π½ΠΎΠ²ΡΠΉ ΡΠΎΠΊΠ΅Π½. Π Π΅ΡΠ»ΠΈ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Ρ (ΠΈΠ»ΠΈ ΡΡΠ΅ΡΡΠ΅ Π»ΠΈΡΠΎ) ΠΏΠΎΠΏΡΡΠ°Π΅ΡΡΡ ΠΌΠΎΠ΄ΠΈΡΠΈΡΠΈΡΠΎΠ²Π°ΡΡ ΡΠΎΠΊΠ΅Π½, ΡΡΠΎΠ±Ρ ΠΈΠ·ΠΌΠ΅Π½ΠΈΡΡ ΡΡΠΎΠΊ Π΄Π΅ΠΉΡΡΠ²ΠΈΡ, Π²Ρ ΡΠΌΠΎΠΆΠ΅ΡΠ΅ ΡΡΠΎ ΠΎΠ±Π½Π°ΡΡΠΆΠΈΡΡ, ΠΏΠΎΡΠΊΠΎΠ»ΡΠΊΡ ΠΏΠΎΠ΄ΠΏΠΈΡΠΈ Π½Π΅ Π±ΡΠ΄ΡΡ ΡΠΎΠ²ΠΏΠ°Π΄Π°ΡΡ.
+
+ΠΡΠ»ΠΈ Π²Ρ Ρ
ΠΎΡΠΈΡΠ΅ ΠΏΠΎΠΈΠ³ΡΠ°ΡΡ Ρ JWT-ΡΠΎΠΊΠ΅Π½Π°ΠΌΠΈ ΠΈ ΠΏΠΎΡΠΌΠΎΡΡΠ΅ΡΡ, ΠΊΠ°ΠΊ ΠΎΠ½ΠΈ ΡΠ°Π±ΠΎΡΠ°ΡΡ, ΠΏΠΎΡΠΌΠΎΡΡΠΈΡΠ΅ <a href="https://jwt.io/" class="external-link" target="_blank">https://jwt.io</a>.
+
+## Π£ΡΡΠ°Π½ΠΎΠ²ΠΊΠ° `PyJWT`
+
+ΠΠ°ΠΌ Π½Π΅ΠΎΠ±Ρ
ΠΎΠ΄ΠΈΠΌΠΎ ΡΡΡΠ°Π½ΠΎΠ²ΠΈΡΡ `pyjwt` Π΄Π»Ρ Π³Π΅Π½Π΅ΡΠ°ΡΠΈΠΈ ΠΈ ΠΏΡΠΎΠ²Π΅ΡΠΊΠΈ JWT-ΡΠΎΠΊΠ΅Π½ΠΎΠ² Π½Π° ΡΠ·ΡΠΊΠ΅ Python.
+
+Π£Π±Π΅Π΄ΠΈΡΠ΅ΡΡ, ΡΡΠΎ Π²Ρ ΡΠΎΠ·Π΄Π°Π»ΠΈ [Π²ΠΈΡΡΡΠ°Π»ΡΠ½ΠΎΠ΅ ΠΎΠΊΡΡΠΆΠ΅Π½ΠΈΠ΅](../../virtual-environments.md){.internal-link target=_blank}, Π°ΠΊΡΠΈΠ²ΠΈΡΡΠΉΡΠ΅ Π΅Π³ΠΎ, Π° Π·Π°ΡΠ΅ΠΌ ΡΡΡΠ°Π½ΠΎΠ²ΠΈΡΠ΅ `pyjwt`:
+
+<div class="termy">
+
+```console
+$ pip install pyjwt
+
+---> 100%
+```
+
+</div>
+
+/// info | ΠΠΎΠΏΠΎΠ»Π½ΠΈΡΠ΅Π»ΡΠ½Π°Ρ ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΡ
+ΠΡΠ»ΠΈ Π²Ρ ΠΏΠ»Π°Π½ΠΈΡΡΠ΅ΡΠ΅ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ Π°Π»Π³ΠΎΡΠΈΡΠΌΡ ΡΠΈΡΡΠΎΠ²ΠΎΠΉ ΠΏΠΎΠ΄ΠΏΠΈΡΠΈ, ΡΠ°ΠΊΠΈΠ΅ ΠΊΠ°ΠΊ RSA ΠΈΠ»ΠΈ ECDSA, Π²Π°ΠΌ ΡΠ»Π΅Π΄ΡΠ΅Ρ ΡΡΡΠ°Π½ΠΎΠ²ΠΈΡΡ Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡΡ Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠΈ ΠΊΡΠΈΠΏΡΠΎΠ³ΡΠ°ΡΠΈΠΈ `pyjwt[crypto]`.
+
+ΠΠΎΠ΄ΡΠΎΠ±Π½Π΅Π΅ ΠΎΠ± ΡΡΠΎΠΌ ΠΌΠΎΠΆΠ½ΠΎ ΠΏΡΠΎΡΠΈΡΠ°ΡΡ Π² <a href=Β«https://pyjwt.readthedocs.io/en/latest/installation.htmlΒ» class=Β«external-linkΒ» target=Β«_blankΒ»>Π΄ΠΎΠΊΡΠΌΠ΅Π½ΡΠ°ΡΠΈΠΈ ΠΏΠΎ ΡΡΡΠ°Π½ΠΎΠ²ΠΊΠ΅ PyJWT</a>.
+///
+
+## Π₯Π΅ΡΠΈΡΠΎΠ²Π°Π½ΠΈΠ΅ ΠΏΠ°ΡΠΎΠ»Π΅ΠΉ
+
+"Π₯Π΅ΡΠΈΡΠΎΠ²Π°Π½ΠΈΠ΅" ΠΎΠ·Π½Π°ΡΠ°Π΅Ρ ΠΏΡΠ΅ΠΎΠ±ΡΠ°Π·ΠΎΠ²Π°Π½ΠΈΠ΅ Π½Π΅ΠΊΠΎΡΠΎΡΠΎΠ³ΠΎ ΡΠΎΠ΄Π΅ΡΠΆΠΈΠΌΠΎΠ³ΠΎ (Π² Π΄Π°Π½Π½ΠΎΠΌ ΡΠ»ΡΡΠ°Π΅ ΠΏΠ°ΡΠΎΠ»Ρ) Π² ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°ΡΠ΅Π»ΡΠ½ΠΎΡΡΡ Π±Π°ΠΉΡΠΎΠ² (ΠΏΡΠΎΡΡΠΎ ΡΡΡΠΎΠΊΡ), ΠΊΠΎΡΠΎΡΠ°Ρ Π²ΡΠ³Π»ΡΠ΄ΠΈΡ ΠΊΠ°ΠΊ ΡΠ°ΡΠ°Π±Π°ΡΡΠΈΠ½Π°.
+
+ΠΠ°ΠΆΠ΄ΡΠΉ ΡΠ°Π·, ΠΊΠΎΠ³Π΄Π° Π²Ρ ΠΏΠ΅ΡΠ΅Π΄Π°Π΅ΡΠ΅ ΡΠΎΡΠ½ΠΎ ΡΠ°ΠΊΠΎΠ΅ ΠΆΠ΅ ΡΠΎΠ΄Π΅ΡΠΆΠΈΠΌΠΎΠ΅ (ΡΠΎΡΠ½ΠΎ ΡΠ°ΠΊΠΎΠΉ ΠΆΠ΅ ΠΏΠ°ΡΠΎΠ»Ρ), Π²Ρ ΠΏΠΎΠ»ΡΡΠ°Π΅ΡΠ΅ ΡΠΎΡΠ½ΠΎ ΡΠ°ΠΊΡΡ ΠΆΠ΅ ΡΠ°ΡΠ°Π±Π°ΡΡΠΈΠ½Ρ.
+
+ΠΠΎ ΠΏΡΠ΅ΠΎΠ±ΡΠ°Π·ΠΎΠ²Π°ΡΡ ΡΠ°ΡΠ°Π±Π°ΡΡΠΈΠ½Ρ ΠΎΠ±ΡΠ°ΡΠ½ΠΎ Π² ΠΏΠ°ΡΠΎΠ»Ρ Π½Π΅Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ.
+
+### ΠΠ»Ρ ΡΠ΅Π³ΠΎ Π½ΡΠΆΠ½ΠΎ Ρ
Π΅ΡΠΈΡΠΎΠ²Π°Π½ΠΈΠ΅ ΠΏΠ°ΡΠΎΠ»Π΅ΠΉ
+
+ΠΡΠ»ΠΈ Π²Π°ΡΠ° Π±Π°Π·Π° Π΄Π°Π½Π½ΡΡ
Π±ΡΠ΄Π΅Ρ ΡΠΊΡΠ°Π΄Π΅Π½Π°, ΡΠΎ Π²ΠΎΡ Π½Π΅ ΠΏΠΎΠ»ΡΡΠΈΡ ΠΏΠ°ΡΠΎΠ»ΠΈ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Π΅ΠΉ Π² ΠΎΡΠΊΡΡΡΠΎΠΌ Π²ΠΈΠ΄Π΅, Π° ΡΠΎΠ»ΡΠΊΠΎ ΠΈΡ
Ρ
ΡΡΠΈ.
+
+Π’Π°ΠΊΠΈΠΌ ΠΎΠ±ΡΠ°Π·ΠΎΠΌ, Π²ΠΎΡ Π½Π΅ ΡΠΌΠΎΠΆΠ΅Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ ΡΡΠΎΡ ΠΏΠ°ΡΠΎΠ»Ρ Π² Π΄ΡΡΠ³ΠΎΠΉ ΡΠΈΡΡΠ΅ΠΌΠ΅ (ΠΏΠΎΡΠΊΠΎΠ»ΡΠΊΡ ΠΌΠ½ΠΎΠ³ΠΈΠ΅ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»ΠΈ Π²Π΅Π·Π΄Π΅ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΡΡ ΠΎΠ΄ΠΈΠ½ ΠΈ ΡΠΎΡ ΠΆΠ΅ ΠΏΠ°ΡΠΎΠ»Ρ, ΡΡΠΎ Π±ΡΠ»ΠΎ Π±Ρ ΠΎΠΏΠ°ΡΠ½ΠΎ).
+
+## Π£ΡΡΠ°Π½ΠΎΠ²ΠΊΠ° `passlib`
+
+PassLib - ΡΡΠΎ ΠΎΡΠ»ΠΈΡΠ½ΡΠΉ ΠΏΠ°ΠΊΠ΅Ρ Python Π΄Π»Ρ ΡΠ°Π±ΠΎΡΡ Ρ Ρ
ΡΡΠ°ΠΌΠΈ ΠΏΠ°ΡΠΎΠ»Π΅ΠΉ.
+
+ΠΠ½ ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΈΠ²Π°Π΅Ρ ΠΌΠ½ΠΎΠΆΠ΅ΡΡΠ²ΠΎ Π±Π΅Π·ΠΎΠΏΠ°ΡΠ½ΡΡ
Π°Π»Π³ΠΎΡΠΈΡΠΌΠΎΠ² Ρ
Π΅ΡΠΈΡΠΎΠ²Π°Π½ΠΈΡ ΠΈ ΡΡΠΈΠ»ΠΈΡ Π΄Π»Ρ ΡΠ°Π±ΠΎΡΡ Ρ Π½ΠΈΠΌΠΈ.
+
+Π Π΅ΠΊΠΎΠΌΠ΅Π½Π΄ΡΠ΅ΠΌΡΠΉ Π°Π»Π³ΠΎΡΠΈΡΠΌ - "Bcrypt".
+
+Π£Π±Π΅Π΄ΠΈΡΠ΅ΡΡ, ΡΡΠΎ Π²Ρ ΡΠΎΠ·Π΄Π°Π»ΠΈ ΠΈ Π°ΠΊΡΠΈΠ²ΠΈΡΠΎΠ²Π°Π»ΠΈ Π²ΠΈΡΡΡΠ°Π»ΡΠ½ΠΎΠ΅ ΠΎΠΊΡΡΠΆΠ΅Π½ΠΈΠ΅, ΠΈ Π·Π°ΡΠ΅ΠΌ ΡΡΡΠ°Π½ΠΎΠ²ΠΈΡΠ΅ PassLib Π²ΠΌΠ΅ΡΡΠ΅ Ρ Bcrypt:
+
+<div class="termy">
+
+```console
+$ pip install "passlib[bcrypt]"
+
+---> 100%
+```
+
+</div>
+
+/// tip | ΠΠΎΠ΄ΡΠΊΠ°Π·ΠΊΠ°
+Π‘ ΠΏΠΎΠΌΠΎΡΡΡ `passlib` ΠΌΠΎΠΆΠ½ΠΎ Π΄Π°ΠΆΠ΅ Π½Π°ΡΡΡΠΎΠΈΡΡ Π΅Π³ΠΎ Π½Π° ΡΡΠ΅Π½ΠΈΠ΅ ΠΏΠ°ΡΠΎΠ»Π΅ΠΉ, ΡΠΎΠ·Π΄Π°Π½Π½ΡΡ
**Django**, ΠΏΠ»Π°Π³ΠΈΠ½ΠΎΠΌ Π±Π΅Π·ΠΎΠΏΠ°ΡΠ½ΠΎΡΡΠΈ **Flask** ΠΈΠ»ΠΈ ΠΌΠ½ΠΎΠ³ΠΈΠΌΠΈ Π΄ΡΡΠ³ΠΈΠΌΠΈ Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠ°ΠΌΠΈ.
+
+Π’Π°ΠΊΠΈΠΌ ΠΎΠ±ΡΠ°Π·ΠΎΠΌ, Π²Ρ ΡΠΌΠΎΠΆΠ΅ΡΠ΅, Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ, ΡΠΎΠ²ΠΌΠ΅ΡΡΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ ΠΎΠ΄Π½ΠΈ ΠΈ ΡΠ΅ ΠΆΠ΅ Π΄Π°Π½Π½ΡΠ΅ ΠΈΠ· ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ Django Π² Π±Π°Π·Π΅ Π΄Π°Π½Π½ΡΡ
Ρ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ΠΌ FastAPI. ΠΠ»ΠΈ ΠΏΠΎΡΡΠ΅ΠΏΠ΅Π½Π½ΠΎ ΠΌΠΈΠ³ΡΠΈΡΠΎΠ²Π°ΡΡ Django-ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅, ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΡ ΡΡ ΠΆΠ΅ Π±Π°Π·Ρ Π΄Π°Π½Π½ΡΡ
.
+
+ΠΡΠΈ ΡΡΠΎΠΌ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»ΠΈ ΡΠΌΠΎΠ³ΡΡ ΠΎΠ΄Π½ΠΎΠ²ΡΠ΅ΠΌΠ΅Π½Π½ΠΎ Π²Ρ
ΠΎΠ΄ΠΈΡΡ Π² ΡΠΈΡΡΠ΅ΠΌΡ ΠΊΠ°ΠΊ ΠΈΠ· ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ Django, ΡΠ°ΠΊ ΠΈ ΠΈΠ· ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ **FastAPI**.
+///
+
+## Π₯Π΅ΡΠΈΡΠΎΠ²Π°Π½ΠΈΠ΅ ΠΈ ΠΏΡΠΎΠ²Π΅ΡΠΊΠ° ΠΏΠ°ΡΠΎΠ»Π΅ΠΉ
+
+ΠΠΌΠΏΠΎΡΡΠΈΡΡΠΉΡΠ΅ Π½Π΅ΠΎΠ±Ρ
ΠΎΠ΄ΠΈΠΌΡΠ΅ ΠΈΠ½ΡΡΡΡΠΌΠ΅Π½ΡΡ ΠΈΠ· `passlib`.
+
+Π‘ΠΎΠ·Π΄Π°ΠΉΡΠ΅ "ΠΊΠΎΠ½ΡΠ΅ΠΊΡΡ" PassLib. ΠΠΌΠ΅Π½Π½ΠΎ ΠΎΠ½ Π±ΡΠ΄Π΅Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡΡΡ Π΄Π»Ρ Ρ
ΡΡΠΈΡΠΎΠ²Π°Π½ΠΈΡ ΠΈ ΠΏΡΠΎΠ²Π΅ΡΠΊΠΈ ΠΏΠ°ΡΠΎΠ»Π΅ΠΉ.
+
+/// tip | ΠΠΎΠ΄ΡΠΊΠ°Π·ΠΊΠ°
+ΠΠΎΠ½ΡΠ΅ΠΊΡΡ PassLib ΡΠ°ΠΊΠΆΠ΅ ΠΈΠΌΠ΅Π΅Ρ ΡΡΠ½ΠΊΡΠΈΠΎΠ½Π°Π»ΡΠ½ΠΎΡΡΡ Π΄Π»Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΡ ΡΠ°Π·Π»ΠΈΡΠ½ΡΡ
Π°Π»Π³ΠΎΡΠΈΡΠΌΠΎΠ² Ρ
Π΅ΡΠΈΡΠΎΠ²Π°Π½ΠΈΡ, Π² ΡΠΎΠΌ ΡΠΈΡΠ»Π΅ ΠΈ ΡΡΡΠ°ΡΠ΅Π²ΡΠΈΡ
, ΡΠΎΠ»ΡΠΊΠΎ Π΄Π»Ρ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΠΈ ΠΈΡ
ΠΏΡΠΎΠ²Π΅ΡΠΊΠΈ ΠΈ Ρ.Π΄.
+
+ΠΠ°ΠΏΡΠΈΠΌΠ΅Ρ, Π²Ρ ΠΌΠΎΠΆΠ΅ΡΠ΅ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ Π΅Π³ΠΎ Π΄Π»Ρ ΡΡΠ΅Π½ΠΈΡ ΠΈ ΠΏΡΠΎΠ²Π΅ΡΠΊΠΈ ΠΏΠ°ΡΠΎΠ»Π΅ΠΉ, ΡΠ³Π΅Π½Π΅ΡΠΈΡΠΎΠ²Π°Π½Π½ΡΡ
Π΄ΡΡΠ³ΠΎΠΉ ΡΠΈΡΡΠ΅ΠΌΠΎΠΉ (Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ, Django), Π½ΠΎ Ρ
ΡΡΠΈΡΠΎΠ²Π°ΡΡ Π²ΡΠ΅ Π½ΠΎΠ²ΡΠ΅ ΠΏΠ°ΡΠΎΠ»ΠΈ Π΄ΡΡΠ³ΠΈΠΌ Π°Π»Π³ΠΎΡΠΈΡΠΌΠΎΠΌ, Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ Bcrypt.
+
+Π ΠΏΡΠΈ ΡΡΠΎΠΌ Π±ΡΡΡ ΡΠΎΠ²ΠΌΠ΅ΡΡΠΈΠΌΡΠΌ ΡΠΎ Π²ΡΠ΅ΠΌΠΈ ΡΡΠΈΠΌΠΈ ΡΠΈΡΡΠ΅ΠΌΠ°ΠΌΠΈ.
+///
+
+Π‘ΠΎΠ·Π΄Π°ΠΉΡΠ΅ ΡΠ»ΡΠΆΠ΅Π±Π½ΡΡ ΡΡΠ½ΠΊΡΠΈΡ Π΄Π»Ρ Ρ
ΡΡΠΈΡΠΎΠ²Π°Π½ΠΈΡ ΠΏΠ°ΡΠΎΠ»Ρ, ΠΏΠΎΡΡΡΠΏΠ°ΡΡΠ΅Π³ΠΎ ΠΎΡ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Ρ.
+
+Π Π·Π°ΡΠ΅ΠΌ ΡΠΎΠ·Π΄Π°ΠΉΡΠ΅ Π΄ΡΡΠ³ΡΡ - Π΄Π»Ρ ΠΏΡΠΎΠ²Π΅ΡΠΊΠΈ ΡΠΎΠΎΡΠ²Π΅ΡΡΡΠ²ΠΈΡ ΠΏΠΎΠ»ΡΡΠ΅Π½Π½ΠΎΠ³ΠΎ ΠΏΠ°ΡΠΎΠ»Ρ ΠΈ Ρ
ΡΠ°Π½ΠΈΠΌΠΎΠ³ΠΎ Ρ
ΡΡΠ°.
+
+Π Π΅ΡΠ΅ ΠΎΠ΄Π½Ρ - Π΄Π»Ρ Π°ΡΡΠ΅Π½ΡΠΈΡΠΈΠΊΠ°ΡΠΈΠΈ ΠΈ Π²ΠΎΠ·Π²ΡΠ°ΡΠ° ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Ρ.
+
+{* ../../docs_src/security/tutorial004_an_py310.py hl[8,49,56:57,60:61,70:76] *}
+
+/// note | Π’Π΅Ρ
Π½ΠΈΡΠ΅ΡΠΊΠΈΠ΅ Π΄Π΅ΡΠ°Π»ΠΈ
+ΠΡΠ»ΠΈ ΠΏΡΠΎΠ²Π΅ΡΠΈΡΡ Π½ΠΎΠ²ΡΡ (ΡΠ°Π»ΡΡΠΈΠ²ΡΡ) Π±Π°Π·Ρ Π΄Π°Π½Π½ΡΡ
`fake_users_db`, ΡΠΎ ΠΌΠΎΠΆΠ½ΠΎ ΡΠ²ΠΈΠ΄Π΅ΡΡ, ΠΊΠ°ΠΊ ΡΠ΅ΠΏΠ΅ΡΡ Π²ΡΠ³Π»ΡΠ΄ΠΈΡ Ρ
ΡΡΠΈΡΠΎΠ²Π°Π½Π½ΡΠΉ ΠΏΠ°ΡΠΎΠ»Ρ: `"$2b$12$EixZaYVK1fsbw1ZfbX3OXePaWxn96p36WQoeG6Lruj3vjPGga31lW"`.
+///
+
+## Π Π°Π±ΠΎΡΠ° Ρ JWT ΡΠΎΠΊΠ΅Π½Π°ΠΌΠΈ
+
+ΠΠΌΠΏΠΎΡΡΠΈΡΡΠΉΡΠ΅ ΡΡΡΠ°Π½ΠΎΠ²Π»Π΅Π½Π½ΡΠ΅ ΠΌΠΎΠ΄ΡΠ»ΠΈ.
+
+Π‘ΠΎΠ·Π΄Π°ΠΉΡΠ΅ ΡΠ»ΡΡΠ°ΠΉΠ½ΡΠΉ ΡΠ΅ΠΊΡΠ΅ΡΠ½ΡΠΉ ΠΊΠ»ΡΡ, ΠΊΠΎΡΠΎΡΡΠΉ Π±ΡΠ΄Π΅Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡΡΡ Π΄Π»Ρ ΠΏΠΎΠ΄ΠΏΠΈΡΠΈ JWT-ΡΠΎΠΊΠ΅Π½ΠΎΠ².
+
+ΠΠ»Ρ Π³Π΅Π½Π΅ΡΠ°ΡΠΈΠΈ Π±Π΅Π·ΠΎΠΏΠ°ΡΠ½ΠΎΠ³ΠΎ ΡΠ»ΡΡΠ°ΠΉΠ½ΠΎΠ³ΠΎ ΡΠ΅ΠΊΡΠ΅ΡΠ½ΠΎΠ³ΠΎ ΠΊΠ»ΡΡΠ° ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠΉΡΠ΅ ΠΊΠΎΠΌΠ°Π½Π΄Ρ:
+
+<div class="termy">
+
+```console
+$ openssl rand -hex 32
+
+09d25e094faa6ca2556c818166b7a9563b93f7099f6f0f4caa6cf63b88e8d3e7
+```
+
+</div>
+
+Π ΡΠΊΠΎΠΏΠΈΡΡΠΉΡΠ΅ ΠΏΠΎΠ»ΡΡΠ΅Π½Π½ΡΠΉ ΡΠ΅Π·ΡΠ»ΡΡΠ°Ρ Π² ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΡΡ `SECRET_KEY` (Π½Π΅ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠΉΡΠ΅ ΡΠΎΡ, ΡΡΠΎ Π² ΠΏΡΠΈΠΌΠ΅ΡΠ΅).
+
+Π‘ΠΎΠ·Π΄Π°ΠΉΡΠ΅ ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΡΡ `ALGORITHM` Ρ Π°Π»Π³ΠΎΡΠΈΡΠΌΠΎΠΌ, ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΠΌΡΠΌ Π΄Π»Ρ ΠΏΠΎΠ΄ΠΏΠΈΡΠΈ JWT-ΡΠΎΠΊΠ΅Π½Π°, ΠΈ ΡΡΡΠ°Π½ΠΎΠ²ΠΈΡΠ΅ Π΄Π»Ρ Π½Π΅Π΅ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ `"HS256"`.
+
+Π‘ΠΎΠ·Π΄Π°ΠΉΡΠ΅ ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΡΡ Π΄Π»Ρ ΡΡΠΎΠΊΠ° Π΄Π΅ΠΉΡΡΠ²ΠΈΡ ΡΠΎΠΊΠ΅Π½Π°.
+
+ΠΠΏΡΠ΅Π΄Π΅Π»ΠΈΡΠ΅ Pydantic Model, ΠΊΠΎΡΠΎΡΠ°Ρ Π±ΡΠ΄Π΅Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡΡΡ Π΄Π»Ρ ΡΠΎΡΠΌΠΈΡΠΎΠ²Π°Π½ΠΈΡ ΠΎΡΠ²Π΅ΡΠ° Π½Π° Π·Π°ΠΏΡΠΎΡ Π½Π° ΠΏΠΎΠ»ΡΡΠ΅Π½ΠΈΠ΅ ΡΠΎΠΊΠ΅Π½Π°.
+
+Π‘ΠΎΠ·Π΄Π°ΠΉΡΠ΅ ΡΠ»ΡΠΆΠ΅Π±Π½ΡΡ ΡΡΠ½ΠΊΡΠΈΡ Π΄Π»Ρ Π³Π΅Π½Π΅ΡΠ°ΡΠΈΠΈ Π½ΠΎΠ²ΠΎΠ³ΠΎ ΡΠΎΠΊΠ΅Π½Π° Π΄ΠΎΡΡΡΠΏΠ°.
+
+{* ../../docs_src/security/tutorial004_an_py310.py hl[4,7,13:15,29:31,79:87] *}
+
+## ΠΠ±Π½ΠΎΠ²Π»Π΅Π½ΠΈΠ΅ Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡΠ΅ΠΉ
+
+ΠΠ±Π½ΠΎΠ²ΠΈΡΠ΅ `get_current_user` Π΄Π»Ρ ΠΏΠΎΠ»ΡΡΠ΅Π½ΠΈΡ ΡΠΎΠ³ΠΎ ΠΆΠ΅ ΡΠΎΠΊΠ΅Π½Π°, ΡΡΠΎ ΠΈ ΡΠ°Π½ΡΡΠ΅, Π½ΠΎ Π½Π° ΡΡΠΎΡ ΡΠ°Π· Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠ΅ΠΌ JWT-ΡΠΎΠΊΠ΅Π½ΠΎΠ².
+
+ΠΠ΅ΠΊΠΎΠ΄ΠΈΡΡΠΉΡΠ΅ ΠΏΠΎΠ»ΡΡΠ΅Π½Π½ΡΠΉ ΡΠΎΠΊΠ΅Π½, ΠΏΡΠΎΠ²Π΅ΡΡΡΠ΅ Π΅Π³ΠΎ ΠΈ Π²Π΅ΡΠ½ΠΈΡΠ΅ ΡΠ΅ΠΊΡΡΠ΅Π³ΠΎ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Ρ.
+
+ΠΡΠ»ΠΈ ΡΠΎΠΊΠ΅Π½ Π½Π΅Π΄Π΅ΠΉΡΡΠ²ΠΈΡΠ΅Π»Π΅Π½, ΡΠΎ ΡΡΠ°Π·Ρ ΠΆΠ΅ Π²Π΅ΡΠ½ΠΈΡΠ΅ HTTP-ΠΎΡΠΈΠ±ΠΊΡ.
+
+{* ../../docs_src/security/tutorial004_an_py310.py hl[90:107] *}
+
+## ΠΠ±Π½ΠΎΠ²Π»Π΅Π½ΠΈΠ΅ *ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΈ ΠΏΡΡΠΈ* `/token`
+
+Π‘ΠΎΠ·Π΄Π°ΠΉΡΠ΅ `timedelta` ΡΠΎ Π²ΡΠ΅ΠΌΠ΅Π½Π΅ΠΌ ΠΈΡΡΠ΅ΡΠ΅Π½ΠΈΡ ΡΡΠΎΠΊΠ° Π΄Π΅ΠΉΡΡΠ²ΠΈΡ ΡΠΎΠΊΠ΅Π½Π°.
+
+Π‘ΠΎΠ·Π΄Π°ΠΉΡΠ΅ ΡΠ΅Π°Π»ΡΠ½ΡΠΉ ΡΠΎΠΊΠ΅Π½ Π΄ΠΎΡΡΡΠΏΠ° JWT ΠΈ Π²Π΅ΡΠ½ΠΈΡΠ΅ Π΅Π³ΠΎ
+
+{* ../../docs_src/security/tutorial004_an_py310.py hl[118:133] *}
+
+### Π’Π΅Ρ
Π½ΠΈΡΠ΅ΡΠΊΠΈΠ΅ ΠΏΠΎΠ΄ΡΠΎΠ±Π½ΠΎΡΡΠΈ ΠΎ JWT ΠΊΠ»ΡΡΠ΅ `sub`
+
+Π ΡΠΏΠ΅ΡΠΈΡΠΈΠΊΠ°ΡΠΈΠΈ JWT Π³ΠΎΠ²ΠΎΡΠΈΡΡΡ, ΡΡΠΎ ΡΡΡΠ΅ΡΡΠ²ΡΠ΅Ρ ΠΊΠ»ΡΡ `sub`, ΡΠΎΠ΄Π΅ΡΠΆΠ°ΡΠΈΠΉ ΡΡΠ±ΡΠ΅ΠΊΡ ΡΠΎΠΊΠ΅Π½Π°.
+
+ΠΠ³ΠΎ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠ΅ Π½Π΅ΠΎΠ±ΡΠ·Π°ΡΠ΅Π»ΡΠ½ΠΎ, Π½ΠΎ ΡΡΠΎ ΠΈΠΌΠ΅Π½Π½ΠΎ ΡΠΎ ΠΌΠ΅ΡΡΠΎ, ΠΊΡΠ΄Π° Π²Ρ Π΄ΠΎΠ»ΠΆΠ½Ρ ΠΏΠΎΠΌΠ΅ΡΡΠΈΡΡ ΠΈΠ΄Π΅Π½ΡΠΈΡΠΈΠΊΠ°ΡΠΎΡ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Ρ, ΠΈ ΠΏΠΎΡΡΠΎΠΌΡ ΠΌΡ Π·Π΄Π΅ΡΡ Π΅Π³ΠΎ ΠΈ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΠΌ.
+
+JWT ΠΌΠΎΠΆΠ΅Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡΡΡ ΠΈ Π΄Π»Ρ Π΄ΡΡΠ³ΠΈΡ
ΡΠ΅Π»Π΅ΠΉ, ΠΏΠΎΠΌΠΈΠΌΠΎ ΠΈΠ΄Π΅Π½ΡΠΈΡΠΈΠΊΠ°ΡΠΈΠΈ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Ρ ΠΈ ΠΏΡΠ΅Π΄ΠΎΡΡΠ°Π²Π»Π΅Π½ΠΈΡ Π΅ΠΌΡ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΠΈ Π²ΡΠΏΠΎΠ»Π½ΡΡΡ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΈ Π½Π΅ΠΏΠΎΡΡΠ΅Π΄ΡΡΠ²Π΅Π½Π½ΠΎ Π² Π²Π°ΡΠ΅ΠΌ API.
+
+ΠΠ°ΠΏΡΠΈΠΌΠ΅Ρ, Π²Ρ ΠΌΠΎΠ³Π»ΠΈ Π±Ρ ΠΎΠΏΡΠ΅Π΄Π΅Π»ΠΈΡΡ "Π°Π²ΡΠΎΠΌΠΎΠ±ΠΈΠ»Ρ" ΠΈΠ»ΠΈ "Π·Π°ΠΏΠΈΡΡ Π² Π±Π»ΠΎΠ³Π΅".
+
+ΠΠ°ΡΠ΅ΠΌ Π²Ρ ΠΌΠΎΠ³Π»ΠΈ Π±Ρ Π΄ΠΎΠ±Π°Π²ΠΈΡΡ ΠΏΡΠ°Π²Π° Π΄ΠΎΡΡΡΠΏΠ° ΠΊ ΡΡΠΎΠΉ ΡΡΡΠ½ΠΎΡΡΠΈ, Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ "ΡΠΏΡΠ°Π²Π»ΡΡΡ" (Π΄Π»Ρ Π°Π²ΡΠΎΠΌΠΎΠ±ΠΈΠ»Ρ) ΠΈΠ»ΠΈ "ΡΠ΅Π΄Π°ΠΊΡΠΈΡΠΎΠ²Π°ΡΡ" (Π΄Π»Ρ Π±Π»ΠΎΠ³Π°).
+
+ΠΠ°ΡΠ΅ΠΌ Π²Ρ ΠΌΠΎΠ³Π»ΠΈ Π±Ρ ΠΏΠ΅ΡΠ΅Π΄Π°ΡΡ ΡΡΠΎΡ JWT-ΡΠΎΠΊΠ΅Π½ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Ρ (ΠΈΠ»ΠΈ Π±ΠΎΡΡ), ΠΈ ΠΎΠ½ΠΈ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π»ΠΈ Π±Ρ Π΅Π³ΠΎ Π΄Π»Ρ Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΡ ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½Π½ΡΡ
Π΄Π΅ΠΉΡΡΠ²ΠΈΠΉ (ΡΠΏΡΠ°Π²Π»Π΅Π½ΠΈΠ΅ Π°Π²ΡΠΎΠΌΠΎΠ±ΠΈΠ»Π΅ΠΌ ΠΈΠ»ΠΈ ΡΠ΅Π΄Π°ΠΊΡΠΈΡΠΎΠ²Π°Π½ΠΈΠ΅ Π·Π°ΠΏΠΈΡΡ Π² Π±Π»ΠΎΠ³Π΅), Π΄Π°ΠΆΠ΅ Π½Π΅ ΠΈΠΌΠ΅Ρ ΡΡΠ΅ΡΠ½ΠΎΠΉ Π·Π°ΠΏΠΈΡΠΈ, ΠΏΡΠΎΡΡΠΎ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΡ JWT-ΡΠΎΠΊΠ΅Π½, ΡΠ³Π΅Π½Π΅ΡΠΈΡΠΎΠ²Π°Π½Π½ΡΠΉ Π²Π°ΡΠΈΠΌ API.
+
+ΠΡΠΏΠΎΠ»ΡΠ·ΡΡ ΡΡΠΈ ΠΈΠ΄Π΅ΠΈ, JWT ΠΌΠΎΠΆΠ½ΠΎ ΠΏΡΠΈΠΌΠ΅Π½ΡΡΡ Π΄Π»Ρ Π³ΠΎΡΠ°Π·Π΄ΠΎ Π±ΠΎΠ»Π΅Π΅ ΡΠ»ΠΎΠΆΠ½ΡΡ
ΡΡΠ΅Π½Π°ΡΠΈΠ΅Π².
+
+Π ΠΎΡΠ΄Π΅Π»ΡΠ½ΡΡ
ΡΠ»ΡΡΠ°ΡΡ
Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΎ ΡΡΡΠ½ΠΎΡΡΠ΅ΠΉ ΠΌΠΎΠ³ΡΡ ΠΈΠΌΠ΅ΡΡ ΠΎΠ΄ΠΈΠ½ ΠΈ ΡΠΎΡ ΠΆΠ΅ ΠΈΠ΄Π΅Π½ΡΠΈΡΠΈΠΊΠ°ΡΠΎΡ, ΡΠΊΠ°ΠΆΠ΅ΠΌ, `foo` (ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Ρ `foo`, Π°Π²ΡΠΎΠΌΠΎΠ±ΠΈΠ»Ρ `foo` ΠΈ Π·Π°ΠΏΠΈΡΡ Π² Π±Π»ΠΎΠ³Π΅ `foo`).
+
+ΠΠΎΡΡΠΎΠΌΡ, ΡΡΠΎΠ±Ρ ΠΈΠ·Π±Π΅ΠΆΠ°ΡΡ ΠΊΠΎΠ»Π»ΠΈΠ·ΠΈΠΉ ΠΈΠ΄Π΅Π½ΡΠΈΡΠΈΠΊΠ°ΡΠΎΡΠΎΠ², ΠΏΡΠΈ ΡΠΎΠ·Π΄Π°Π½ΠΈΠΈ JWT-ΡΠΎΠΊΠ΅Π½Π° Π΄Π»Ρ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Ρ ΠΌΠΎΠΆΠ½ΠΎ Π΄ΠΎΠ±Π°Π²ΠΈΡΡ ΠΏΡΠ΅ΡΠΈΠΊΡ `username` ΠΊ Π·Π½Π°ΡΠ΅Π½ΠΈΡ ΠΊΠ»ΡΡΠ° `sub`. Π’Π°ΠΊΠΈΠΌ ΠΎΠ±ΡΠ°Π·ΠΎΠΌ, Π² Π΄Π°Π½Π½ΠΎΠΌ ΠΏΡΠΈΠΌΠ΅ΡΠ΅ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ `sub` Π±ΡΠ»ΠΎ Π±Ρ `username:johndoe`.
+
+ΠΠ°ΠΆΠ½ΠΎ ΠΏΠΎΠΌΠ½ΠΈΡΡ, ΡΡΠΎ ΠΊΠ»ΡΡ `sub` Π΄ΠΎΠ»ΠΆΠ΅Π½ ΠΈΠΌΠ΅ΡΡ ΡΠ½ΠΈΠΊΠ°Π»ΡΠ½ΡΠΉ ΠΈΠ΄Π΅Π½ΡΠΈΡΠΈΠΊΠ°ΡΠΎΡ Π΄Π»Ρ Π²ΡΠ΅Π³ΠΎ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ ΠΈ ΠΏΡΠ΅Π΄ΡΡΠ°Π²Π»ΡΡΡ ΡΠΎΠ±ΠΎΠΉ ΡΡΡΠΎΠΊΡ.
+
+## ΠΡΠΎΠ²Π΅ΡΠΊΠ° Π² Π΄Π΅ΠΉΡΡΠ²ΠΈΠΈ
+
+ΠΠ°ΠΏΡΡΡΠΈΡΠ΅ ΡΠ΅ΡΠ²Π΅Ρ ΠΈ ΠΏΠ΅ΡΠ΅ΠΉΠ΄ΠΈΡΠ΅ ΠΊ Π΄ΠΎΠΊΡΠΌΠ΅Π½ΡΠ°ΡΠΈΠΈ: <a href="http://127.0.0.1:8000/docs" class="external-link" target="_blank">http://127.0.0.1:8000/docs</a>.
+
+ΠΡ ΡΠ²ΠΈΠ΄ΠΈΡΠ΅ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»ΡΡΠΊΠΈΠΉ ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡ Π²ΠΈΠ΄Π°:
+
+<img src="/img/tutorial/security/image07.png">
+
+ΠΡΠΎΠΉΠ΄ΠΈΡΠ΅ Π°Π²ΡΠΎΡΠΈΠ·Π°ΡΠΈΡ ΡΠ°ΠΊ ΠΆΠ΅, ΠΊΠ°ΠΊ Π΄Π΅Π»Π°Π»ΠΈ ΡΠ°Π½ΡΡΠ΅.
+
+ΠΡΠΏΠΎΠ»ΡΠ·ΡΡ ΡΡΠ΅ΡΠ½ΡΠ΅ Π΄Π°Π½Π½ΡΠ΅ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Ρ:
+
+Username: `johndoe`
+Password: `secret`
+
+/// check | ΠΠ°ΠΌΠ΅ΡΠΊΠ°
+ΠΠ±ΡΠ°ΡΠΈΡΠ΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅, ΡΡΠΎ Π½ΠΈΠ³Π΄Π΅ Π² ΠΊΠΎΠ΄Π΅ Π½Π΅ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΡΡΡ ΠΎΡΠΊΡΡΡΡΠΉ ΡΠ΅ΠΊΡΡ ΠΏΠ°ΡΠΎΠ»Ρ "`secret`", ΠΌΡ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΠΌ ΡΠΎΠ»ΡΠΊΠΎ Π΅Π³ΠΎ Ρ
ΡΡΠΈΡΠΎΠ²Π°Π½Π½ΡΡ Π²Π΅ΡΡΠΈΡ.
+///
+
+<img src="/img/tutorial/security/image08.png">
+
+ΠΡΠ·Π²Π°Π² ΡΠ½Π΄ΠΏΠΎΠΈΠ½Ρ `/users/me/`, Π²Ρ ΠΏΠΎΠ»ΡΡΠΈΡΠ΅ ΠΎΡΠ²Π΅Ρ Π² Π²ΠΈΠ΄Π΅:
+
+```JSON
+{
+ "username": "johndoe",
+ "email": "johndoe@example.com",
+ "full_name": "John Doe",
+ "disabled": false
+}
+```
+
+<img src="/img/tutorial/security/image09.png">
+
+ΠΡΠ»ΠΈ ΠΎΡΠΊΡΡΡΡ ΠΈΠ½ΡΡΡΡΠΌΠ΅Π½ΡΡ ΡΠ°Π·ΡΠ°Π±ΠΎΡΡΠΈΠΊΠ°, ΡΠΎ ΠΌΠΎΠΆΠ½ΠΎ ΡΠ²ΠΈΠ΄Π΅ΡΡ, ΡΡΠΎ ΠΏΠ΅ΡΠ΅Π΄Π°Π²Π°Π΅ΠΌΡΠ΅ Π΄Π°Π½Π½ΡΠ΅ Π²ΠΊΠ»ΡΡΠ°ΡΡ ΡΠΎΠ»ΡΠΊΠΎ ΡΠΎΠΊΠ΅Π½, ΠΏΠ°ΡΠΎΠ»Ρ ΠΏΠ΅ΡΠ΅Π΄Π°Π΅ΡΡΡ ΡΠΎΠ»ΡΠΊΠΎ Π² ΠΏΠ΅ΡΠ²ΠΎΠΌ Π·Π°ΠΏΡΠΎΡΠ΅ Π΄Π»Ρ Π°ΡΡΠ΅Π½ΡΠΈΡΠΈΠΊΠ°ΡΠΈΠΈ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Ρ ΠΈ ΠΏΠΎΠ»ΡΡΠ΅Π½ΠΈΡ ΡΠΎΠΊΠ΅Π½Π° Π΄ΠΎΡΡΡΠΏΠ°, Π½ΠΎ Π½Π΅ Π² ΠΏΠΎΡΠ»Π΅Π΄ΡΡΡΠΈΡ
:
+
+<img src="/img/tutorial/security/image10.png">
+
+/// note | Π’Π΅Ρ
Π½ΠΈΡΠ΅ΡΠΊΠ°Ρ ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΡ
+ΠΠ±ΡΠ°ΡΠΈΡΠ΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅ Π½Π° Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΎΠΊ `Authorization`, Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ ΠΊΠΎΡΠΎΡΠΎΠ³ΠΎ Π½Π°ΡΠΈΠ½Π°Π΅ΡΡΡ Ρ `Bearer`.
+///
+
+## ΠΡΠΎΠ΄Π²ΠΈΠ½ΡΡΠΎΠ΅ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠ΅ `scopes`
+
+Π OAuth2 ΡΡΡΠ΅ΡΡΠ²ΡΠ΅Ρ ΠΏΠΎΠ½ΡΡΠΈΠ΅ "Π΄ΠΈΠ°ΠΏΠ°Π·ΠΎΠ½Ρ" ("`scopes`").
+
+Π‘ ΠΈΡ
ΠΏΠΎΠΌΠΎΡΡΡ ΠΌΠΎΠΆΠ½ΠΎ Π΄ΠΎΠ±Π°Π²ΠΈΡΡ ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½Π½ΡΠΉ Π½Π°Π±ΠΎΡ ΡΠ°Π·ΡΠ΅ΡΠ΅Π½ΠΈΠΉ ΠΊ JWT-ΡΠΎΠΊΠ΅Π½Ρ.
+
+ΠΠ°ΡΠ΅ΠΌ Π²Ρ ΠΌΠΎΠΆΠ΅ΡΠ΅ ΠΏΠ΅ΡΠ΅Π΄Π°ΡΡ ΡΡΠΎΡ ΡΠΎΠΊΠ΅Π½ Π½Π΅ΠΏΠΎΡΡΠ΅Π΄ΡΡΠ²Π΅Π½Π½ΠΎ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Ρ ΠΈΠ»ΠΈ ΡΡΠ΅ΡΡΠ΅ΠΉ ΡΡΠΎΡΠΎΠ½Π΅ Π΄Π»Ρ Π²Π·Π°ΠΈΠΌΠΎΠ΄Π΅ΠΉΡΡΠ²ΠΈΡ Ρ Π²Π°ΡΠΈΠΌ API Ρ ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½Π½ΡΠΌ Π½Π°Π±ΠΎΡΠΎΠΌ ΠΎΠ³ΡΠ°Π½ΠΈΡΠ΅Π½ΠΈΠΉ.
+
+Π ΡΠΎΠΌ, ΠΊΠ°ΠΊ ΠΈΡ
ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ ΠΈ ΠΊΠ°ΠΊ ΠΎΠ½ΠΈ ΠΈΠ½ΡΠ΅Π³ΡΠΈΡΠΎΠ²Π°Π½Ρ Π² **FastAPI**, ΡΠΈΡΠ°ΠΉΡΠ΅ Π΄Π°Π»Π΅Π΅ Π² **Π ΡΠΊΠΎΠ²ΠΎΠ΄ΡΡΠ²Π΅ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Ρ**.
+
+## Π Π΅Π·ΡΠΌΠ΅
+
+Π‘ ΡΡΠ΅ΡΠΎΠΌ ΡΠΎΠ³ΠΎ, ΡΡΠΎ Π²Ρ Π²ΠΈΠ΄Π΅Π»ΠΈ Π΄ΠΎ ΡΠΈΡ
ΠΏΠΎΡ, Π²Ρ ΠΌΠΎΠΆΠ΅ΡΠ΅ ΡΠΎΠ·Π΄Π°ΡΡ Π±Π΅Π·ΠΎΠΏΠ°ΡΠ½ΠΎΠ΅ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ **FastAPI**, ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΡ ΡΠ°ΠΊΠΈΠ΅ ΡΡΠ°Π½Π΄Π°ΡΡΡ, ΠΊΠ°ΠΊ OAuth2 ΠΈ JWT.
+
+ΠΡΠ°ΠΊΡΠΈΡΠ΅ΡΠΊΠΈ Π² Π»ΡΠ±ΠΎΠΌ ΡΡΠ΅ΠΉΠΌΠ²ΠΎΡΠΊΠ΅ ΡΠ°Π±ΠΎΡΠ° Ρ Π±Π΅Π·ΠΎΠΏΠ°ΡΠ½ΠΎΡΡΡΡ Π΄ΠΎΠ²ΠΎΠ»ΡΠ½ΠΎ Π±ΡΡΡΡΠΎ ΠΏΡΠ΅Π²ΡΠ°ΡΠ°Π΅ΡΡΡ Π² ΡΠ»ΠΎΠΆΠ½ΡΡ ΡΠ΅ΠΌΡ.
+
+ΠΠ½ΠΎΠ³ΠΈΠ΅ ΠΏΠ°ΠΊΠ΅ΡΡ, ΡΠΈΠ»ΡΠ½ΠΎ ΡΠΏΡΠΎΡΠ°ΡΡΠΈΠ΅ ΡΡΡ Π·Π°Π΄Π°ΡΡ, Π²ΡΠ½ΡΠΆΠ΄Π΅Π½Ρ ΠΈΠ΄ΡΠΈ Π½Π° ΠΌΠ½ΠΎΠ³ΠΎΡΠΈΡΠ»Π΅Π½Π½ΡΠ΅ ΠΊΠΎΠΌΠΏΡΠΎΠΌΠΈΡΡΡ Ρ ΠΌΠΎΠ΄Π΅Π»ΡΡ Π΄Π°Π½Π½ΡΡ
, Ρ Π±Π°Π·ΠΎΠΉ Π΄Π°Π½Π½ΡΡ
ΠΈ Ρ Π΄ΠΎΡΡΡΠΏΠ½ΡΠΌ ΡΡΠ½ΠΊΡΠΈΠΎΠ½Π°Π»ΠΎΠΌ. ΠΠ΅ΠΊΠΎΡΠΎΡΡΠ΅ ΠΈΠ· ΡΡΠΈΡ
ΠΏΠ°ΠΊΠ΅ΡΠΎΠ², ΠΊΠΎΡΠΎΡΡΠ΅ ΠΏΡΡΠ°ΡΡΡΡ ΡΠΆ ΡΠ»ΠΈΡΠΊΠΎΠΌ Π²ΡΠ΅ ΡΠΏΡΠΎΡΡΠΈΡΡ, ΠΈΠΌΠ΅ΡΡ Π΄Π°ΠΆΠ΅ "Π΄ΡΡΡ" Π² ΡΠΈΡΡΠ΅ΠΌΠ΅ Π±Π΅Π·ΠΎΠΏΠ°ΡΠ½ΠΎΡΡΠΈ.
+
+---
+
+**FastAPI** Π½Π΅ Π΄Π΅Π»Π°Π΅Ρ ΡΡΡΡΠΏΠΎΠΊ Π½ΠΈ ΠΎΠ΄Π½ΠΎΠΉ Π±Π°Π·Π΅ Π΄Π°Π½Π½ΡΡ
, ΠΌΠΎΠ΄Π΅Π»ΠΈ Π΄Π°Π½Π½ΡΡ
ΠΈΠ»ΠΈ ΠΈΠ½ΡΡΡΡΠΌΠ΅Π½ΡΠ°ΡΠΈΡ.
+
+ΠΠ½ ΠΏΡΠ΅Π΄ΠΎΡΡΠ°Π²Π»ΡΠ΅Ρ Π²Π°ΠΌ ΠΏΠΎΠ»Π½ΡΡ ΡΠ²ΠΎΠ±ΠΎΠ΄Ρ Π΄Π΅ΠΉΡΡΠ²ΠΈΠΉ, ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡ Π²ΡΠ±ΠΈΡΠ°ΡΡ ΡΠΎ, ΡΡΠΎ Π»ΡΡΡΠ΅ Π²ΡΠ΅Π³ΠΎ ΠΏΠΎΠ΄Ρ
ΠΎΠ΄ΠΈΡ Π΄Π»Ρ Π²Π°ΡΠ΅Π³ΠΎ ΠΏΡΠΎΠ΅ΠΊΡΠ°.
+
+ΠΡ ΠΌΠΎΠΆΠ΅ΡΠ΅ Π½Π°ΠΏΡΡΠΌΡΡ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ ΠΌΠ½ΠΎΠ³ΠΈΠ΅ Ρ
ΠΎΡΠΎΡΠΎ ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΈΠ²Π°Π΅ΠΌΡΠ΅ ΠΈ ΡΠΈΡΠΎΠΊΠΎ ΡΠ°ΡΠΏΡΠΎΡΡΡΠ°Π½Π΅Π½Π½ΡΠ΅ ΠΏΠ°ΠΊΠ΅ΡΡ, ΡΠ°ΠΊΠΈΠ΅ ΠΊΠ°ΠΊ `passlib` ΠΈ `PyJWT`, ΠΏΠΎΡΠΊΠΎΠ»ΡΠΊΡ **FastAPI** Π½Π΅ ΡΡΠ΅Π±ΡΠ΅Ρ ΡΠ»ΠΎΠΆΠ½ΡΡ
ΠΌΠ΅Ρ
Π°Π½ΠΈΠ·ΠΌΠΎΠ² Π΄Π»Ρ ΠΈΠ½ΡΠ΅Π³ΡΠ°ΡΠΈΠΈ Π²Π½Π΅ΡΠ½ΠΈΡ
ΠΏΠ°ΠΊΠ΅ΡΠΎΠ².
+
+ΠΠ°ΠΏΡΠΎΡΠΈΠ², ΠΎΠ½ ΠΏΡΠ΅Π΄ΠΎΡΡΠ°Π²Π»ΡΠ΅Ρ ΠΈΠ½ΡΡΡΡΠΌΠ΅Π½ΡΡ, ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡΡΠΈΠ΅ ΠΌΠ°ΠΊΡΠΈΠΌΠ°Π»ΡΠ½ΠΎ ΡΠΏΡΠΎΡΡΠΈΡΡ ΡΡΠΎΡ ΠΏΡΠΎΡΠ΅ΡΡ Π±Π΅Π· ΡΡΠ΅ΡΠ±Π° Π΄Π»Ρ Π³ΠΈΠ±ΠΊΠΎΡΡΠΈ, Π½Π°Π΄Π΅ΠΆΠ½ΠΎΡΡΠΈ ΠΈ Π±Π΅Π·ΠΎΠΏΠ°ΡΠ½ΠΎΡΡΠΈ.
+
+ΠΡΠΈ ΡΡΠΎΠΌ Π²Ρ ΠΌΠΎΠΆΠ΅ΡΠ΅ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ ΠΈ ΡΠ΅Π°Π»ΠΈΠ·ΠΎΠ²ΡΠ²Π°ΡΡ Π±Π΅Π·ΠΎΠΏΠ°ΡΠ½ΡΠ΅ ΡΡΠ°Π½Π΄Π°ΡΡΠ½ΡΠ΅ ΠΏΡΠΎΡΠΎΠΊΠΎΠ»Ρ, ΡΠ°ΠΊΠΈΠ΅ ΠΊΠ°ΠΊ OAuth2, ΠΎΡΠ½ΠΎΡΠΈΡΠ΅Π»ΡΠ½ΠΎ ΠΏΡΠΎΡΡΡΠΌ ΡΠΏΠΎΡΠΎΠ±ΠΎΠΌ.
+
+Π **Π ΡΠΊΠΎΠ²ΠΎΠ΄ΡΡΠ²Π΅ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Ρ** Π²Ρ ΠΌΠΎΠΆΠ΅ΡΠ΅ ΡΠ·Π½Π°ΡΡ Π±ΠΎΠ»ΡΡΠ΅ ΠΎ ΡΠΎΠΌ, ΠΊΠ°ΠΊ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ "Π΄ΠΈΠ°ΠΏΠ°Π·ΠΎΠ½Ρ" ("`scopes`") OAuth2 Π΄Π»Ρ ΡΠΎΠ·Π΄Π°Π½ΠΈΡ Π±ΠΎΠ»Π΅Π΅ ΡΠΎΡΠ½ΠΎ Π½Π°ΡΡΡΠΎΠ΅Π½Π½ΠΎΠΉ ΡΠΈΡΡΠ΅ΠΌΡ ΡΠ°Π·ΡΠ΅ΡΠ΅Π½ΠΈΠΉ Π² ΡΠΎΠΎΡΠ²Π΅ΡΡΡΠ²ΠΈΠΈ Ρ ΡΠ΅ΠΌΠΈ ΠΆΠ΅ ΡΡΠ°Π½Π΄Π°ΡΡΠ°ΠΌΠΈ. OAuth2 Ρ Π΄ΠΈΠ°ΠΏΠ°Π·ΠΎΠ½Π°ΠΌΠΈ - ΡΡΠΎ ΠΌΠ΅Ρ
Π°Π½ΠΈΠ·ΠΌ, ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΠΌΡΠΉ ΠΌΠ½ΠΎΠ³ΠΈΠΌΠΈ ΠΊΡΡΠΏΠ½ΡΠΌΠΈ ΠΏΡΠΎΠ²Π°ΠΉΠ΄Π΅ΡΠ°ΠΌΠΈ ΡΠ΅ΡΠ²ΠΈΡΠ° Π°ΡΡΠ΅Π½ΡΠΈΡΠΈΠΊΠ°ΡΠΈΠΈ, ΡΠ°ΠΊΠΈΠΌΠΈ ΠΊΠ°ΠΊ Facebook, Google, GitHub, Microsoft, Twitter ΠΈ Π΄Ρ., Π΄Π»Ρ Π°Π²ΡΠΎΡΠΈΠ·Π°ΡΠΈΠΈ ΡΡΠΎΡΠΎΠ½Π½ΠΈΡ
ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ Π½Π° Π²Π·Π°ΠΈΠΌΠΎΠ΄Π΅ΠΉΡΡΠ²ΠΈΠ΅ Ρ ΠΈΡ
API ΠΎΡ ΠΈΠΌΠ΅Π½ΠΈ ΠΈΡ
ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Π΅ΠΉ.