Facebook Login einrichten
Kopiere einen Setup-Prompt mit den Installationsschritten und dem vollständigen Markdown-Guide für dieses Plugin.
Einführung
Abschnitt „Einführung“In diesem Guide lernst du, wie du Facebook Login mit Capgo Social Login einrichtest. Du benötigst Folgendes:
- Ein Facebook Developer Account
- Den Package Name/Bundle ID deiner App
- Terminal-Zugriff zum Generieren von Key Hashes (Android)
Allgemeine Einrichtung
Abschnitt mit dem Titel „General Setup“Falls du noch keine Facebook-App erstellt hast, folge diesen Schritten:
-
Facebook-App erstellen
Folge dem Tutorial, um eine App zu erstellen
-
Facebook Login zu deiner App hinzuzufügen
Füge in deinem Facebook Developer Dashboard das Produkt Facebook Login zu deiner App hinzu
-
Bevor du deine App veröffentlichen kannst, folge diesem Tutorial um sie zu publizieren
Wichtige Informationen
Abschnitt „Wichtige Informationen“Hier findest du die wichtigsten Informationen für die Integration:
-
CLIENT_TOKEN:
-
APP_ID:
-
APP_NAME:
Facebook Business Login
Abschnitt „Facebook Business Login“Dieses Plugin unterstützt Facebook Business Login für geschäftsspezifische Features und Berechtigungen. Business-Accounts können zusätzliche Berechtigungen über den Standard-Consumer-Login hinaus anfordern, einschließlich der Verwaltung von Instagram und Pages.
Unterstützte Business-Berechtigungen sind:
instagram_basic- Zugriff auf Instagram Basic Display APIinstagram_manage_insights- Zugriff auf Instagram Insightspages_show_list- Liste der verwalteten Pagespages_read_engagement- Engagement-Daten von Pages lesenpages_manage_posts- Posts auf Pages verwaltenbusiness_management- Business-Assets verwalten
Siehe den Facebook-Berechtigungen im Überblick für die vollständige Liste der Berechtigungen.
Konfigurationsanforderungen:
- Deine Facebook-App muss in der Facebook Developer Console als Business-App konfiguriert sein.
- Business-Berechtigungen erfordern eventuell einen Facebook App Review vor der produktiven Nutzung.
- Deine App muss den Facebook Business Use Case Richtlinien entsprechen.
Instagram Basic Access
Abschnitt mit dem Titel „Instagram Basic Access“await SocialLogin.initialize({ facebook: { appId: 'your-business-app-id', clientToken: 'your-client-token', },});
const res = await SocialLogin.login({ provider: 'facebook', options: { permissions: [ 'email', 'public_profile', 'instagram_basic', 'pages_show_list', 'pages_read_engagement', ], },});
const profile = await SocialLogin.providerSpecificCall({ call: 'facebook#getProfile', options: { fields: ['id', 'name', 'email', 'instagram_business_account'], },});Pages-Verwaltung
Abschnitt „Seitenverwaltung“const res = await SocialLogin.login({ provider: 'facebook', options: { permissions: [ 'email', 'pages_show_list', 'pages_manage_posts', 'pages_read_engagement', ], },});
const profile = await SocialLogin.providerSpecificCall({ call: 'facebook#getProfile', options: { fields: ['id', 'name', 'accounts{id,name,instagram_business_account}'], },});Wichtige Hinweise:
- Du kannst Business-Berechtigungen vor dem App Review mit Test-Usern und Development-Apps testen.
- Die meisten Business-Berechtigungen erfordern ein Facebook App Review vor der produktiven Nutzung.
- Business-APIs haben unterschiedliche Rate Limits. Prüfe die aktuelle Facebook-Dokumentation vor dem Launch.
- Folge dem Facebook Business Integrations-Leitfaden bei der Konfiguration der App.
Android-Setup
Abschnitt „Android Setup“-
Füge die Internet-Berechtigung zu deiner
AndroidManifest.xmlStelle sicher, dass diese Zeile vorhanden ist:
<uses-permission android:name="android.permission.INTERNET"/> -
Generiere deinen Android Key Hash
Dies ist ein wichtiger Sicherheitsschritt, den Facebook voraussetzt. Öffne dein Terminal und führe aus:
Terminalfenster keytool -exportcert -alias androiddebugkey -keystore ~/.android/debug.keystore | openssl sha1 -binary | openssl base64 -AGib bei der Passwortabfrage Folgendes ein:
android -
Füge den Key Hash zu deiner Facebook-App hinzu
- Gehe zum Dashboard deiner App bei Facebook Developers
- Navigiere zu Einstellungen > Grundlegendes
- Scrolle nach unten zum Bereich „Android“
- Klicke auf „Plattform hinzufügen“, falls Android noch nicht hinzugefügt ist, und trage die Details ein
- Füge den generierten Key Hash hinzu
- Füge für die Produktion sowohl Debug- als auch Release-Key-Hashes hinzu
-
Aktualisiere dein
AndroidManifest.xmlZum Einbinden:<application>...<activity android:name="com.facebook.FacebookActivity"android:configChanges="keyboard|keyboardHidden|screenLayout|screenSize|orientation"android:label="@string/app_name" /><activityandroid:name="com.facebook.CustomTabActivity"android:exported="true"><intent-filter><action android:name="android.intent.action.VIEW" /><category android:name="android.intent.category.DEFAULT" /><category android:name="android.intent.category.BROWSABLE" /><data android:scheme="FB[APP_ID]" /></intent-filter></activity></application>
iOS-Setup
Abschnitt mit dem Titel „iOS Setup“-
Füge die iOS-Plattform in der Facebook Developer Console hinzu
- Gehe zum Dashboard deiner App bei Facebook Developers
- Navigiere zu Einstellungen > Grundlegendes
- Scrolle auf der Seite ganz nach unten und klicke auf „Add Platform“
- Wähle iOS aus und fülle die erforderlichen Details aus
-
Öffne dein Xcode-Projekt und navigiere zur Info.plist
-
Füge die folgenden Einträge zu deiner Info.plist hinzu:
<key>FacebookAppID</key><string>[APP-ID]</string><key>FacebookClientToken</key><string>[CLIENT-TOKEN]</string><key>FacebookDisplayName</key><string>[APP-NAME]</string><key>LSApplicationQueriesSchemes</key><array><string>fbapi</string><string>fb-messenger-share-api</string></array><key>CFBundleURLTypes</key><array><dict><key>CFBundleURLSchemes</key><array><string>fb[APP-ID]</string></array></dict></array> -
Ändere die
AppDelegate.swiftimport FBSDKCoreKit@UIApplicationMainclass AppDelegate: UIResponder, UIApplicationDelegate {func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {// Override point for customization after application launch.// Initialize Facebook SDKFBSDKCoreKit.ApplicationDelegate.shared.application(application,didFinishLaunchingWithOptions: launchOptions)return true}func application(_ app: UIApplication, open url: URL, options: [UIApplication.OpenURLOptionsKey: Any] = [:]) -> Bool {// Called when the app was launched with a url. Feel free to add additional processing here,// but if you want the App API to support tracking app url opens, make sure to keep this callif (FBSDKCoreKit.ApplicationDelegate.shared.application(app,open: url,sourceApplication: options[UIApplication.OpenURLOptionsKey.sourceApplication] as? String,annotation: options[UIApplication.OpenURLOptionsKey.annotation])) {return true;} else {return ApplicationDelegateProxy.shared.application(app, open: url, options: options)}}}
Facebook Login in deiner App nutzen
Abschnitt mit dem Titel „Facebook Login in deiner App nutzen“-
Facebook-Login in deiner App initialisieren
import { SocialLogin } from '@capgo/capacitor-social-login';// Initialize during app startupawait SocialLogin.initialize({facebook: {appId: 'APP_ID',clientToken: 'CLIENT_TOKEN',}}) -
Login-Funktion implementieren
async function loginWithFacebook() {try {const result = await SocialLogin.login({provider: 'facebook',options: {permissions: ['email', 'public_profile'],limitedLogin: false // See Limited Login section below for important details}});console.log('Facebook login result:', result);// Handle successful login} catch (error) {console.error('Facebook login error:', error);// Handle error}} -
Benutzerprofil-Daten abrufen
Nach dem erfolgreichen Login kannst du weitere Profilinformationen abrufen:
async function getFacebookProfile() {try {const profileResponse = await SocialLogin.providerSpecificCall({call: 'facebook#getProfile',options: {fields: ['id', 'name', 'email', 'first_name', 'last_name', 'picture']}});console.log('Facebook profile:', profileResponse.profile);return profileResponse.profile;} catch (error) {console.error('Failed to get Facebook profile:', error);return null;}}// Example usage after loginasync function loginAndGetProfile() {const loginResult = await loginWithFacebook();if (loginResult) {const profile = await getFacebookProfile();if (profile) {console.log('User ID:', profile.id);console.log('Name:', profile.name);console.log('Email:', profile.email);console.log('Profile Picture:', profile.picture?.data?.url);}}}Einschränkung des Token-Typs: Das
getProfilefunktioniert nur, wenn du einen Access Token (Standard-Login mit Tracking erlaubt) hast. Wenn der User Tracking abgelehnt hat oder du Limited Login (nur JWT-Token) nutzt, schlägt dieser Aufruf fehl. Nutze in diesem Fall die Profil-Daten aus der initialen Login-Response.
⚠️ Kritisch: Backend-Token-Handling
Abschnitt: „⚠️ Kritisch: Backend-Token-Handling“Dein Backend muss zwei verschiedene Token-Typen verarbeiten, da iOS-Nutzer je nach ihrer Entscheidung bei App Tracking Transparency entweder Access Tokens oder JWT Tokens erhalten, während Android-Nutzer immer Access Tokens bekommen.
Token-Typen nach Plattform
Abschnitt mit dem Titel „Token-Typen nach Plattform“| Plattform | limitedLogin-Einstellung | ATT-Entscheidung des Nutzers | Resultierender Token-Typ |
|---|---|---|---|
| iOS | true | Beliebig | JWT-Token |
| iOS | false | Tracking erlaubt | Access-Token |
| iOS | false | Tracking verweigert | JWT-Token (Auto-Override) |
| Android | Beliebig | n. v. | Access Token (immer) |
Backend-Implementierung
Abschnitt: „Backend-Implementierung“-
Token-Typ erkennen und verarbeiten
async function loginWithFacebook() {try {const loginResult = await SocialLogin.login({provider: 'facebook',options: {permissions: ['email', 'public_profile'],limitedLogin: false // iOS: depends on ATT, Android: ignored}});if (loginResult.accessToken) {// Access token (Android always, iOS when tracking allowed)return handleAccessToken(loginResult.accessToken.token);} else if (loginResult.idToken) {// JWT token (iOS only when tracking denied or limitedLogin: true)return handleJWTToken(loginResult.idToken);}} catch (error) {console.error('Facebook login error:', error);}} -
Beispiel: Firebase-Integration
import { OAuthProvider, FacebookAuthProvider, signInWithCredential } from 'firebase/auth';async function handleAccessToken(accessToken: string, nonce: string) {// For access tokens, use OAuthProvider (new method)const fbOAuth = new OAuthProvider("facebook.com");const credential = fbOAuth.credential({idToken: accessToken,rawNonce: nonce});try {const userResponse = await signInWithCredential(auth, credential);return userResponse;} catch (error) {console.error('Firebase OAuth error:', error);return false;}}async function handleJWTToken(jwtToken: string) {// For JWT tokens, send to your backend for validationtry {const response = await fetch('/api/auth/facebook-jwt', {method: 'POST',headers: {'Content-Type': 'application/json',},body: JSON.stringify({ jwtToken })});const result = await response.json();return result;} catch (error) {console.error('JWT validation error:', error);return false;}} -
Backend JWT-Validierung
// Backend: Validate JWT token from Facebookimport jwt from 'jsonwebtoken';import { Request, Response } from 'express';app.post('/api/auth/facebook-jwt', async (req: Request, res: Response) => {const { jwtToken } = req.body;try {// Verify JWT token with Facebook's public key// See: https://developers.facebook.com/docs/facebook-login/limited-login/token/validating/#standard-claimsconst decoded = jwt.verify(jwtToken, getFacebookPublicKey(), {algorithms: ['RS256'],audience: process.env.FACEBOOK_APP_ID,issuer: 'https://www.facebook.com' // From: https://www.facebook.com/.well-known/openid-configuration/?_rdr});// Extract user info from JWTconst userInfo = {id: decoded.sub,email: decoded.email,name: decoded.name,isJWTAuth: true};// Create your app's session/tokenconst sessionToken = createUserSession(userInfo);res.json({success: true,token: sessionToken,user: userInfo});} catch (error) {console.error('JWT validation failed:', error);res.status(401).json({ success: false, error: 'Invalid token' });}}); -
Allgemeiner Backend-Token-Handler
// Handle both token types in your backendasync function authenticateFacebookUser(tokenData: any) {if (tokenData.accessToken) {// Handle access token - validate with Facebook Graph APIconst response = await fetch(`https://graph.facebook.com/me?access_token=${tokenData.accessToken}&fields=id,name,email`);const userInfo = await response.json();return {user: userInfo,tokenType: 'access_token',expiresIn: tokenData.expiresIn || 3600};} else if (tokenData.jwtToken) {// Handle JWT token - decode and validate// See: https://developers.facebook.com/docs/facebook-login/limited-login/token/validating/#standard-claimsconst decoded = jwt.verify(tokenData.jwtToken, getFacebookPublicKey());return {user: {id: decoded.sub,name: decoded.name,email: decoded.email},tokenType: 'jwt',expiresIn: decoded.exp - Math.floor(Date.now() / 1000)};} else {throw new Error('No valid token provided');}}
Wichtige Aspekte
Abschnitt mit dem Titel „Wichtige Hinweise“Access Token (Standard-Login):
- ✅ Android: Immer verfügbar (iOS-Einschränkungen gelten nicht)
- ✅ iOS: Nur wenn der User App-Tracking explizit erlaubt
- ✅ Zugriff auf Facebook Graph API möglich
- ✅ Längere Expiration-Zeiten
- ✅ Mehr User-Daten verfügbar
- ❌ Wird unter iOS seltener da User Tracking immer häufiger ablehnen
JWT-Token (iOS-only Privacy Mode):
- ❌ Android: Tritt nie auf (nicht unterstützt)
- ✅ iOS: Wenn Tracking abgelehnt wurde oder
limitedLogin: true - ✅ Beachtet iOS-Datenschutzeinstellungen
- ❌ Enthält nur Basis-Nutzerinfos
- ❌ Kürzere Expiration-Zeiten
- ❌ Kein Zugriff auf Facebook Graph API
- ⚠️ Aktuell das häufigste Szenario für iOS-Nutzer
Plattformspezifisches Verhalten:
- iOS-Apps: Muss sowohl Access Tokens ALS AUCH JWT-Tokens verarbeiten
- Android-Apps: Muss nur Access Tokens verarbeiten
- Cross-Platform-Apps: Muss beide Token-Handling-Methoden implementieren
Secure-Context-Anforderungen (Web/Capacitor)
Abschnitt mit dem Titel „Sichere Kontext-Anforderungen (Web/Capacitor)“Crypto API Einschränkungen
Abschnitt: „Crypto API Einschränkungen“Der aktualisierte Facebook-Login-Flow benötigt Web Crypto API für die Nonce-Generierung, die nur in sicheren Kontexten verfügbar ist:
// This requires secure context (HTTPS or localhost)async function sha256(message: string) { const msgBuffer = new TextEncoder().encode(message); const hashBuffer = await crypto.subtle.digest("SHA-256", msgBuffer); // ❌ Fails in insecure context // ...}Probleme mit der Entwicklungsumgebung
Abschnitt: „Probleme mit der Entwicklungsumgebung“Häufiges Problem: ionic serve mit HTTP-URLs bricht die Facebook-Authentifizierung
| Umgebung | Crypto API verfügbar | Facebook Login funktioniert |
|---|---|---|
http://localhost:3000 | ✅ Ja | ✅ Ja |
http://127.0.0.1:3000 | ✅ Ja | ✅ Ja |
http://192.168.1.100:3000 | ❌ Nein | ❌ Nein |
https://any-domain.com | ✅ Ja | ✅ Ja |
Lösungen für die Capacitor-Entwicklung
Abschnitt mit dem Titel „Lösungen für Capacitor Entwicklung“-
Nutze localhost für Web-Tests
Terminalfenster # Instead of ionic serve --host=0.0.0.0ionic serve --host=localhost -
HTTPS in Ionic aktivieren
Terminalfenster ionic serve --ssl -
Auf echten Geräten testen
Terminalfenster # Capacitor apps run in secure context on devicesionic cap run iosionic cap run android -
Alternative Nonce-Generierung für die Entwicklung
async function generateNonce() {if (typeof crypto !== 'undefined' && crypto.subtle) {// Secure context - use crypto.subtlereturn await sha256(Math.random().toString(36).substring(2, 10));} else {// Fallback for development (not secure for production)console.warn('Using fallback nonce - not secure for production');return btoa(Math.random().toString(36).substring(2, 10));}}
Hinweis zur Firebase-Integration
Abschnitt mit dem Titel „Hinweis zur Firebase-Integration“Die aktuelle Firebase-Dokumentation erfordert für die Facebook-Authentifizierung JWT-Token mit Nonces, unabhängig von den Login-Einstellungen. Dieser Ansatz funktioniert sowohl mit limitedLogin: true und limitedLogin: false:
// Both modes can return JWT tokens depending on user choice const loginResult = await SocialLogin.login({ provider: 'facebook', options: { permissions: ['email', 'public_profile'], limitedLogin: false, // true = always JWT, false = depends on user tracking choice nonce: nonce } });Einschränkung in der Entwicklung: If you’re using ionic serve über eine Netzwerk-IP (nicht localhost) nutzt, schlägt der Facebook-Login aufgrund von Einschränkungen bei Crypto API fehl. Nutze localhost oder HTTPS für Web-Tests.
Fehlerbehebung
Abschnitt mit dem Titel „Troubleshooting“Häufige Probleme und Lösungen
Abschnitt „Häufige Probleme und Lösungen“-
Key-Hash-Fehler unter Android
- Prüfe, ob du den richtigen Key-Hash im Facebook-Dashboard hinterlegt hast
- Füge bei Release-Builds sowohl den Debug- als auch den Release-Key-Hash hinzu
- Stelle sicher, dass du beim Generieren des Hashs den richtigen Keystore verwendest
-
Facebook-Login-Button wird nicht angezeigt
- Überprüfe, ob alle Manifest-Einträge korrekt sind
- Prüfe, ob deine Facebook App ID und dein Client Token stimmen
- Stelle sicher, dass du SDK korrekt initialisiert hast
-
Häufige iOS-Probleme
- Stelle sicher, dass alle Info.plist-Einträge korrekt sind
- Prüfen, ob URL-Schemes korrekt konfiguriert sind
- Prüfen, ob die Bundle ID mit dem Facebook Dashboard übereinstimmt
Testen
Abschnitt: „Testing“-
Vor dem Testen Test-User in der Facebook Developer Console anlegen
- Navigiere zu Roles > Test Users
- Einen Test-User erstellen
- Diese Credentials für Tests verwenden
-
Sowohl Debug- als auch Release-Builds testen
- Debug-Build mit Debug-Key-Hash
- Release-Build mit Release-Key-Hash
- Auf Emulatoren und echten Geräten testen
Vergiss nicht, den gesamten Login-Flow zu testen, inklusive:
- Erfolgreicher Login
- Login-Abbruch
- Fehlerbehandlung
- Logout-Funktionalität
Weiter nach dem Facebook Login Setup
Abschnitt mit dem Titel „Weiter geht's nach dem Facebook Login Setup“Wenn du es nutzt Facebook Login einrichten Um Authentifizierungs- und Account-Flows zu planen, verbinde es mit @capgo/capacitor-social-login verwenden für die native Funktion bei der Verwendung von @capgo/capacitor-social-login, @capgo/capacitor-social-login für die Implementierungsdetails in @capgo/capacitor-social-login, @capgo/capacitor-passkey für die Implementierungsdetails in @capgo/capacitor-passkey, @capgo/capacitor-native-biometric für die Implementierungsdetails in @capgo/capacitor-native-biometric, und Zwei-Faktor-Authentifizierung für die Implementierungsdetails zur Zwei-Faktor-Authentifizierung.