Saltare al contenuto

Impostazione di accesso Facebook

GitHub

In questa guida, imparerai a configurare il login con Facebook con Capgo Social Login. Avrai bisogno dei seguenti:

  • Un account di sviluppatore Facebook
  • Il nome del pacchetto o ID bundle della tua app
  • Accesso a una finestra di comando per generare hash chiave (Android)

Se non hai già creato un'app Facebook, segui questi passaggi:

  1. Crea un'app Facebook

    Segui il tutorial per Crea un'app

  2. Aggiungi Facebook Login alla tua app

    Nella tua dashboard di sviluppatore Facebook, aggiungi il prodotto Facebook Login alla tua app

  3. Prima di poter rilasciare la tua app al pubblico, segui questi tutorial per pubblicarla

Ecco dove trovare le informazioni chiave necessarie per l'integrazione:

  1. CLIENT_TOKEN:

    Pannello dello sviluppatore Facebook che mostra dove trovare il token del client
  2. APP_ID:

    Pannello dello sviluppatore Facebook che mostra dove trovare l'ID dell'app
  3. APP_NAME:

    Pannello dello sviluppatore Facebook che mostra dove trovare il nome dell'app

Questo plugin supporta Facebook Business Login per funzionalità e autorizzazioni relative alle imprese. Gli account aziendali possono richiedere autorizzazioni aggiuntive oltre a quelle standard per il login dei consumatori, comprese la gestione di Instagram e delle pagine.

Le autorizzazioni aziendali supportate includono:

  • instagram_basic - Accesso a Instagram Basic Display API
  • instagram_manage_insights - Accesso a Instagram Insights
  • pages_show_list - Elenco delle pagine gestite dalla persona
  • pages_read_engagement - Leggere i dati di engagement dalle pagine
  • pages_manage_posts - Gestire i post sulle pagine
  • business_management - Gestire gli asset aziendali

Vedi il Riferimento alle autorizzazioni Facebook per la lista completa delle autorizzazioni.

Requisiti di configurazione:

  1. Il tuo'app Facebook deve essere configurata come un'app aziendale nel Facebook Developer Console.
  2. Le autorizzazioni aziendali possono richiedere una revisione dell'app Facebook prima dell'uso in produzione.
  3. Il tuo app deve essere conforme alle politiche di utilizzo aziendale di Facebook.
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'],
},
});
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}'],
},
});

Nota importante:

  • Puoi testare le autorizzazioni aziendali con gli utenti di test e gli app di sviluppo prima della revisione dell'app.
  • La maggior parte delle autorizzazioni aziendali richiede la revisione dell'app di Facebook prima dell'uso in produzione.
  • Gli API aziendali hanno limiti di rateo diversi. Consulta la documentazione attuale di piattaforma di Facebook prima del lancio.
  • Segui le Guida di integrazione per l'azienda Facebook quando si configura l'applicazione.
  1. Aggiungi la permessione di rete al tuo AndroidManifest.xml

    Assicurati che questa riga sia presente:

    <uses-permission android:name="android.permission.INTERNET"/>
  2. Genera la tua chiave hash per Android

    Questo è un passaggio di sicurezza cruciale richiesto da Facebook. Apri il terminale e esegui:

    Finestra del terminale
    keytool -exportcert -alias androiddebugkey -keystore ~/.android/debug.keystore | openssl sha1 -binary | openssl base64 -A

    Quando ti viene chiesto di inserire una password, utilizza: android

  3. Aggiungi il valore del key hash al tuo'app Facebook

    1. Vai alla dashboard del tuo'app su Facebook Developers
    2. Naviga a Impostazioni > Base
    3. Scorri verso il basso fino alla sezione "Android"
    4. Clicca su "Aggiungi piattaforma" se Android non è ancora aggiunto e riempisci i dettagli
    5. Aggiungi il valore del key hash che hai generato
    6. Per la produzione, aggiungi sia il key hash di debug che di rilascio
  4. Aggiorna il tuo AndroidManifest.xml per includere:

    <application>
    ...
    <activity android:name="com.facebook.FacebookActivity"
    android:configChanges="keyboard|keyboardHidden|screenLayout|screenSize|orientation"
    android:label="@string/app_name" />
    <activity
    android: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>
  1. Vai alla dashboard del tuo app su Facebook Developers

    1. Copiare negli appunti
    2. Naviga alle impostazioni > Base
    3. Scorri fino in fondo alla pagina e clicca su “Aggiungi piattaforma”
    4. Scegli iOS e riempisci i dettagli richiesti
  2. Apre il tuo progetto Xcode e naviga su Info.plist

  3. Aggiungi le seguenti voci al tuo Info.plist:

    <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>
  4. Modifica il AppDelegate.swift

    import FBSDKCoreKit
    @UIApplicationMain
    class AppDelegate: UIResponder, UIApplicationDelegate {
    func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
    // Override point for customization after application launch.
    // Initialize Facebook SDK
    FBSDKCoreKit.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 call
    if (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)
    }
    }
    }
  1. Inizializza il login Facebook nel tuo app

    import { SocialLogin } from '@capgo/capacitor-social-login';
    // Initialize during app startup
    await SocialLogin.initialize({
    facebook: {
    appId: 'APP_ID',
    clientToken: 'CLIENT_TOKEN',
    }
    })
  2. Implementa la funzione di login

    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
    }
    }
  3. Ottenere i dati del profilo dell'utente

    Dopo un login riuscito, puoi recuperare informazioni di profilo aggiuntive:

    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 login
    async 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);
    }
    }
    }

    Tipologia di Token Limitazione: Il getProfile la chiamata funziona solo se hai un token di accesso token di accesso (accesso standard con tracciamento consentito). Se l'utente ha negato il tracciamento o stai utilizzando un accesso limitato (solo token JWT), questa chiamata fallirà. In tal caso, utilizza i dati del profilo forniti nella risposta di accesso iniziale.

__CAPGO_KEEP_0__ due tipi di token diversi in quanto gli utenti di iOS possono ricevere sia token di accesso che token JWT a seconda della loro scelta di trasparenza dell'app, mentre gli utenti di Android ricevono sempre token di accesso.

PiattaformaImpostazione di Login LimitatoScelta di ATT dell'UtenteTipo di Token di Risultato
iOStrueQualsiasiToken JWT
iOSfalseConsente la tracciaturaToken di accesso
iOSfalseNegato la tracciaturaToken JWT (override automatico)
AndroidQualsiasiN/DToken di accesso (sempre)

Implementazione del backend

Implementazione del backend
  1. Rileva il tipo di token e gestiscilo di conseguenza

    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);
    }
    }
  2. Esempio di integrazione con Firebase

    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 validation
    try {
    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;
    }
    }
  3. Validazione JWT di backend

    // Backend: Validate JWT token from Facebook
    import 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-claims
    const 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 JWT
    const userInfo = {
    id: decoded.sub,
    email: decoded.email,
    name: decoded.name,
    isJWTAuth: true
    };
    // Create your app's session/token
    const 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' });
    }
    });
  4. Manutentore di token di backend generico

    // Handle both token types in your backend
    async function authenticateFacebookUser(tokenData: any) {
    if (tokenData.accessToken) {
    // Handle access token - validate with Facebook Graph API
    const 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-claims
    const 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');
    }
    }

Access Token (Login Standard):

  • Android: Disponibile sempre (le restrizioni iOS non si applicano)
  • iOS: Solo quando l'utente consente esplicitamente la tracciabilità dell'app
  • ✅ Può essere utilizzato per accedere al Graph di Facebook API
  • ✅ Tempi di scadenza più lunghi
  • ✅ Disponibile maggiori dati utente
  • Diventa meno comune su iOS poiché gli utenti aumentano sempre di più la negazione del tracking

Token JWT (Modalità Privacy iOS-Only):

  • Android: Mai si verifica (non supportato)
  • iOS: Quando il tracking è negato o limitedLogin: true
  • ✅ Rispetta le preferenze di privacy degli utenti iOS
  • ❌ Contiene solo informazioni utente base
  • ❌ Tempi di scadenza più brevi
  • ❌ Nessun accesso al Graph di Facebook API
  • ⚠️ Ora lo scenario più comune per gli utenti di iOS

Comportamento Specifico per Piattaforma:

  • Applicazioni iOS: Devono gestire sia i token di accesso che i token JWT
  • Applicazioni Android: Hanno bisogno di gestire solo i token di accesso
  • Applicazioni cross-platform: Devono implementare entrambi i metodi di gestione dei token

La nuova sequenza di login di Facebook richiede il Web API per la generazione di nonce, disponibile solo nei contesti sicuri Copia negli appunti:

// 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
// ...
}

Requisiti di contesto sicuro (Web/__CAPGO_KEEP_0__)

Sezione intitolata “Problemi di ambiente di sviluppo”

Problema comune: ionic serve con URL HTTP rompe l'autenticazione di Facebook

AmbienteCriptazione API DisponibileL'accesso di Facebook funziona
http://localhost:3000✅ Sì✅ Sì
http://127.0.0.1:3000✅ Sì✅ Sì
http://192.168.1.100:3000❌ No❌ No
https://any-domain.com✅ Sì✅ Sì
  1. Usa localhost per il testing web

    Finestra del terminale
    # Instead of ionic serve --host=0.0.0.0
    ionic serve --host=localhost
  2. Abilita HTTPS in Ionic

    Finestra del terminale
    ionic serve --ssl
  3. Testa su dispositivi reali

    Finestra del terminale
    # Capacitor apps run in secure context on devices
    ionic cap run ios
    ionic cap run android
  4. Generazione alternativa di nonce per lo sviluppo

    async function generateNonce() {
    if (typeof crypto !== 'undefined' && crypto.subtle) {
    // Secure context - use crypto.subtle
    return 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));
    }
    }

Il recente documento di Firebase richiede token JWT con nonce per l'autenticazione di Facebook, indipendentemente dalle impostazioni di accesso. Questo approccio funziona sia con sia limitedLogin: true e 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
}
});

Limitazione di sviluppo: Se si utilizza ionic serve su una rete IP (non localhost), l'accesso a Facebook fallirà a causa delle restrizioni di crittografia API. Utilizzare localhost o HTTPS per le prove web.

  1. Errori di chiave hash su Android

    • Controlla di nuovo che hai aggiunto la chiave hash corretta al dashboard di Facebook
    • Assicurati di aver aggiunto sia la chiave hash di debug che quella di release per le release
    • Verifica di utilizzare il keystore corretto quando generi la chiave hash
  2. Non compare il pulsante di login Facebook

    • Verifica tutte le voci del manifesto sono corrette
    • Assicurati che il tuo ID App Facebook e il Token Client siano corretti
    • Assicurati di aver inizializzato correttamente il SDK
  3. Problemi comuni su iOS

    • Assicurati che tutte le voci di Info.plist siano corrette
    • Verifica che i schemi di URL siano configurati correttamente
    • Assicurati che il tuo ID bundle corrisponda a quanto registrato nel dashboard Facebook
  1. Prima di testare, aggiungi utenti di test nel Console dello Sviluppatore Facebook

    • Vai a Ruoli > Utenti di test
    • Crea un utente di test
    • Usa questi dati per le prove
  2. Testa sia le versioni di debug che di rilascio

    • Versione di debug con chiave hash di debug
    • Versione di rilascio con chiave hash di rilascio
    • Testa su entrambi l'emulatore e i dispositivi fisici

Ricorda di testare l'intero flusso di accesso, compresi:

  • Accesso riuscito
  • Annullamento dell'accesso
  • Gestione degli errori
  • Funzionalità di logout

If sei stai utilizzando Configurazione di Facebook Login per pianificare l'autenticazione e le flussi di account, connettilo con Utilizza @capgo/capacitor-login-social per la capacità nativa in Utilizza @capgo/capacitor-login-social @capgo/capacitor-login-social per il dettaglio di implementazione in @capgo/capacitor-login-social @capgo/capacitor-passkey per il dettaglio di implementazione in @capgo/capacitor-passkey @capgo/capacitor-biometria-nativa per il dettaglio di implementazione in @capgo/capacitor-biometria-nativa, e Autenticazione a due fattori per i dettagli di implementazione in due fattori di autenticazione.