0Pricing
React Academy · Lektion

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

  1. Auth.js im Next.js App Router einrichten
  2. Sitzungsverwaltung und useSession-Hook
  3. Credentials-Provider und benutzerdefinierte Anmeldung
  4. Route-Schutz auf Middleware-Basis
← Zurück zu React Academy