Freischalten der Sicherheitsfunktionen von FastAPI: Ein vereinfachter Leitfaden zur Implementierung von OAuth2 mit Passwort- und Bearer-Authentifizierung

In der sich schnell entwickelnden Welt der Webentwicklung ist es wichtiger denn je, Ihre Anwendung zu sichern. FastAPI, ein modernes, schnelles (hochleistungsfähiges) Web-Framework zum Erstellen von APIs mit Python 3.7+ basierend auf standardmäßigen Python-Typ-Hinweisen, bietet robuste Sicherheitsfunktionen, die sowohl leistungsstark als auch einfach zu implementieren sind. Unter diesen sticht OAuth2 mit Passwort (und Hashing) sowie Bearer mit JWT-Token als besonders wirksame Methode zum Schutz Ihrer Anwendung hervor. Dieser Leitfaden zielt darauf ab, den Prozess der Integration dieser Sicherheitsmechanismen in Ihre FastAPI-Anwendung zu entmystifizieren, um sicherzustellen, dass Ihre Daten sicher bleiben und Ihre APIs gegen unbefugten Zugriff geschützt sind.

Verständnis von OAuth2 und Bearer-Authentifizierung

Bevor Sie mit der Implementierung beginnen, ist es wesentlich, die Konzepte von OAuth2 und Bearer-Authentifizierung zu verstehen. OAuth2 ist ein Autorisierungsframework, das Anwendungen ermöglicht, einen begrenzten Zugang zu Benutzerkonten auf einem HTTP-Dienst zu erhalten. Es funktioniert, indem die Benutzerauthentifizierung an den Dienst delegiert wird, der das Benutzerkonto hostet, und autorisiert Drittanbieteranwendungen, auf das Benutzerkonto zuzugreifen. OAuth2 verwendet "Token", die vom Autorisierungsserver erteilt werden, wodurch die Notwendigkeit entfällt, dass die Anwendung Benutzeranmeldeinformationen speichert.

Bearer-Authentifizierung ist andererseits eine Methode, einen Token im Autorisierungsheader einer Anfrage zu senden. Dieser Token fungiert als "Bearer"-Anmeldeinformation, die den Zugriff auf eine geschützte Ressource ermöglicht, ohne dass die Anwendung die Identität des Benutzers oder des Geräts preisgeben muss.

Einrichten Ihrer FastAPI-Anwendung

Stellen Sie zunächst sicher, dass Sie FastAPI und Uvicorn (einen ASGI-Server) installiert haben. Falls nicht, können Sie sie mit pip installieren:

pip install fastapi uvicorn

Erstellen Sie eine neue Python-Datei für Ihre Anwendung und importieren Sie FastAPI:

from fastapi import FastAPI

app = FastAPI()

Integration von OAuth2 mit Passwort- und Bearer-Authentifizierung

Die Implementierung von OAuth2 in FastAPI erfordert die Einrichtung eines Sicherheitsschemas. FastAPI bietet mehrere Sicherheitsdienstprogramme, einschließlich OAuth2PasswordBearer, eine Klasse, die Sie verwenden können, um zu definieren, wie das OAuth2-Sicherheitsschema funktionieren wird.

from fastapi import Depends, FastAPI, HTTPException, status
from fastapi.security import OAuth2PasswordBearer

oauth2_scheme = OAuth2PasswordBearer(tokenUrl="token")

Der Parameter tokenUrl ist die URL, um den Token zu erhalten. Diese URL wird der Ort sein, an den Ihre Benutzer ihren Benutzernamen und ihr Passwort senden, um den Token zu erhalten.

Erstellen eines Token-Generierungsendpunkts

Um Token zu generieren, müssen Sie einen Endpunkt erstellen. Dies beinhaltet das Importieren und Verwenden von sicherheitsbezogenen Funktionen aus FastAPI:

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

# Ihr geheimer Schlüssel
SECRET_KEY = "ein sehr geheimes Geheimnis"
ALGORITHM = "HS256"
ACCESS_TOKEN_EXPIRE_MINUTES = 30

@app.post("/token")
async def login_for_access_token(form_data: OAuth2PasswordRequestForm = Depends()):
    user = authenticate_user(fake_users_db, form_data.username, form_data.password)
    if not user:
        raise HTTPException(
            status_code=status.HTTP_401_UNAUTHORIZED,
            detail="Falscher Benutzername oder Passwort",
            headers={"WWW-Authenticate": "Bearer"},
        )
    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 wird Benutzer authentifizieren und einen JWT-Token zurückgeben. Sie müssen die Funktionen authenticate_user und create_access_token basierend auf Ihrem Authentifizierungshintergrund implementieren.

Schützen von Routen mit OAuth2

Um eine Route zu schützen, verwenden Sie die Funktion Depends mit dem von Ihnen definierten OAuth2-Schema:

@app.get("/users/me")
async def read_users_me(token: str = Depends(oauth2_scheme)):
    return {"token": token}

Dieses Beispiel zeigt eine einfache Route, die den Token des authentifizierten Benutzers zurückgibt. In der Praxis würden Sie den Token verwenden, um die Informationen des Benutzers abzurufen und zu überprüfen.

Fazit

Die Sicherheitsfunktionen