Credentials-Provider und benutzerdefinierte Anmeldung
Authentifizieren Sie Benutzer mit einem Credentials-Provider und einem benutzerdefinierten Anmeldeformular gegen eine Datenbank.
Credentials-Provider und benutzerdefinierte Anmeldung ist eine kostenlose React Academy-Lektion auf CoddyKit. Dies ist Lektion 3 von 4. Du kannst die komplette Lektion unten kostenlos lesen – dann übst du sie direkt im Browser mit einem integrierten Code-Editor und einem KI-Tutor rund um die Uhr. Sie ist Teil des React Academy-Lernpfads, und dein Fortschritt wird über Web und CoddyKit-App synchronisiert. Der React Academy-Kurs umfasst insgesamt 4 Lektionen.
Wann der Credentials-Provider verwendet wird
Verwenden Sie den Credentials-Provider, wenn Sie sich gegen Ihre eigene Datenbank authentifizieren, also mit E-Mail-Adresse und Passwort statt über einen OAuth-Anbieter. Die Verarbeitung von Passworthashes und Sicherheitsaspekten erfordert besondere Sorgfalt.
Credentials-Provider definieren
Fügen Sie Credentials zum Provider-Array hinzu. Die Funktion authorize empfängt die übermittelten Zugangsdaten und gibt ein Benutzerobjekt oder null zurück.
import Credentials from 'next-auth/providers/credentials';
import bcrypt from 'bcryptjs';
export const { handlers, auth } = NextAuth({
providers: [
Credentials({
name: 'Credentials',
credentials: {
email: { label: 'Email', type: 'email' },
password: { label: 'Password', type: 'password' },
},
async authorize(credentials) {
const user = await db.user.findUnique({ where: { email: credentials.email as string } });
if (!user) return null;
const valid = await bcrypt.compare(credentials.password as string, user.passwordHash);
if (!valid) return null;
return { id: user.id, name: user.name, email: user.email };
},
}),
],
});Benutzerdefiniertes Anmeldeformular
Erstellen Sie das Anmeldeformular als Client Component, die signIn('credentials', { email, password }) aus next-auth/react aufruft.
'use client';
import { signIn } from 'next-auth/react';
export function LoginForm() {
const [error, setError] = useState('');
async function handleSubmit(e: React.FormEvent<HTMLFormElement>) {
e.preventDefault();
const form = new FormData(e.currentTarget);
const result = await signIn('credentials', {
email: form.get('email'),
password: form.get('password'),
redirect: false, // handle redirect manually
});
if (result?.error) setError('Invalid email or password');
else router.push('/dashboard');
}
return (
<form onSubmit={handleSubmit}>
{error && <p className="error">{error}</p>}
<input name="email" type="email" required />
<input name="password" type="password" required />
<button type="submit">Sign in</button>
</form>
);
}redirect: false zur Fehlerbehandlung
Übergeben Sie redirect: false an signIn(), um das Ergebnisobjekt zu erhalten und Fehler in der Komponente zu behandeln, anstatt zu einer Fehlerseite weitergeleitet zu werden.
const result = await signIn('credentials', { email, password, redirect: false });
if (result?.error) {
// result.error is 'CredentialsSignin' for auth failures
setError('Invalid email or password');
}Zod-Validierung in authorize
Validieren Sie die Zugangsdaten mit Zod innerhalb der Funktion authorize, bevor Sie auf die Datenbank zugreifen.
import { z } from 'zod';
const schema = z.object({ email: z.string().email(), password: z.string().min(8) });
async authorize(credentials) {
const parsed = schema.safeParse(credentials);
if (!parsed.success) return null;
const { email, password } = parsed.data;
// ... db lookup
}Sitzungsstrategie für Anmeldedaten
Der Credentials-Provider erfordert eine JWT-Sitzungsstrategie (für Sitzungen ist kein Datenbankadapter erforderlich). Setzen Sie session: { strategy: 'jwt' } ausdrücklich.
export const { handlers, auth } = NextAuth({
session: { strategy: 'jwt' },
providers: [Credentials({ ... })],
});Benutzerdefinierte Felder zur Sitzung hinzufügen
Übergeben Sie zusätzliche Benutzerdaten über die JWT- und Sitzungs-Callbacks, um sie in useSession() bereitzustellen.
callbacks: {
async jwt({ token, user }) {
if (user) { token.id = user.id; token.role = user.role; }
return token;
},
async session({ session, token }) {
session.user.id = token.id as string;
session.user.role = token.role as string;
return session;
},
},Passwörter hashen
Hashen Sie Passwörter vor dem Speichern immer mit bcrypt. Speichern Sie niemals Passwörter im Klartext.
import bcrypt from 'bcryptjs';
// On registration:
const passwordHash = await bcrypt.hash(password, 12);
await db.user.create({ data: { email, passwordHash } });
// On login (in authorize):
const valid = await bcrypt.compare(submittedPassword, user.passwordHash);Anmeldeversuche begrenzen
Schützen Sie den Credentials-Endpunkt vor Brute-Force-Angriffen, indem Sie Anmeldeversuche mit Middleware oder einem In-Memory-Speicher begrenzen.
// middleware.ts or in a rate-limiting library
import { Ratelimit } from '@upstash/ratelimit';
import { Redis } from '@upstash/redis';
const ratelimit = new Ratelimit({ redis: Redis.fromEnv(), limiter: Ratelimit.slidingWindow(10, '10 s') });
// Check in authorize before DB query:
const { success } = await ratelimit.limit(credentials.email as string);
if (!success) return null;Registrierungsablauf
Die Registrierung ist von Auth.js getrennt — erstellen Sie den Benutzer (mit gehashtem Passwort) über eine Server Action oder API-Route in Ihrer Datenbank und melden Sie ihn anschließend mit signIn('credentials', ...) an.
Schnelltest
Warum sollten Sie beim Aufruf von signIn() in einem benutzerdefinierten Anmeldeformular redirect: false übergeben?
Zusammenfassung
Der Credentials-Provider ruft Ihre authorize-Funktion mit den übermittelten Formulardaten auf. Validieren Sie die Daten mit Zod, vergleichen Sie gehashte Passwörter mit bcrypt und geben Sie ein Benutzerobjekt oder null zurück. Verwenden Sie im Formular redirect: false für eine benutzerdefinierte Fehlerbehandlung und setzen Sie für Credentials immer die JWT-Strategie ein.
Häufig gestellte Fragen
Ist die Lektion „Credentials-Provider und benutzerdefinierte Anmeldung“ kostenlos?
Ja — der vollständige Text von „Credentials-Provider und benutzerdefinierte Anmeldung“ ist hier im Web kostenlos zu lesen. Um sie interaktiv zu üben (integrierter Code-Editor und 24/7 KI-Tutor) und den Rest des React Academy-Kurses freizuschalten, upgrade auf CoddyKit PRO. Der React Academy-Kurs umfasst insgesamt 4 Lektionen.
Was lerne ich in „Credentials-Provider und benutzerdefinierte Anmeldung“?
Authentifizieren Sie Benutzer mit einem Credentials-Provider und einem benutzerdefinierten Anmeldeformular gegen eine Datenbank. Du übst React Academy mit praktischem Code, den du direkt im Browser ausführst, und ein 24/7 KI-Tutor beantwortet deine Fragen während du die Lektion bearbeitest.
Brauche ich Erfahrung, um React Academy zu starten?
Keine Vorkenntnisse erforderlich. React Academy auf CoddyKit ist für Anfänger bis fortgeschrittene Lernende strukturiert, sodass du hier starten oder von Anfang an beginnen und in deinem eigenen Tempo voranschreiten kannst. Dies ist Lektion 3 von 4.
Wie lange dauert die Lektion „Credentials-Provider und benutzerdefinierte Anmeldung“?
Die meisten CoddyKit-Lektionen dauern etwa 5–10 Minuten. Jede ist kompakt und interaktiv, sodass du stetig Fortschritte machst und genau dort weitermachst, wo du aufgehört hast – im Web und in der App.
Kann ich in dieser React Academy-Lektion Code schreiben und ausführen?
Ja. Jede React Academy-Lektion enthält einen integrierten Code-Editor, sodass du echten Code direkt in deinem Browser schreibst und ausführst und sofort KI-Feedback erhältst — ohne lokale Einrichtung erforderlich.
Alle Lektionen in diesem Kurs
- Auth.js im Next.js App Router einrichten
- Sitzungsverwaltung und useSession-Hook
- Credentials-Provider und benutzerdefinierte Anmeldung
- Route-Schutz auf Middleware-Basis