Entsperren sicherer APIs: Ein vereinfachter Leitfaden zur Implementierung von OAuth2 mit Passwort und Bearer in FastAPI

In der heutigen digitalen Ära ist die Sicherung von APIs für jede Anwendung, die sensible Daten verarbeitet, von größter Bedeutung geworden. OAuth2 zeichnet sich als ein robustes Protokoll aus, das entworfen wurde, um sicheren und begrenzten Zugriff auf Ihre Ressourcen zu bieten, ohne Benutzeranmeldeinformationen preiszugeben. FastAPI, ein modernes, schnelles Web-Framework zum Erstellen von APIs mit Python, bietet integrierte Unterstützung für OAuth2. Dieser Leitfaden führt Sie durch die Schritte zur Implementierung der OAuth2-Authentifizierung mit Passwort und Bearer-Tokens in FastAPI, um sicherzustellen, dass Ihre API sicher und dennoch zugänglich bleibt.

Verständnis von OAuth2 und seiner Bedeutung

Bevor wir zur Implementierung kommen, ist es entscheidend zu verstehen, was OAuth2 ist und warum es wesentlich ist. OAuth2 ist ein Autorisierungsframework, das es Drittanbieterdiensten ermöglicht, Webressourcen im Namen eines Benutzers auszutauschen. Es ist das branchenübliche Protokoll für die Autorisierung und wird weltweit verwendet, um API-Endpunkte zu schützen. Durch die Implementierung von OAuth2 stellen Sie sicher, dass die sensiblen Informationen Ihrer API vor unbefugtem Zugriff geschützt bleiben, was Ihnen und Ihren Benutzern Ruhe bietet.

Ihr FastAPI-Projekt einrichten

Zuerst müssen Sie ein FastAPI-Projekt einrichten. Falls Sie dies noch nicht getan haben, können Sie beginnen, indem Sie FastAPI und Uvicorn, einen ASGI-Server, um Ihre Anwendung auszuführen, installieren. Verwenden Sie den folgenden Befehl, um beide zu installieren:

pip install fastapi uvicorn

Nach der Installation erstellen Sie eine neue Python-Datei für Ihre Anwendung, zum Beispiel main.py, und importieren FastAPI:

from fastapi import FastAPI

app = FastAPI()

Dieser Code-Ausschnitt initialisiert Ihre FastAPI-Anwendung und macht sie bereit für weitere Konfigurationen und Routendefinitionen.

Implementierung von OAuth2 mit Password Flow

OAuth2 unterstützt verschiedene Flows für unterschiedliche Anwendungsfälle. Der Password-Flow, geeignet für vertrauenswürdige Anwendungen, ist einer, bei dem Benutzer ihre Anmeldeinformationen direkt an die Anwendung übergeben. In FastAPI können Sie dies umsetzen, indem Sie die Klassen OAuth2PasswordBearer und OAuth2PasswordRequestForm verwenden.

Definieren Sie zunächst die Token-URL und die OAuth2PasswordBearer-Instanz:

from fastapi.security import OAuth2PasswordBearer

oauth2_scheme = OAuth2PasswordBearer(tokenUrl="token")

Dieser Code-Ausschnitt gibt die URL an, unter der Ihre Anwendung die Token-Anfragen empfängt.

Erstellen Sie als Nächstes einen Endpunkt zur Generierung von Tokens. Dieser Endpunkt wird den Benutzernamen und das Passwort erhalten, diese überprüfen und bei erfolgreicher Authentifizierung ein JWT-Token zurückgeben:

from fastapi import Depends, FastAPI
from fastapi.security import OAuth2PasswordBearer, OAuth2PasswordRequestForm
from jose import JWTError, jwt
from datetime import datetime, timedelta

# Ihr geheimer Schlüssel
SECRET_KEY = "IHR_GEHEIMER_SCHLÜSSEL"
# Verwendeter Algorithmus für JWT-Encoding und -Decoding
ALGORITHM = "HS256"
# Ablaufzeit des Tokens
ACCESS_TOKEN_EXPIRE_MINUTES = 30

app = FastAPI()

oauth2_scheme = OAuth2PasswordBearer(tokenUrl="token")

@app.post("/token")
async def generate_token(form_data: OAuth2PasswordRequestForm = Depends()):
    # Hier würden Sie Benutzernamen und Passwort von form_data.username und form_data.password überprüfen
    # Für dieses Beispiel nehmen wir an, dass jeder Benutzername und Passwort gültig ist
    user_username = form_data.username
    # Wenn erfolgreich, erstellen Sie ein JWT-Token
    access_token_expires = timedelta(minutes=ACCESS_TOKEN_EXPIRE_MINUTES)
    access_token = create_access_token(data={"sub": user_username}, expires_delta=access_token_expires)
    return {"access_token": access_token, "token_type": "bearer"}

Dieser Endpunkt verwendet das OAuth2PasswordRequestForm, um Benutzeranmeldeinformationen zu erhalten und, falls gültig, ein JWT-Token zurückzugeben. Die Funktion create_access_token ist eine Hilfsfunktion, die Sie implementieren müssten, um JWT-Tokens zu generieren.

Sichern von API-Endpunkten

Mit dem Authentifizierungsfluss an seinem Platz können Sie nun Ihre API-Endpunkte sichern. Um einen gültigen Token für den Zugriff auf einen Endpunkt zu erfordern, können Sie in Ihren Routenfunktionen auf das oauth2_scheme abhängen:

from fastapi import Depends, HTTPException, status

@app.get("/users/me")
async def read_users_me(token: str = Depends(oauth2_scheme)):
    # Ihre Token-Überprüfungslogik hier
    return