Beherrschung der Sicherheit in FastAPI: Ein umfassender Leitfaden zu OAuth2 mit Passwort-Hashing und JWT-Bearer-Tokens

Sicherheit ist in modernen Webanwendungen von größter Bedeutung, und FastAPI bietet robuste Lösungen für die Handhabung von Authentifizierung und Autorisierung. In diesem umfassenden Leitfaden werden wir tief in OAuth2 mit Passwort-Hashing und JWT-Bearer-Tokens eintauchen, um Ihre FastAPI-Anwendungen zu sichern. Wir werden die Kernkonzepte, praktische Implementierungen sowie wertvolle Tipps und Einblicke abdecken.

Einführung in OAuth2

OAuth2 ist ein offener Standard für Zugriffsdelegation, der häufig für tokenbasierte Authentifizierung und Autorisierung im Internet verwendet wird. Es ermöglicht Drittanbietern, Anmeldeinformationen gegen Zugriffstoken auszutauschen, die dann verwendet werden können, um auf die Daten des Benutzers zuzugreifen, ohne deren Anmeldeinformationen offenzulegen. In diesem Abschnitt werden wir die Grundlagen von OAuth2 und seine Integration mit FastAPI erläutern.

Verständnis des OAuth2-Flows

OAuth2 definiert mehrere Flows für verschiedene Anwendungsfälle, aber der häufigste ist der Resource Owner Password Credentials Flow. Hier ist ein allgemeiner Ablauf:

  • Der Client fordert ein Token vom Autorisierungsserver an, indem er den Benutzernamen und das Passwort des Resource Owners angibt.
  • Der Autorisierungsserver validiert die Anmeldeinformationen und stellt ein Zugriffstoken aus.
  • Der Client verwendet das Zugriffstoken, um sich zu authentifizieren und auf geschützte Ressourcen des Resource Servers zuzugreifen.

Implementierung von Passwort-Hashing

Das Speichern von Rohpasswörtern stellt ein erhebliches Sicherheitsrisiko dar. Um dies zu mindern, hashieren wir Passwörter, bevor wir sie in unserer Datenbank speichern. FastAPI bietet keine integrierte Unterstützung für Passwort-Hashing, aber wir können die passlib Bibliothek verwenden, um dies sicher zu erreichen.

Einrichten des Passwort-Hashing

Zuerst installieren Sie passlib:

pip install passlib[bcrypt]

Erstellen Sie dann eine Hilfsfunktion zum Hashieren von Passwörtern:

from passlib.context import CryptContext

pwd_context = CryptContext(schemes=["bcrypt"], deprecated="auto")

def hash_password(password: str) -> str:
    return pwd_context.hash(password)

def verify_password(plain_password: str, hashed_password: str) -> bool:
    return pwd_context.verify(plain_password, hashed_password)

Verwendung von gehashte Passwörtern in FastAPI

Wenn sich ein Benutzer registriert oder sein Passwort aktualisiert, hashieren Sie es, bevor Sie es speichern:

# Passwort hashen und speichern, wenn ein neuer Benutzer erstellt wird
new_user.password = hash_password(new_user.password)
# Überprüfung des Passworts während des Logins
if not verify_password(login_data.password, stored_user.password):
    raise HTTPException(status_code=400, detail="Incorrect username or password")

JWT-Bearer-Tokens

JSON Web Tokens (JWT) sind ein kompaktes, URL-sicheres Mittel zur Darstellung von Ansprüchen, die zwischen zwei Parteien übertragen werden. Wir verwenden JWTs als Bearer-Tokens, um API-Anfragen zu authentifizieren. Das fastapi.security Modul von FastAPI bietet eine einfache Integration mit JWT-Bearer-Tokens.

Erstellung von JWT-Tokens

Um JWT-Tokens zu erstellen, installieren Sie pyjwt:

pip install pyjwt

Erstellen Sie eine Funktion zum Generieren von Tokens:

import jwt
from datetime import datetime, timedelta

SECRET_KEY = "your-secret-key"
ALGORITHM = "HS256"
ACCESS_TOKEN_EXPIRE_MINUTES = 30

def create_access_token(data: dict) -> str:
    to_encode = data.copy()
    expire = datetime.utcnow() + timedelta(minutes=ACCESS_TOKEN_EXPIRE_MINUTES)
    to_encode.update({"exp": expire})
    encoded_jwt = jwt.encode(to_encode, SECRET_KEY, algorithm=ALGORITHM)
    return encoded_jwt

Überprüfung von JWT-Tokens

Um JWT-Tokens zu überprüfen und zu dekodieren:

from fastapi import Depends, HTTPException, status
from fastapi.security import OAuth2PasswordBearer
from jose import JWTError

oauth2_scheme = OAuth2PasswordBearer(tokenUrl="token")

def verify_token(token: str = Depends(oauth2_scheme)):
    try:
        payload = jwt.decode(token, SECRET_KEY, algorithms=[ALGORITHM])
        return payload
    except JWTError:
        raise HTTPException(
            status_code=status.HTTP_401_UNAUTHORIZED,
            detail="Could not validate credentials",
            headers={"WWW-Authenticate": "Bearer"},
        )

Absicherung von Endpunkten

Verwenden Sie abschließend die verify_token Abhängigkeit, um Ihre Endpunkte abzusichern:

@app.get("/protected-route")
async def protected_route(current_user: dict = Depends(verify_token)):
    return {"message": "This is a protected route", "user": current_user}

Schlussfolgerung

In diesem Leitfaden haben wir die wesentlichen Aspekte zur Sicherung von FastAPI-Anwendungen mit OAuth2, Passwort-Hashing und JWT-Bearer-Tokens behandelt. Indem Sie diese Konzepte verstehen und die bereitgestellten Beispiele implementieren, werden Sie die Sicherheit Ihrer Anwendungen erheblich verbessern. Achten Sie darauf, Ihre geheimen Schlüssel sicher aufzubewahren und bewährte Verfahren zu befolgen. Viel Spaß beim Programmieren!