Login-Formular sieht korrekt aus, E-Mail und Passwort stimmen – und trotzdem antwortet Supabase Auth mit:
AuthApiError: Invalid login credentials
Oder im Network-Tab: 400 mit error_description: "Invalid login credentials". Hier sind die häufigsten Ursachen und die Fixes, die bei mir zuverlässig geholfen haben.
Das Problem: Was "Invalid login credentials" wirklich bedeutet
Supabase verrät aus Sicherheitsgründen nicht, ob E-Mail oder Passwort falsch ist. Die Meldung deckt deshalb mehrere Fälle ab:
- Falsches Passwort oder Tippfehler in der E-Mail
- User existiert (noch) nicht in diesem Projekt
- E-Mail noch nicht bestätigt (
Enable email confirmations) - Falsches Projekt / falsche Keys im Client
- User über OAuth angelegt, Login aber per Password versucht
Die Lösung: Ursachen systematisch eingrenzen
Schritt 1: User im Dashboard prüfen
Unter Authentication → Users nach der E-Mail suchen:
- Kein Eintrag → Sign-up ist fehlgeschlagen oder anderes Projekt
- Eintrag ohne Bestätigung → Confirmation noch offen
- Provider nur
google/github→ kein Passwort-Login möglich
Schritt 2: Sign-in korrekt aufrufen
const { data, error } = await supabase.auth.signInWithPassword({
email: email.trim().toLowerCase(),
password,
})
if (error) {
console.error(error.message, error.status)
// "Invalid login credentials" → siehe Checklist unten
}
Achte auf trim() und konsistente Groß-/Kleinschreibung der E-Mail beim Sign-up und Sign-in.
Schritt 3: E-Mail-Bestätigung
Wenn Confirmations aktiv sind und der User unbestätigt ist, kann der Login je nach Einstellung ebenfalls scheitern. Zum Debuggen kurz deaktivieren oder den User im Dashboard bestätigen:
-- Nur lokal/Dev: User manuell bestätigen
UPDATE auth.users
SET email_confirmed_at = now()
WHERE email = 'test@example.com';
Schritt 4: Projekt-Keys und URL prüfen
const supabase = createClient(
process.env.NEXT_PUBLIC_SUPABASE_URL,
process.env.NEXT_PUBLIC_SUPABASE_ANON_KEY
)
Vertauschte Projekte (Staging vs. Produktion) sind ein Klassiker: Sign-up landet in Projekt A, Login geht gegen Projekt B.
Häufige Fehler
- signUp statt signIn: Doppelter Sign-up mit gleicher E-Mail wirkt wie Login-Fehler.
- Leerzeichen in Inputs: Mobile Autofill fügt oft Trailing Spaces ein.
- Identity Linking: User hat sich mit Google registriert und versucht danach E-Mail/Passwort.
- Custom SMTP / Redirect URLs: Bestätigungsmail kommt nicht an → Account bleibt unbestätigt.
Vollständiges Login-Beispiel mit klaren Fehlern
async function login(email, password) {
const { data, error } = await supabase.auth.signInWithPassword({
email: email.trim().toLowerCase(),
password,
})
if (error) {
if (error.message === 'Invalid login credentials') {
return {
ok: false,
hint: 'E-Mail/Passwort prüfen, Bestätigung und Auth-Provider im Dashboard checken.',
}
}
if (error.message.includes('Email not confirmed')) {
return { ok: false, hint: 'Bitte E-Mail bestätigen oder im Dashboard freischalten.' }
}
return { ok: false, hint: error.message }
}
return { ok: true, session: data.session }
}
Troubleshooting Checklist
- ✅ User unter Authentication → Users vorhanden?
- ✅
email_confirmed_atgesetzt (falls Confirmations an)? - ✅ Login-Methode passt zum Provider (Password vs. OAuth)?
- ✅ URL + anon key gehören zum gleichen Projekt wie der User?
- ✅ E-Mail getrimmt / Passwort ohne Autofill-Artefakte?
Fazit
Invalid login credentials ist Absicht vage. Mit Dashboard-Check, korrektem signInWithPassword, bestätigter E-Mail und den richtigen Projekt-Keys findest du die Ursache in wenigen Minuten.
Weitere Ressourcen
- permission denied for table (42501)
- PGRST116: multiple (or no) rows
- Supabase Storage File Upload
- Supabase: Users-Tabelle abfragen
- Supabase: infinite recursion detected in policy
- Supabase Edge Functions: Invalid JWT / 401
- Supabase Storage 403 RLS beim Upload
- Supabase Edge Functions CORS Fehler beheben
- RLS-Fehler bei Inserts beheben
- Supabase Auth Password Docs
Kommt die Meldung trotz korrektem Passwort? Kommentar schreiben – oft ist es Confirmation oder der falsche Provider.
Kommentare