\n\n\n\n Wie man eine Authentifizierung mit Haystack hinzufügt (Schritt für Schritt) - ClawGo \n

Wie man eine Authentifizierung mit Haystack hinzufügt (Schritt für Schritt)

📖 14 min read2,793 wordsUpdated Mar 30, 2026

So fügen Sie die Authentifizierung zu Haystack hinzu: Schritt für Schritt für echte Sicherheit

Die Hinzufügung einer Authentifizierung zu einem Such- oder Wiederherstellungssystem, das von Haystack angetrieben wird, besteht nicht nur darin, ein Kästchen zu aktivieren. Es richtig zu machen bedeutet, eine sichere und verwaltbare Schicht über eines der besten Open-Source-NLP-Frameworks, deepset-ai/haystack, zu bauen, das 24.582 Sterne, 2.670 Forks und eine aktive Entwicklung ab März 2026 aufweist. Wenn Sie bereits versucht haben, eine Authentifizierung zu Haystack hinzuzufügen, wissen Sie, dass die Grundlagen einfach sind, aber der Teufel steckt immer im Detail – insbesondere wenn Sie etwas mehr als eine “offene Lösung mit einem Schlüssel” für temporären Gebrauch möchten.

Dieses Tutorial führt Sie durch die Hinzufügung der Authentifizierung zu Haystack und erklärt nicht nur, wie Sie es einrichten, sondern auch, warum bestimmte Entscheidungen wichtig sind, welche Fehler Sie möglicherweise begegnen und die Nuancen, die Sie wahrscheinlich nicht in der offiziellen Dokumentation oder auf beliebten Q&A-Websites finden. Halten Sie durch, denn wir beschränken uns nicht darauf, einfach Befehle auszuführen – wir bereiten Ihre Pipeline darauf vor, in der Produktion betriebsbereit zu sein.

Voraussetzungen

  • Python 3.10+ (Haystack unterstützt offiziell 3.7+, aber ich empfehle >=3.10 für Verbesserungen bei Typen und Asynchronität)
  • deepset-ai/haystack==1.17.0 (letzte stabile Version ab März 2026)
  • pip install fastapi uvicorn python-jose[cryptography] passlib[bcrypt]
  • Grundkenntnisse in FastAPI oder die Bereitschaft, API-Frameworks zu erkunden (Haystack funktioniert oft mit FastAPI)
  • Vertrautheit mit OAuth2, JWT-Token oder den Standardkonzepten der Authentifizierung über API-Keys
  • Eine bestehende Haystack-Pipeline oder die Absicht, eine zu erstellen (Suchanfragen, Reader oder RAG)

Schritt 1: Wählen Sie Ihre Authentifizierungsstrategie

Um zu beginnen, springen Sie nicht direkt in den Code: Sie müssen bestimmen, welche Art von Authentifizierung für Ihr Projekt geeignet ist. Haystack ist in seiner Basis ein leistungsstarkes NLP-Framework, bietet jedoch keine universelle Authentifizierungsschicht. Das ist absichtlich – Sicherheit ist nicht “One Size Fits All”.

Die drei Hauptmethoden, die in Haystack-Deployments beliebt sind, sind:

Art der Auth Vorteile Nachteile Verwendungsfälle
API-Key Einfach, leicht umzusetzen, gut für interne Tools Schwierig zu skalieren, mangelnde Granularität, manuelle Schlüsselverwaltung Schnelle Demos, interne Projekte mit niedriger Sicherheit
OAuth2 mit JWT-Bearer Standard, weit verbreitet, skalierbar, granulare Zugriffskontrolle Komplexe Ersteinrichtung, Verwaltung von Refresh-Token, Token-Ablauf Unternehmensanwendungen, Multi-User-Szenarien, Mikroservices
Basis-Authentifizierung (Benutzername/Passwort) Einfach zu verstehen, überall unterstützt Niedrige Sicherheit, es sei denn, es wird mit TLS kombiniert, schlechte Benutzererfahrung Altsysteme, schnelle Tests

Persönlich empfehle ich OAuth2 mit JWT-Token für jedes Projekt über “nur ich benutze es”. API-Keys, obwohl einfach, werden zu einem Kopfzerbrechen, wenn Sie mehrere Verbraucher haben oder den Zugriff widerrufen müssen. Die Basis-Authentifizierung scheint hier eine Erinnerung aus der Vergangenheit zu sein, das zuzugeben tut nicht weh.

Schritt 2: FastAPI mit JWT-Authentifizierung einrichten

Wenn Sie Ihre Haystack-API noch nicht in FastAPI eingebettet haben, ist jetzt der richtige Zeitpunkt. Dieses Tutorial geht davon aus, dass Sie Ihre Haystack-Pipeline über FastAPI bereitstellen – Sie können dies mit Uvicorn zum Laufen bringen. Hier ist die minimale FastAPI-Konfiguration mit JWT-Authentifizierung unter Verwendung von python-jose und passlib für die Passwort-Hashing.

from fastapi import FastAPI, Depends, HTTPException, status
from fastapi.security import OAuth2PasswordBearer, OAuth2PasswordRequestForm
from jose import JWTError, jwt
from passlib.context import CryptContext
from datetime import datetime, timedelta
from typing import Optional

# Geheime Schlüssel für das Kodieren/Dekodieren von JWT - halten Sie dies sehr geheim in Umgebungsvariablen oder Tresoren
SECRET_KEY = "supersecretkey-please-change"
ALGORITHM = "HS256"
ACCESS_TOKEN_EXPIRE_MINUTES = 30

pwd_context = CryptContext(schemes=["bcrypt"], deprecated="auto")
oauth2_scheme = OAuth2PasswordBearer(tokenUrl="token")

app = FastAPI()

fake_users_db = {
 "johndoe": {
 "username": "johndoe",
 "full_name": "John Doe",
 "email": "[email protected]",
 "hashed_password": pwd_context.hash("secret"),
 "disabled": False,
 }
}

def verify_password(plain_password, hashed_password):
 return pwd_context.verify(plain_password, hashed_password)

def get_user(db, username: str):
 if username in db:
 user_dict = db[username]
 return user_dict

def authenticate_user(db, username: str, password: str):
 user = get_user(db, username)
 if not user:
 return False
 if not verify_password(password, user["hashed_password"]):
 return False
 return user

def create_access_token(data: dict, expires_delta: Optional[timedelta] = None):
 to_encode = data.copy()
 expire = datetime.utcnow() + (expires_delta or timedelta(minutes=15))
 to_encode.update({"exp": expire})
 encoded_jwt = jwt.encode(to_encode, SECRET_KEY, algorithm=ALGORITHM)
 return encoded_jwt

@app.post("/token")
async def login(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="Benutzername oder Passwort falsch",
 headers={"WWW-Authenticate": "Bearer"},
 )
 access_token = create_access_token(data={"sub": user["username"]}, expires_delta=timedelta(minutes=ACCESS_TOKEN_EXPIRE_MINUTES))
 return {"access_token": access_token, "token_type": "bearer"}

async def get_current_user(token: str = Depends(oauth2_scheme)):
 credentials_exception = HTTPException(
 status_code=status.HTTP_401_UNAUTHORIZED,
 detail="Konnte die Anmeldedaten nicht validieren",
 headers={"WWW-Authenticate": "Bearer"},
 )
 try:
 payload = jwt.decode(token, SECRET_KEY, algorithms=[ALGORITHM])
 username: str = payload.get("sub")
 if username is None:
 raise credentials_exception
 except JWTError:
 raise credentials_exception
 user = get_user(fake_users_db, username)
 if user is None:
 raise credentials_exception
 return user

# Beispiel einer geschützten Route
@app.get("/users/me")
async def read_users_me(current_user: dict = Depends(get_current_user)):
 return current_user

Warum das wichtig ist: Sie können nicht einfach ein Authentifizierungstoken hinzufügen und sagen, dass es ausreicht. Dieser FastAPI-Snippet ist erprobt und basiert auf python-jose und passlib, Standardbibliotheken, denen Entwickler weitgehend vertrauen. Wir vermeiden es auch, Passwörter im Klartext zu speichern – eine Falle, in die einige Tutorials tappen. Das Passwort, das in fake_users_db gehasht ist, ist ein Platzhalter, aber kodieren Sie keine Geheimnisse in Ihren echten Projekten – lesen Sie weiter für eine bessere Verwaltung von Geheimnissen.

Warnung für häufige Fehler: Wenn Sie eine 401 Unauthorized mit gültigen Anmeldedaten erhalten, überprüfen Sie zweimal Ihre Token-URL in Ihrem OAuth2PasswordBearer-Aufruf – sie sollte mit dem tatsächlichen Token-Endpoint-URL übereinstimmen. Außerdem muss der SECRET_KEY konsistent bleiben – eine Änderung macht alle bestehenden Tokens ungültig.

Schritt 3: Integrieren Sie die Authentifizierung in Ihre Haystack-API

Jetzt, wo Sie FastAPI korrekt mit JWT konfiguriert haben, schützen wir Ihre Haystack-Routen. Angenommen, Sie haben einen Endpunkt, der Ihre Haystack-Pipeline ausführt, um Suchanfragen oder RAG-Komplettierungen zu bedienen. Umwickeln Sie es hinter der Abhängigkeit get_current_user, um die Authentifizierung durchzusetzen.

from haystack.document_stores import FAISSDocumentStore
from haystack.nodes import DensePassageRetriever
from haystack.pipelines import ExtractiveQAPipeline

# Beispielinitialisierung - ersetzen Sie dies durch Ihren tatsächlichen Dokumentenspeicher und Retrieverbearbeiter
document_store = FAISSDocumentStore(faiss_index_factory_str="Flat")
retriever = DensePassageRetriever(document_store=document_store)
pipeline = ExtractiveQAPipeline(reader=None, retriever=retriever)

@app.post("/search")
async def haystack_search(question: str, current_user: dict = Depends(get_current_user)):
 """
 Geschützter API-Suchendpunkt, der ein gültiges Token benötigt.
 """
 # In einer echten Konfiguration würden Sie die Pipeline mit der Anfrage ausführen
 result = pipeline.run(query=question, params={"Retriever": {"top_k": 10}})
 return result

Der Schlüssel hier ist das current_user Depends – dies zwingt den Endpunkt, Anfragen ohne ein gültiges Bearer-Token abzulehnen. Es ist nicht nötig, manuell mit API-Keys in den Headern zu jonglieren; dies ist der richtige, standardkonforme Ansatz.

Warum Sie das wollen: Die offene API von Haystack ist mächtig, aber völlig offen, wenn Sie die Authentifizierung ignorieren. Das Problem ist größer als „jemand googelt Ihre Elasticsearch-Anfragen“ — es geht darum, den Zugriff auf kostenintensive Berechnungen einzuschränken, die Nutzerdaten privat zu halten und Audit-Protokolle zu führen. Dieser Schritt macht Ihren Retriever endlich etwas, das Sie für echte Benutzer bereitstellen können, und nicht nur ein Spielzeug.

Warnung: Ein lästiger Fehler, den ich mehrmals gesehen habe, als ich zugeben möchte: 422 Unprocessable Entity, wenn Sie vergessen, den Autorisierungsheader einzuschließen. Stellen Sie sicher, dass Ihr Frontend oder Ihre Clients Authorization: Bearer <token> senden, sonst bekommen Sie einen stillen Fehler.

Schritt 4: Geheimnisse sicher speichern — nicht hardcodieren

Erinnern Sie sich an diesen dummen SECRET_KEY, den ich Ihnen gezeigt habe? Ja, Sie können ihn nicht in Ihrem Repository ablegen. Ernsthaft, tun Sie das nicht. Wenn Sie Ihre Geheimnisse festlegen, verdienen Sie die daraus resultierenden Datenschutzverletzungen.

Verwenden Sie Umgebungsvariablen oder besser noch einen Geheimnis-Manager. Die Dokumentation von Haystack erwähnt die Geheimnisverwaltung, geht aber schnell über die Implementierungsdetails hinweg. Hier ist die minimale Möglichkeit, dies mit Umgebungsvariablen zu tun:

import os

SECRET_KEY = os.getenv("HAYSTACK_SECRET_KEY")
if not SECRET_KEY:
 raise RuntimeError("Die Umgebungsvariable HAYSTACK_SECRET_KEY ist nicht gesetzt!")

Sie können das dann in Ihrem Shell oder Ihrem CI/CD-Pipeline festlegen:

export HAYSTACK_SECRET_KEY="ein-sehr-langer-geheimer-zufallsschlüssel-bitte-sicher-erzeugen"
uvicorn my_haystack_api:app --reload

Für ernsthafte Produktion erkunden Sie Tools wie HashiCorp Vault oder AWS Secrets Manager. Die Dokumentation zur Geheimnisverwaltung von Haystack bietet gute Tipps, enthält jedoch zu wenige Beispiele. Meiner Meinung nach ist die ordnungsgemäße Verwaltung von Geheimnissen der Punkt, an dem 90 % der Teams scheitern.

Schritt 5: Testen Sie Ihre Authentifizierungsschicht

Schreiben Sie ein paar Testskripte. Hier ist ein schnelles Beispiel mit Python requests, um sich zu authentifizieren und Ihren gesicherten Endpunkt aufzurufen:

import requests

BASE_URL = "http://127.0.0.1:8000"
USERNAME = "johndoe"
PASSWORD = "secret"

def get_token():
 response = requests.post(f"{BASE_URL}/token", data={"username": USERNAME, "password": PASSWORD})
 response.raise_for_status()
 return response.json().get("access_token")

def search(question, token):
 headers = {"Authorization": f"Bearer {token}"}
 response = requests.post(f"{BASE_URL}/search", params={"question": question}, headers=headers)
 response.raise_for_status()
 return response.json()

def main():
 token = get_token()
 print("Token erhalten", token)
 result = search("Was ist Haystack?", token)
 print("Suchergebnis:", result)

if __name__ == "__main__":
 main()

Dies ist das absolute Minimum, um zu bestätigen, dass der gesamte Authentifizierungsfluss funktioniert. Vergessen Sie den Zugriffstoken oder stören Sie die Header, und Sie bekommen 401-Fehler. Sagen Sie nicht, ich hätte Sie nicht gewarnt.

Die Fallstricke, von denen Ihnen niemand erzählt

  • Token-Ablaufprobleme: Die Ablaufzeiten von JWT sind eine Höflichkeit, keine Garantie. Wenn Ihre Tokens eine zu kurze Lebensdauer haben, müssen sich die Benutzer ständig neu anmelden. Zu lang? Sie riskieren, dass gestohlene Tokens unbegrenzt verwendet werden. Finden Sie ein Gleichgewicht basierend auf Ihren Nutzertypen und Ihrer Fähigkeit, Tokens zu widerrufen.
  • Die Albträume bei der Rotation von Geheimnissen: Ändern Sie Ihren geheimen Schlüssel, werden sofort alle aktuellen Tokens ungültig. Planen Sie die Rotation von Geheimnissen sorgfältig oder bauen Sie einen Fallback-Mechanismus ein. Das ist etwas, das viele Tutorials übersehen, aber Ihnen große Probleme in der Produktion bereiten wird.
  • Fehlendes HTTPS: JWT oder API-Keys ohne HTTPS senden? Das ist so, als würde man seine Tokens auf Plakate drucken. Testen Sie nicht über HTTP, außer lokal. Es ist schmerzlich offensichtlich, wird aber oft in Testumgebungen übersehen.
  • Keine Ratenbegrenzung: Authentifizierung ohne Ratenbegrenzung ist wie die Haustür abzuschließen, aber die Fenster offen zu lassen. Haystack integriert keine Ratenbegrenzung — Sie müssen Middleware oder API-Gateway-Regeln hinzufügen. Bereiten Sie sich auf Brute-Force-Angriffe oder Token-Enumeration-Versuche vor.
  • Ignorieren der Speicherung von Geheimnissen: Ihre Geheimnisse in Umgebungsvariablen zu speichern, ist das absolute Minimum. Aber geheime Informationen in Logs, Fehlermeldungen oder Code-Repositories zu leak, fällt oft durch das Raster. Nehmen Sie die Hygiene Ihrer Geheimnisse genauso ernst wie Ihre Modelle.

Funktionsfähiges vollständiges Beispiel: Haystack-API mit JWT-Authentifizierung

Hier ist, was Sie bekommen, wenn Sie alles zusammenführen. Führen Sie dies als main.py aus, setzen Sie Ihre Umgebungsvariable HAYSTACK_SECRET_KEY und führen Sie uvicorn main:app --reload aus.

import os
from fastapi import FastAPI, Depends, HTTPException, status
from fastapi.security import OAuth2PasswordBearer, OAuth2PasswordRequestForm
from jose import JWTError, jwt
from passlib.context import CryptContext
from datetime import datetime, timedelta
from typing import Optional
from haystack.document_stores import FAISSDocumentStore
from haystack.nodes import DensePassageRetriever
from haystack.pipelines import ExtractiveQAPipeline

SECRET_KEY = os.getenv("HAYSTACK_SECRET_KEY")
if not SECRET_KEY:
 raise RuntimeError("Die Umgebungsvariable HAYSTACK_SECRET_KEY ist nicht gesetzt!")

ALGORITHM = "HS256"
ACCESS_TOKEN_EXPIRE_MINUTES = 30

pwd_context = CryptContext(schemes=["bcrypt"], deprecated="auto")
oauth2_scheme = OAuth2PasswordBearer(tokenUrl="token")

app = FastAPI()

fake_users_db = {
 "johndoe": {
 "username": "johndoe",
 "full_name": "John Doe",
 "email": "[email protected]",
 "hashed_password": pwd_context.hash("secret"),
 "disabled": False,
 }
}

def verify_password(plain_password, hashed_password):
 return pwd_context.verify(plain_password, hashed_password)

def get_user(db, username: str):
 if username in db:
 user_dict = db[username]
 return user_dict

def authenticate_user(db, username: str, password: str):
 user = get_user(db, username)
 if not user:
 return False
 if not verify_password(password, user["hashed_password"]):
 return False
 return user

def create_access_token(data: dict, expires_delta: Optional[timedelta] = None):
 to_encode = data.copy()
 expire = datetime.utcnow() + (expires_delta or timedelta(minutes=15))
 to_encode.update({"exp": expire})
 encoded_jwt = jwt.encode(to_encode, SECRET_KEY, algorithm=ALGORITHM)
 return encoded_jwt

@app.post("/token")
async def login(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="Ungültiger Benutzername oder Passwort",
 headers={"WWW-Authenticate": "Bearer"},
 )
 access_token = create_access_token(data={"sub": user["username"]}, expires_delta=timedelta(minutes=ACCESS_TOKEN_EXPIRE_MINUTES))
 return {"access_token": access_token, "token_type": "bearer"}

async def get_current_user(token: str = Depends(oauth2_scheme)):
 credentials_exception = HTTPException(
 status_code=status.HTTP_401_UNAUTHORIZED,
 detail="Konnte die Anmeldeinformationen nicht validieren",
 headers={"WWW-Authenticate": "Bearer"},
 )
 try:
 payload = jwt.decode(token, SECRET_KEY, algorithms=[ALGORITHM])
 username: str = payload.get("sub")
 if username is None:
 raise credentials_exception
 except JWTError:
 raise credentials_exception
 user = get_user(fake_users_db, username)
 if user is None:
 raise credentials_exception
 return user

# Haystack-Komponenten initialisieren
document_store = FAISSDocumentStore(faiss_index_factory_str="Flat")
retriever = DensePassageRetriever(document_store=document_store)
pipeline = ExtractiveQAPipeline(reader=None, retriever=retriever)

@app.post("/search")
async def haystack_search(question: str, current_user: dict = Depends(get_current_user)):
 result = pipeline.run(query=question, params={"Retriever": {"top_k": 10}})
 return result

Dieses Modell ist nicht bereit, um in die Produktion kopiert zu werden, zeigt aber jedes kritische Stück in einer einzigen Datei.

Was als Nächstes zu tun ist: Zugriffskontrollen basierend auf Rollen (RBAC) hinzufügen

Die Authentifizierung mit Benutzername/Passwort und tragbaren Tokens ist gut, aber wenn Ihre Anwendung wächst, benötigen Sie Rollen und Benutzerberechtigungen – Administrator, Benutzer, Gast, Nur-Lesezugriff, Schreibzugriff usw. Integrieren Sie RBAC, um einschränken zu können, wer kostspielige Abfragen ausführt oder Ihr zugrunde liegendes Wissensreservoir aktualisiert. Haystack hat kein integriertes RBAC, aber die Kombination der Abhängigkeitsinjektion von FastAPI mit einer Nutzer/Rollen-Datenbank ist einfach. Sobald das erledigt ist, wird Ihre Anwendung nicht nur sicher sein, sondern auch logisch.

FAQ

Q : Kann ich API-Schlüssel anstelle von JWT-Token mit Haystack verwenden?

R : Ja, aber ich empfehle es nicht für die Produktion. API-Schlüssel sind einfacher, haben jedoch keine Ablaufzeiten, Widerrufsmöglichkeiten und granularen Zugriffskontrollen. Sie können die Authentifizierung mit API-Schlüsseln über FastAPI-Header-Checks implementieren, aber für jeden Anwendungsfall, der mehrere Benutzer oder sensible Daten umfasst, sind JWT mit OAuth2 die bessere, nachhaltigere Wahl.

Q : Wie schütze ich die Benutzeroberfläche von Haystack (falls verwendet)?

R : Die Komponenten der Benutzeroberfläche von Haystack sind nur React-Anwendungen oder Dashboards – Sie sollten sicherstellen, dass Ihr Webserver oder Reverse-Proxy die Authentifizierung durchsetzt (z.B. nginx mit auth_basic, OAuth-Proxy) oder Ihre Backend-Authentifizierungstoken sicher in die Frontend-Oberfläche integriert. Die FastAPI-Backend-Authentifizierung allein schützt nicht die statischen Assets der Benutzeroberfläche.

Q : Hat Haystack eine integrierte Unterstützung für Authentifizierung?

R : Nein. Haystack konzentriert sich ausschließlich auf NLP-Aufgaben. Es wird davon ausgegangen, dass Sie es in Ihre Anwendung oder API-Framework integrieren, das die Authentifizierung, Geheimnisse und Benutzerverwaltung handhabt. Diese Trennung ist schmerzhaft, hält Haystack jedoch fokussiert auf das, was es am besten kann.

Für verschiedene Entwicklerprofile

Der einsame Hacker: Bleiben Sie bei der Authentifizierung mit API-Schlüsseln, um schnell arbeiten zu können, aber halten Sie die Schlüssel aus dem Code heraus. Verwenden Sie FastAPI-Middleware oder Umgebungsvariablen und codieren Sie nichts fest. Ihr größtes Risiko besteht darin, Schlüssel versehentlich offenzulegen – tun Sie das nicht.

Der Unternehmensentwickler: Wählen Sie OAuth2 mit JWT-Token, integrieren Sie Geheimnisspeicher (HashiCorp, AWS), aktivieren Sie RBAC und fügen Sie eine Drosselung hinzu. Ihr Ziel ist eine verwaltbare und nachvollziehbare Sicherheit rund um eine teure Berechnung.

Der Data Scientist / ML-Ingenieur: Arbeiten Sie mit Ihrem Backend-Team zusammen, um die Authentifizierung hinzuzufügen. Sie wollten eine saubere Schnittstelle zu Ihren Haystack-Pipelines, sollten sich jedoch nicht selbst um die Details der Low-Level-Authentifizierung kümmern müssen. Verstehen Sie die Grundlagen, um Probleme zu debuggen, konzentrieren Sie sich jedoch auf die Verbesserung der Modelle.

Daten vom 22. März 2026. Quellen: deepset-ai/haystack GitHub, Dokumentation von Haystack zur Geheimnisverwaltung, Authentifizierung des Haystack-Projekts

Verwandte Artikel

🕒 Published:

🤖
Written by Jake Chen

AI automation specialist with 5+ years building AI agents. Previously at a Y Combinator startup. Runs OpenClaw deployments for 200+ users.

Learn more →
Browse Topics: Advanced Topics | AI Agent Tools | AI Agents | Automation | Comparisons
Scroll to Top