OAuth
Anmeldung mit Google, GitHub und anderen OAuth-Anbietern.
Hinweis: Dies sind Beispiel- bzw. Platzhalterinhalte zu Demonstrationszwecken.
Ermöglichen Sie Benutzern, sich mit ihren bestehenden Konten bei Google, GitHub und anderen Anbietern anzumelden.
Unterstützte Anbieter
Supabase unterstützt zahlreiche OAuth-Anbieter:
- GitHub
- GitLab
- Bitbucket
- Azure
- Discord
- Slack
- Und weitere...
OAuth einrichten
Im Supabase-Dashboard konfigurieren
- Gehen Sie zu Authentication → Providers
- Aktivieren Sie den gewünschten Anbieter (z. B. Google)
- Fügen Sie Ihre OAuth-Zugangsdaten hinzu:
- Client ID
- Client Secret
- Redirect URL:
https://your-project.supabase.co/auth/v1/callback
Google OAuth einrichten
- Rufen Sie die Google Cloud Console auf
- Erstellen Sie ein neues Projekt oder wählen Sie ein bestehendes aus
- Aktivieren Sie die Google+ API
- Erstellen Sie OAuth-2.0-Zugangsdaten
- Fügen Sie autorisierte Weiterleitungs-URIs hinzu:
- Produktion:
https://your-project.supabase.co/auth/v1/callback - Entwicklung:
http://localhost:54321/auth/v1/callback
- Produktion:
GitHub OAuth einrichten
- Gehen Sie zu GitHub Settings → Developer Settings → OAuth Apps
- Klicken Sie auf „New OAuth App“
- Füllen Sie die Angaben aus:
- Application name: Ihre App
- Homepage URL:
https://yourapp.com - Authorization callback URL:
https://your-project.supabase.co/auth/v1/callback
- Kopieren Sie Client ID und Client Secret nach Supabase
Implementierung
OAuth-Anmeldeschaltfläche
'use client';
import { signInWithOAuthAction } from '../_lib/actions';
export function OAuthButtons() {
const handleGoogleSignIn = async () => {
await signInWithOAuthAction('google');
};
const handleGitHubSignIn = async () => {
await signInWithOAuthAction('github');
};
return (
<div className="space-y-2">
<button
onClick={handleGoogleSignIn}
className="w-full flex items-center justify-center gap-2 border rounded-lg p-2"
>
<GoogleIcon />
Continue with Google
</button>
<button
onClick={handleGitHubSignIn}
className="w-full flex items-center justify-center gap-2 border rounded-lg p-2"
>
<GitHubIcon />
Continue with GitHub
</button>
</div>
);
}
Server Action
'use server';
import { enhanceAction } from '@kit/next/actions';
import { getSupabaseServerClient } from '@kit/supabase/server-client';
import { z } from 'zod';
const OAuthProviderSchema = z.enum([
'google',
'github',
'gitlab',
'azure',
'facebook',
]);
export const signInWithOAuthAction = enhanceAction(
async (provider) => {
const client = getSupabaseServerClient();
const origin = process.env.NEXT_PUBLIC_SITE_URL!;
const { data, error } = await client.auth.signInWithOAuth({
provider,
options: {
redirectTo: `${origin}/auth/callback`,
},
});
if (error) throw error;
// Weiterleitung zum OAuth-Anbieter
redirect(data.url);
},
{
schema: OAuthProviderSchema,
}
);
OAuth-Callback-Handler
// app/auth/callback/route.ts
import { createRouteHandlerClient } from '@supabase/auth-helpers-nextjs';
import { cookies } from 'next/headers';
import { NextResponse } from 'next/server';
export async function GET(request: Request) {
const requestUrl = new URL(request.url);
const code = requestUrl.searchParams.get('code');
if (code) {
const cookieStore = cookies();
const supabase = createRouteHandlerClient({ cookies: () => cookieStore });
await supabase.auth.exchangeCodeForSession(code);
}
// Weiterleitung zur Startseite
return NextResponse.redirect(new URL('/home', request.url));
}
OAuth-Ablauf anpassen
Scopes
Fordern Sie bestimmte Berechtigungen an:
await client.auth.signInWithOAuth({
provider: 'google',
options: {
scopes: 'email profile https://www.googleapis.com/auth/calendar',
},
});
Abfrageparameter
Übergeben Sie benutzerdefinierte Parameter:
await client.auth.signInWithOAuth({
provider: 'azure',
options: {
queryParams: {
prompt: 'consent',
access_type: 'offline',
},
},
});
Browser-Weiterleitung überspringen
Für mobile Apps oder benutzerdefinierte Abläufe:
const { data } = await client.auth.signInWithOAuth({
provider: 'google',
options: {
skipBrowserRedirect: true,
},
});
// data.url enthält die OAuth-URL
// Weiterleitung manuell durchführen
Kontoverknüpfung
Weitere Anbieter verknüpfen
Ermöglichen Sie Benutzern, mehrere OAuth-Konten zu verknüpfen:
export const linkOAuthProviderAction = enhanceAction(
async (provider) => {
const client = getSupabaseServerClient();
const user = await requireAuth();
const { data, error } = await client.auth.linkIdentity({
provider,
});
if (error) throw error;
redirect(data.url);
},
{ schema: OAuthProviderSchema, auth: true }
);
Verknüpfung von Anbietern aufheben
export const unlinkOAuthProviderAction = enhanceAction(
async ({ provider, identityId }) => {
const client = getSupabaseServerClient();
const { error } = await client.auth.unlinkIdentity({
identity_id: identityId,
});
if (error) throw error;
revalidatePath('/settings/security');
},
{
schema: z.object({
provider: z.string(),
identityId: z.string(),
}),
auth: true,
}
);
Verknüpfte Identitäten anzeigen
import { getSupabaseServerClient } from '@kit/supabase/server-client';
export async function getLinkedIdentities() {
const client = getSupabaseServerClient();
const { data: { user } } = await client.auth.getUser();
return user?.identities || [];
}
Benutzerdaten aus OAuth
Auf Anbieterdaten zugreifen
const { data: { user } } = await client.auth.getUser();
// Benutzermetadaten vom Anbieter
const {
full_name,
avatar_url,
email,
} = user.user_metadata;
// Anbieterspezifische Daten
const identities = user.identities || [];
const googleIdentity = identities.find(i => i.provider === 'google');
console.log(googleIdentity?.identity_data);
Zusätzliche Daten speichern
export const completeOAuthProfileAction = enhanceAction(
async (data) => {
const client = getSupabaseServerClient();
const user = await requireAuth();
// Benutzermetadaten aktualisieren
await client.auth.updateUser({
data: {
username: data.username,
bio: data.bio,
},
});
// Profil in der Datenbank aktualisieren
await client.from('profiles').upsert({
id: user.id,
username: data.username,
bio: data.bio,
avatar_url: user.user_metadata.avatar_url,
});
redirect('/home');
},
{ schema: ProfileSchema, auth: true }
);
Konfiguration
OAuth in der Konfiguration aktivieren
// config/auth.config.ts
export const authConfig = {
providers: {
emailPassword: true,
oAuth: ['google', 'github'],
},
};
Bedingtes Rendern
import { authConfig } from '~/config/auth.config';
export function AuthProviders() {
return (
<>
{authConfig.providers.emailPassword && <EmailPasswordForm />}
{authConfig.providers.oAuth?.includes('google') && (
<GoogleSignInButton />
)}
{authConfig.providers.oAuth?.includes('github') && (
<GitHubSignInButton />
)}
</>
);
}
Fehlerbehebung
Nicht übereinstimmende Weiterleitungs-URI
Stellen Sie sicher, dass die Weiterleitungs-URIs exakt übereinstimmen:
- Prüfen Sie Supabase Dashboard → Authentication → URL Configuration
- Überprüfen Sie die Einstellungen der OAuth-App in der Konsole des Anbieters
- Verwenden Sie exakte URLs (einschließlich http/https)
Fehlende E-Mail-Adresse
Einige Anbieter geben die E-Mail-Adresse standardmäßig nicht weiter:
const { data: { user } } = await client.auth.getUser();
if (!user.email) {
// E-Mail-Adresse separat anfordern oder Benutzer dazu auffordern
redirect('/auth/complete-profile');
}
Ratenbegrenzung
OAuth-Anbieter können Anfragen begrenzen:
- Speichern Sie OAuth-Tokens angemessen im Cache
- Stellen Sie keine übermäßig vielen Autorisierungsanfragen
- Behandeln Sie Fehler durch Ratenbegrenzung angemessen
Best Practices
- Minimale Scopes anfordern – Fragen Sie nur an, was Sie wirklich benötigen
- Fehler angemessen behandeln – OAuth kann aus vielen Gründen fehlschlagen
- E-Mail-Adressen verifizieren – Einige Anbieter verifizieren E-Mail-Adressen nicht
- Kontoverknüpfung unterstützen – Ermöglichen Sie Benutzern, mehrere Anbieter zu verbinden
- Alternative anbieten – Bieten Sie immer E-Mail/Passwort als Ausweichlösung an
- OAuth-Ereignisse protokollieren – Verfolgen Sie Anmeldungen und Verknüpfungsversuche
- Gründlich testen – Testen Sie mit echten Konten bei den Anbietern