Browse Source

Update tutorial/security/oauth2-jwt.md

Done with the manual walkthrough.

My final temporary git ignore additions (to hide files in VSCode) may be of interest:

# Temporarily ignore unrelated files

/*
!/docs
/docs/*
!/docs/en
!/docs/de
/docs/*/*
!/docs/*/docs
/docs/*/docs/css
/docs/*/docs/img
/docs/*/docs/js
/docs/*/docs/reference
/docs/*/docs/release-notes.md
/docs/*/docs/fastapi-people.md
/docs/*/docs/external-links.md
/docs/*/docs/newsletter.md
/docs/*/docs/management-tasks.md
/docs/*/docs/management.md
/docs/*/docs/contributing.md

# Temporarily ignore done files

/docs/*/docs/alternatives.md
/docs/*/docs/async.md
/docs/*/docs/benchmarks.md
/docs/*/docs/environment-variables.md
/docs/*/docs/fastapi-cli.md
/docs/*/docs/features.md
/docs/*/docs/help-fastapi.md
/docs/*/docs/history-design-future.md
/docs/*/docs/index.md
/docs/*/docs/project-generation.md
/docs/*/docs/python-types.md
/docs/*/docs/virtual-environments.md
/docs/*/docs/about/index.md
/docs/*/docs/about
/docs/*/docs/advanced/additional-responses.md
/docs/*/docs/advanced/additional-status-codes.md
/docs/*/docs/advanced/advanced-dependencies.md
/docs/*/docs/advanced/async-tests.md
/docs/*/docs/advanced/behind-a-proxy.md
/docs/*/docs/advanced/custom-response.md
/docs/*/docs/advanced/dataclasses.md
/docs/*/docs/advanced/events.md
/docs/*/docs/advanced/generate-clients.md
/docs/*/docs/advanced/index.md
/docs/*/docs/advanced/middleware.md
/docs/*/docs/advanced/openapi-callbacks.md
/docs/*/docs/advanced/openapi-webhooks.md
/docs/*/docs/advanced/path-operation-advanced-configuration.md
/docs/*/docs/advanced/response-change-status-code.md
/docs/*/docs/advanced/response-cookies.md
/docs/*/docs/advanced/response-directly.md
/docs/*/docs/advanced/response-headers.md
/docs/*/docs/advanced/settings.md
/docs/*/docs/advanced/sub-applications.md
/docs/*/docs/advanced/templates.md
/docs/*/docs/advanced/testing-dependencies.md
/docs/*/docs/advanced/testing-events.md
/docs/*/docs/advanced/testing-websockets.md
/docs/*/docs/advanced/using-request-directly.md
/docs/*/docs/advanced/websockets.md
/docs/*/docs/advanced/wsgi.md
/docs/*/docs/advanced/security/http-basic-auth.md
/docs/*/docs/advanced/security/index.md
/docs/*/docs/advanced/security/oauth2-scopes.md
/docs/*/docs/advanced/security
/docs/*/docs/advanced
/docs/*/docs/deployment/cloud.md
/docs/*/docs/deployment/concepts.md
/docs/*/docs/deployment/docker.md
/docs/*/docs/deployment/https.md
/docs/*/docs/deployment/index.md
/docs/*/docs/deployment/manually.md
/docs/*/docs/deployment/server-workers.md
/docs/*/docs/deployment/versions.md
/docs/*/docs/deployment
/docs/*/docs/how-to/conditional-openapi.md
/docs/*/docs/how-to/configure-swagger-ui.md
/docs/*/docs/how-to/custom-docs-ui-assets.md
/docs/*/docs/how-to/custom-request-and-route.md
/docs/*/docs/how-to/extending-openapi.md
/docs/*/docs/how-to/general.md
/docs/*/docs/how-to/graphql.md
/docs/*/docs/how-to/index.md
/docs/*/docs/how-to/separate-openapi-schemas.md
/docs/*/docs/how-to/testing-database.md
/docs/*/docs/how-to
/docs/*/docs/learn/index.md
/docs/*/docs/learn
/docs/*/docs/resources/index.md
/docs/*/docs/resources
/docs/*/docs/tutorial/background-tasks.md
/docs/*/docs/tutorial/bigger-applications.md
/docs/*/docs/tutorial/body-fields.md
/docs/*/docs/tutorial/body-multiple-params.md
/docs/*/docs/tutorial/body-nested-models.md
/docs/*/docs/tutorial/body-updates.md
/docs/*/docs/tutorial/body.md
/docs/*/docs/tutorial/cookie-param-models.md
/docs/*/docs/tutorial/cookie-params.md
/docs/*/docs/tutorial/cors.md
/docs/*/docs/tutorial/debugging.md
/docs/*/docs/tutorial/encoder.md
/docs/*/docs/tutorial/extra-data-types.md
/docs/*/docs/tutorial/extra-models.md
/docs/*/docs/tutorial/first-steps.md
/docs/*/docs/tutorial/handling-errors.md
/docs/*/docs/tutorial/header-param-models.md
/docs/*/docs/tutorial/header-params.md
/docs/*/docs/tutorial/index.md
/docs/*/docs/tutorial/metadata.md
/docs/*/docs/tutorial/middleware.md
/docs/*/docs/tutorial/path-operation-configuration.md
/docs/*/docs/tutorial/path-params-numeric-validations.md
/docs/*/docs/tutorial/path-params.md
/docs/*/docs/tutorial/query-param-models.md
/docs/*/docs/tutorial/query-params-str-validations.md
/docs/*/docs/tutorial/query-params.md
/docs/*/docs/tutorial/request-files.md
/docs/*/docs/tutorial/request-form-models.md
/docs/*/docs/tutorial/request-forms-and-files.md
/docs/*/docs/tutorial/request-forms.md
/docs/*/docs/tutorial/response-model.md
/docs/*/docs/tutorial/response-status-code.md
/docs/*/docs/tutorial/schema-extra-example.md
/docs/*/docs/tutorial/sql-databases.md
/docs/*/docs/tutorial/static-files.md
/docs/*/docs/tutorial/testing.md
/docs/*/docs/tutorial/dependencies/index.md
/docs/*/docs/tutorial/dependencies/classes-as-dependencies.md
/docs/*/docs/tutorial/dependencies/sub-dependencies.md
/docs/*/docs/tutorial/dependencies/dependencies-in-path-operation-decorators.md
/docs/*/docs/tutorial/dependencies/global-dependencies.md
/docs/*/docs/tutorial/dependencies/dependencies-with-yield.md
/docs/*/docs/tutorial/dependencies
/docs/*/docs/tutorial/security/index.md
/docs/*/docs/tutorial/security/first-steps.md
/docs/*/docs/tutorial/security/get-current-user.md
/docs/*/docs/tutorial/security/simple-oauth2.md
/docs/*/docs/tutorial/security/oauth2-jwt.md
/docs/*/docs/tutorial/security
/docs/*/docs/tutorial
/docs/*/docs
/docs/*
/docs
pull/14015/head
Nils Lindemann 2 weeks ago
parent
commit
0aa33f5f03
  1. 62
      docs/de/docs/tutorial/security/oauth2-jwt.md

62
docs/de/docs/tutorial/security/oauth2-jwt.md

@ -1,4 +1,4 @@
# OAuth2 mit Password (und Hashing), Bearer mit JWT-Tokens
# OAuth2 mit Passwort (und Hashing), Bearer mit JWT-Tokens { #oauth2-with-password-and-hashing-bearer-with-jwt-tokens }
Da wir nun über den gesamten Sicherheitsablauf verfügen, machen wir die Anwendung tatsächlich sicher, indem wir <abbr title="JSON Web Tokens">JWT</abbr>-Tokens und sicheres Passwort-Hashing verwenden.
@ -6,7 +6,7 @@ Diesen Code können Sie tatsächlich in Ihrer Anwendung verwenden, die Passwort-
Wir bauen auf dem vorherigen Kapitel auf.
## Über JWT
## Über JWT { #about-jwt }
JWT bedeutet „JSON Web Tokens“.
@ -26,33 +26,31 @@ Nach einer Woche läuft der Token ab und der Benutzer wird nicht autorisiert und
Wenn Sie mit JWT-Tokens spielen und sehen möchten, wie sie funktionieren, schauen Sie sich <a href="https://jwt.io/" class="external-link" target="_blank">https://jwt.io</a> an.
## `python-jose` installieren.
## `PyJWT` installieren { #install-pyjwt }
Wir müssen <abbr title="JOSE: JavaScript Object Signing and Encryption">`python-jose`</abbr> installieren, um die JWT-Tokens in Python zu generieren und zu verifizieren:
Wir müssen `PyJWT` installieren, um die JWT-Tokens in Python zu generieren und zu verifizieren.
Stellen Sie sicher, dass Sie eine [virtuelle Umgebung](../../virtual-environments.md){.internal-link target=_blank} erstellen, sie aktivieren und dann `pyjwt` installieren:
<div class="termy">
```console
$ pip install "python-jose[cryptography]"
$ pip install pyjwt
---> 100%
```
</div>
<a href="https://github.com/mpdavis/python-jose" class="external-link" target="_blank">python-jose</a> erfordert zusätzlich ein kryptografisches Backend.
Hier verwenden wir das empfohlene: <a href="https://cryptography.io/" class="external-link" target="_blank">pyca/cryptography</a>.
/// tip | Tipp
/// info | Info
Dieses Tutorial verwendete zuvor <a href="https://pyjwt.readthedocs.io/" class="external-link" target="_blank">PyJWT</a>.
Wenn Sie planen, digitale Signaturalgorithmen wie RSA oder ECDSA zu verwenden, sollten Sie die Kryptografie-Abhängigkeit `pyjwt[crypto]` installieren.
Es wurde jedoch aktualisiert, stattdessen python-jose zu verwenden, da dieses alle Funktionen von PyJWT sowie einige Extras bietet, die Sie später möglicherweise benötigen, wenn Sie Integrationen mit anderen Tools erstellen.
Weitere Informationen finden Sie in der <a href="https://pyjwt.readthedocs.io/en/latest/installation.html" class="external-link" target="_blank">PyJWT-Installationsdokumentation</a>.
///
## Passwort-Hashing
## Passwort-Hashing { #password-hashing }
„Hashing“ bedeutet: Konvertieren eines Inhalts (in diesem Fall eines Passworts) in eine Folge von Bytes (ein schlichter String), die wie Kauderwelsch aussieht.
@ -60,13 +58,13 @@ Immer wenn Sie genau den gleichen Inhalt (genau das gleiche Passwort) übergeben
Sie können jedoch nicht vom Kauderwelsch zurück zum Passwort konvertieren.
### Warum Passwort-Hashing verwenden?
### Warum Passwort-Hashing verwenden? { #why-use-password-hashing }
Wenn Ihre Datenbank gestohlen wird, hat der Dieb nicht die Klartext-Passwörter Ihrer Benutzer, sondern nur die Hashes.
Der Dieb kann also nicht versuchen, die gleichen Passwörter in einem anderen System zu verwenden (da viele Benutzer überall das gleiche Passwort verwenden, wäre dies gefährlich).
## `passlib` installieren
## `passlib` installieren { #install-passlib }
PassLib ist ein großartiges Python-Package, um Passwort-Hashes zu handhaben.
@ -74,7 +72,7 @@ Es unterstützt viele sichere Hashing-Algorithmen und Werkzeuge, um mit diesen z
Der empfohlene Algorithmus ist „Bcrypt“.
Installieren Sie also PassLib mit Bcrypt:
Stellen Sie sicher, dass Sie eine [virtuelle Umgebung](../../virtual-environments.md){.internal-link target=_blank} erstellen, sie aktivieren, und installieren Sie dann PassLib mit Bcrypt:
<div class="termy">
@ -96,7 +94,7 @@ Und Ihre Benutzer könnten sich gleichzeitig über Ihre Django-Anwendung oder Ih
///
## Die Passwörter hashen und überprüfen
## Die Passwörter hashen und überprüfen { #hash-and-verify-the-passwords }
Importieren Sie die benötigten Tools aus `passlib`.
@ -118,7 +116,7 @@ Und eine weitere, um zu überprüfen, ob ein empfangenes Passwort mit dem gespei
Und noch eine, um einen Benutzer zu authentifizieren und zurückzugeben.
{* ../../docs_src/security/tutorial004_an_py310.py hl[7,48,55:56,59:60,69:75] *}
{* ../../docs_src/security/tutorial004_an_py310.py hl[8,49,56:57,60:61,70:76] *}
/// note | Hinweis
@ -126,7 +124,7 @@ Wenn Sie sich die neue (gefakte) Datenbank `fake_users_db` anschauen, sehen Sie,
///
## JWT-Token verarbeiten
## JWT-Token verarbeiten { #handle-jwt-tokens }
Importieren Sie die installierten Module.
@ -154,9 +152,9 @@ Definieren Sie ein Pydantic-Modell, das im Token-Endpunkt für die Response verw
Erstellen Sie eine Hilfsfunktion, um einen neuen Zugriffstoken zu generieren.
{* ../../docs_src/security/tutorial004_an_py310.py hl[6,12:14,28:30,78:86] *}
{* ../../docs_src/security/tutorial004_an_py310.py hl[4,7,13:15,29:31,79:87] *}
## Die Abhängigkeiten aktualisieren
## Die Abhängigkeiten aktualisieren { #update-the-dependencies }
Aktualisieren Sie `get_current_user`, um den gleichen Token wie zuvor zu erhalten, dieses Mal jedoch unter Verwendung von JWT-Tokens.
@ -164,17 +162,17 @@ Dekodieren Sie den empfangenen Token, validieren Sie ihn und geben Sie den aktue
Wenn der Token ungültig ist, geben Sie sofort einen HTTP-Fehler zurück.
{* ../../docs_src/security/tutorial004_an_py310.py hl[89:106] *}
{* ../../docs_src/security/tutorial004_an_py310.py hl[90:107] *}
## Die *Pfadoperation* `/token` aktualisieren
## Die *Pfadoperation* `/token` aktualisieren { #update-the-token-path-operation }
Erstellen Sie ein <abbr title="Zeitdifferenz">`timedelta`</abbr> mit der Ablaufzeit des Tokens.
Erstellen Sie einen echten JWT-Zugriffstoken und geben Sie ihn zurück.
{* ../../docs_src/security/tutorial004_an_py310.py hl[117:132] *}
{* ../../docs_src/security/tutorial004_an_py310.py hl[118:133] *}
### Technische Details zum JWT-„Subjekt“ `sub`
### Technische Details zum JWT-„Subjekt“ `sub` { #technical-details-about-the-jwt-subject-sub }
Die JWT-Spezifikation besagt, dass es einen Schlüssel `sub` mit dem Subjekt des Tokens gibt.
@ -196,7 +194,7 @@ Deshalb, um ID-Kollisionen zu vermeiden, könnten Sie beim Erstellen des JWT-Tok
Der wesentliche Punkt ist, dass der `sub`-Schlüssel in der gesamten Anwendung eine eindeutige Kennung haben sollte, und er sollte ein String sein.
## Testen
## Testen { #check-it }
Führen Sie den Server aus und gehen Sie zur Dokumentation: <a href="http://127.0.0.1:8000/docs" class="external-link" target="_blank">http://127.0.0.1:8000/docs</a>.
@ -209,9 +207,9 @@ Melden Sie sich bei der Anwendung auf die gleiche Weise wie zuvor an.
Verwenden Sie die Anmeldeinformationen:
Benutzername: `johndoe`
Passwort: `secret`.
Passwort: `secret`
/// check
/// check | Testen
Beachten Sie, dass im Code nirgendwo das Klartext-Passwort "`secret`" steht, wir haben nur die gehashte Version.
@ -238,11 +236,11 @@ Wenn Sie die Developer Tools öffnen, können Sie sehen, dass die gesendeten Dat
/// note | Hinweis
Beachten Sie den Header `Authorization` mit einem Wert, der mit `Bearer` beginnt.
Beachten Sie den Header `Authorization` mit einem Wert, der mit `Bearer ` beginnt.
///
## Fortgeschrittene Verwendung mit `scopes`
## Fortgeschrittene Verwendung mit `scopes` { #advanced-usage-with-scopes }
OAuth2 hat ein Konzept von <abbr title="Geltungsbereiche">„Scopes“</abbr>.
@ -252,7 +250,7 @@ Anschließend können Sie diesen Token einem Benutzer direkt oder einem Dritten
Wie Sie sie verwenden und wie sie in **FastAPI** integriert sind, erfahren Sie später im **Handbuch für fortgeschrittene Benutzer**.
## Zusammenfassung
## Zusammenfassung { #recap }
Mit dem, was Sie bis hier gesehen haben, können Sie eine sichere **FastAPI**-Anwendung mithilfe von Standards wie OAuth2 und JWT einrichten.
@ -266,7 +264,7 @@ Viele Packages, die es stark vereinfachen, müssen viele Kompromisse beim Datenm
Es gibt Ihnen die volle Flexibilität, diejenigen auszuwählen, die am besten zu Ihrem Projekt passen.
Und Sie können viele gut gepflegte und weit verbreitete Packages wie `passlib` und `python-jose` direkt verwenden, da **FastAPI** keine komplexen Mechanismen zur Integration externer Pakete erfordert.
Und Sie können viele gut gepflegte und weit verbreitete Packages wie `passlib` und `PyJWT` direkt verwenden, da **FastAPI** keine komplexen Mechanismen zur Integration externer Pakete erfordert.
Aber es bietet Ihnen die Werkzeuge, um den Prozess so weit wie möglich zu vereinfachen, ohne Kompromisse bei Flexibilität, Robustheit oder Sicherheit einzugehen.

Loading…
Cancel
Save