Identità federata e accesso con le credenziali social

L'autenticazione social è un flusso di autenticazione in più passaggi che ti consente di registrare un utente in un account o di collegarlo a uno esistente.

Sia le piattaforme native sia il web supportano la creazione di una credenziale che può essere passata ai metodi signInWithCredential o linkWithCredential. In alternativa, sulle piattaforme web puoi attivare la procedura di autenticazione tramite un popup o un reindirizzamento.

Google

La maggior parte della configurazione è già impostata quando utilizzi Accedi con Google con Firebase, ma devi assicurarti che la chiave SHA1 del tuo computer sia configurata per l'utilizzo con Android. Puoi scoprire come generare la chiave nella documentazione sull'autenticazione.

Assicurati che il provider di accesso "Google" sia abilitato nella console Firebase.

Se l'utente accede con Google dopo aver già registrato manualmente un account, il provider di autenticazione verrà modificato automaticamente in Google, grazie al concetto di provider attendibili di Firebase Authentication. Puoi scoprire di più su questo qui.

iOS+ e Android

Sulle piattaforme native è necessaria una libreria di terze parti per attivare il flusso di autenticazione.

Installa il plug-in ufficiale google_sign_in.

Una volta installato, attiva il flusso di accesso e crea una nuova credenziale:

import 'package:google_sign_in/google_sign_in.dart';

Future<UserCredential> signInWithGoogle() async {
  // Trigger the authentication flow
  final GoogleSignInAccount? googleUser = await GoogleSignIn.instance.authenticate();

  // Obtain the auth details from the request
  final GoogleSignInAuthentication googleAuth = googleUser.authentication;

  // Create a new credential
  final credential = GoogleAuthProvider.credential(idToken: googleAuth.idToken);

  // Once signed in, return the UserCredential
  return await FirebaseAuth.instance.signInWithCredential(credential);
}

Web

Sul web, l'SDK Firebase fornisce il supporto per la gestione automatica del flusso di autenticazione utilizzando il progetto Firebase. Ad esempio:

Crea un provider di autenticazione Google, fornendo qualsiasi ambito di autorizzazione aggiuntivo che vuoi ottenere dall'utente:

GoogleAuthProvider googleProvider = GoogleAuthProvider();

googleProvider.addScope('https://www.googleapis.com/auth/contacts.readonly');
googleProvider.setCustomParameters({
  'login_hint': 'user@example.com'
});

Fornisci la credenziale al metodo signInWithPopup. Verrà visualizzata una nuova finestra che chiede all'utente di accedere al tuo progetto. In alternativa, puoi utilizzare signInWithRedirect per mantenere la procedura di autenticazione nella stessa finestra.

Future<UserCredential> signInWithGoogle() async {
  // Create a new provider
  GoogleAuthProvider googleProvider = GoogleAuthProvider();

  googleProvider.addScope('https://www.googleapis.com/auth/contacts.readonly');
  googleProvider.setCustomParameters({
    'login_hint': 'user@example.com'
  });

  // Once signed in, return the UserCredential
  return await FirebaseAuth.instance.signInWithPopup(googleProvider);

  // Or use signInWithRedirect
  // return await FirebaseAuth.instance.signInWithRedirect(googleProvider);
}

Google Play Games (solo Android)

Assicurati che il provider di accesso "Play Giochi" sia abilitato nella console Firebase. Segui queste istruzioni per la configurazione del progetto Firebase di Play Giochi.

Segui queste istruzioni per configurare i servizi Play Giochi con la tua app Firebase.

Android

Future<void> _signInWithPlayGames() async {
  // Get server auth code from 3rd party provider
  // See PR description for details on how you might get the server auth code:
  // https://github.com/firebase/flutterfire/pull/12201#issue-2100392487
  final serverAuthCode = '...';
  final playGamesCredential = PlayGamesAuthProvider.credential(
                                          serverAuthCode: serverAuthCode);

  await FirebaseAuth.instance
    .signInWithCredential(playGamesCredential);
}

Facebook

Prima di iniziare, configura l'app per sviluppatori di Facebook e segui la procedura di configurazione per attivare l'accesso con Facebook.

Assicurati che il provider di accesso "Facebook" sia abilitato nella console Firebase. con l'ID app e il secret di Facebook impostati.

iOS+ e Android

Sulle piattaforme native è necessaria una libreria di terze parti per installare l'SDK Facebook e attivare il flusso di autenticazione.

Installa il flutter_facebook_auth plug-in.

Dovrai seguire i passaggi descritti nella documentazione del plug-in per assicurarti che gli SDK Facebook per Android e iOS siano stati inizializzati correttamente. Una volta completata, attiva il flusso di accesso, crea una credenziale di Facebook e registra l'utente:

import 'package:flutter_facebook_auth/flutter_facebook_auth.dart';

Future<UserCredential> signInWithFacebook() async {
  // Trigger the sign-in flow
  final LoginResult loginResult = await FacebookAuth.instance.login();

  // Create a credential from the access token
  final OAuthCredential facebookAuthCredential = FacebookAuthProvider.credential(loginResult.accessToken.token);

  // Once signed in, return the UserCredential
  return FirebaseAuth.instance.signInWithCredential(facebookAuthCredential);
}

Web

Sul web, l'SDK Firebase fornisce il supporto per la gestione automatica del flusso di autenticazione utilizzando i dettagli dell'applicazione Facebook forniti nella console Firebase. Ad esempio:

Crea un provider Facebook, fornendo qualsiasi ambito di autorizzazione aggiuntivo che vuoi ottenere dall'utente.

Assicurati che l'URI di reindirizzamento OAuth della console Firebase sia aggiunto come URI di reindirizzamento OAuth valido nella tua app Facebook.

FacebookAuthProvider facebookProvider = FacebookAuthProvider();

facebookProvider.addScope('email');
facebookProvider.setCustomParameters({
  'display': 'popup',
});

Fornisci la credenziale al metodo signInWithPopup. Verrà visualizzata una nuova finestra che chiede all'utente di accedere alla tua applicazione Facebook:

Future<UserCredential> signInWithFacebook() async {
  // Create a new provider
  FacebookAuthProvider facebookProvider = FacebookAuthProvider();

  facebookProvider.addScope('email');
  facebookProvider.setCustomParameters({
    'display': 'popup',
  });

  // Once signed in, return the UserCredential
  return await FirebaseAuth.instance.signInWithPopup(facebookProvider);

  // Or use signInWithRedirect
  // return await FirebaseAuth.instance.signInWithRedirect(facebookProvider);
}

Apple

iOS+

Prima di iniziare, configura Accedi con Apple e attiva Apple come provider di accesso.

A questo punto, assicurati che le tue app Runner abbiano la funzionalità "Accedi con Apple".

Android

Prima di iniziare, configura Accedi con Apple e attiva Apple come provider di accesso.

Web

Prima di iniziare, configura Accedi con Apple e attiva Apple come provider di accesso.

import 'package:firebase_auth/firebase_auth.dart';

Future<UserCredential> signInWithApple() async {
  final appleProvider = AppleAuthProvider();
  if (kIsWeb) {
    await FirebaseAuth.instance.signInWithPopup(appleProvider);
  } else {
    await FirebaseAuth.instance.signInWithProvider(appleProvider);
  }
}

Accesso solo alla piattaforma Apple

L'accesso con Apple sulle piattaforme iOS+ può essere eseguito anche con il seguente metodo:

// Implement a function that generates a nonce. See iOS documentation for how to create a nonce:
// https://firebase.google.com/docs/auth/ios/apple#sign_in_with_apple_and_authenticate_with_firebase
String rawNonce = createNonce();
// Create a SHA-256 hash of the nonce. Consider using the `crypto` package from the pub.dev registry.
String hashSHA256String = createHashSHA256String(rawNonce);
// Use the hash of the nonce to get the idToken. Consider using the `sign_in_with_apple` plugin from the pub.dev registry.
String idToken = await getIdToken();

final fullName = AppleFullPersonName(
  familyName: 'Name',
  givenName: 'Your',
);
// Use the `rawNonce` and `idToken` to get the credential
final credential = AppleAuthProvider.credentialWithIDToken(
  idToken,
  rawNonce,
  fullName,
);

await FirebaseAuth.instance.signInWithCredential(credential);

Revocare i token di autenticazione Apple

L'accesso con Apple sulle piattaforme Apple restituisce un codice di autorizzazione che può essere utilizzato per revocare il token di autenticazione Apple utilizzando l'API revokeTokenWithAuthorizationCode().

import 'package:firebase_auth/firebase_auth.dart';

Future<UserCredential> signInWithApple() async {
  final appleProvider = AppleAuthProvider();

  UserCredential userCredential = await FirebaseAuth.instance.signInWithPopup(appleProvider);
  // Keep the authorization code returned from Apple platforms
  String? authCode = userCredential.additionalUserInfo?.authorizationCode;
  // Revoke Apple auth token
  await FirebaseAuth.instance.revokeTokenWithAuthorizationCode(authCode!);
}

Game Center di Apple (solo Apple)

Assicurati che il provider di accesso "Game Center" sia abilitato nella console Firebase. Segui queste istruzioni per la configurazione del progetto Firebase di Game Center.

Dovrai accedere con Game Center prima che possa essere emessa una credenziale di Game Center di Firebase e che tu possa accedere tramite Firebase. Ecco alcune istruzioni su come eseguire questa operazione.

iOS+

Future<void> _signInWithGameCenter() async {
  final credential = GameCenterAuthProvider.credential();
  await FirebaseAuth.instance
      .signInWithCredential(credential);
}

Microsoft

iOS+

Prima di iniziare, configura l'accesso con Microsoft per iOS e aggiungi gli schemi URL personalizzati al tuo Runner (passaggio 1).

Android

Prima di iniziare, configura l'accesso con Microsoft per Android.

Non dimenticare di aggiungere l'impronta SHA-1 della tua app.

Web

Prima di iniziare, configura l'accesso con Microsoft per il web.

import 'package:firebase_auth/firebase_auth.dart';

Future<UserCredential> signInWithMicrosoft() async {
  final microsoftProvider = MicrosoftAuthProvider();
  if (kIsWeb) {
    await FirebaseAuth.instance.signInWithPopup(microsoftProvider);
  } else {
    await FirebaseAuth.instance.signInWithProvider(microsoftProvider);
  }
}

Twitter

Assicurati che il provider di accesso "Twitter" sia abilitato nella console Firebase con una chiave API e un secret API impostati. Assicurati che l'URI di reindirizzamento OAuth di Firebase (ad es. my-app-12345.firebaseapp.com/__/auth/handler) sia impostato come URL di callback di autorizzazione nella pagina delle impostazioni dell'app nella configurazione dell'app Twitter.

A seconda dell'app, potresti anche dover richiedere l'accesso API avanzato.

iOS+

Devi configurare lo schema URL personalizzato come descritto nel passaggio 1 della guida per iOS.

Android

Se non hai ancora specificato l'impronta SHA-1 della tua app, fallo dalla pagina Impostazioni della console Firebase. Per informazioni dettagliate su come ottenere l'impronta SHA-1 della tua app, consulta Autenticare il client.

Web

Funziona immediatamente.

import 'package:firebase_auth/firebase_auth.dart';

Future<void> _signInWithTwitter() async {
  TwitterAuthProvider twitterProvider = TwitterAuthProvider();

  if (kIsWeb) {
    await FirebaseAuth.instance.signInWithPopup(twitterProvider);
  } else {
    await FirebaseAuth.instance.signInWithProvider(twitterProvider);
  }
}

GitHub

Assicurati di aver configurato un'app OAuth dalle impostazioni per sviluppatori di GitHub e che il provider di accesso "GitHub" sia abilitato nella console Firebase con l'ID client e il secret impostati, con l'URL di callback impostato nell'app GitHub.

iOS+ e Android

Per le piattaforme native, devi aggiungere google-services.json e GoogleService-Info.plist.

Per iOS, aggiungi lo schema URL personalizzato come descritto nel passaggio 1 della guida per iOS.

Future<UserCredential> signInWithGitHub() async {
  // Create a new provider
  GithubAuthProvider githubProvider = GithubAuthProvider();

  return await FirebaseAuth.instance.signInWithProvider(githubProvider);
}

Web

Sul web, l'SDK GitHub fornisce il supporto per la gestione automatica del flusso di autenticazione utilizzando i dettagli dell'applicazione GitHub forniti nella console Firebase. Assicurati che l'URL di callback nella console Firebase sia aggiunto come URL di callback nella tua applicazione GitHub nella console per sviluppatori.

Ad esempio:

Crea un provider GitHub e fornisci la credenziale al metodo signInWithPopup. Verrà visualizzata una nuova finestra che chiede all'utente di accedere alla tua applicazione GitHub:

Future<UserCredential> signInWithGitHub() async {
  // Create a new provider
  GithubAuthProvider githubProvider = GithubAuthProvider();

  // Once signed in, return the UserCredential
  return await FirebaseAuth.instance.signInWithPopup(githubProvider);

  // Or use signInWithRedirect
  // return await FirebaseAuth.instance.signInWithRedirect(githubProvider);
}

Yahoo

Assicurati che il provider di accesso "Yahoo" sia abilitato nella console Firebase con una chiave API e un secret API impostati. Assicurati inoltre che l'URI di reindirizzamento OAuth di Firebase (ad es. my-app-12345.firebaseapp.com/__/auth/handler) sia impostato come URI di reindirizzamento nella configurazione di Yahoo Developer Network della tua app.

iOS+

Prima di iniziare, configura l'accesso con Yahoo per iOS e aggiungi gli schemi URL personalizzati al tuo Runner (passaggio 1).

Android

Prima di iniziare, configura l'accesso con Yahoo per Android.

Non dimenticare di aggiungere l'impronta SHA-1 della tua app.

Web

Funziona immediatamente.

import 'package:firebase_auth/firebase_auth.dart';

Future<UserCredential> signInWithYahoo() async {
  final yahooProvider = YahooAuthProvider();
  if (kIsWeb) {
    await _auth.signInWithPopup(yahooProvider);
  } else {
    await _auth.signInWithProvider(yahooProvider);
  }
}

Utilizzare il token di accesso OAuth

Utilizzando un AuthProvider, puoi recuperare il token di accesso associato al provider effettuando la seguente richiesta.

final appleProvider = AppleAuthProvider();

final user = await FirebaseAuth.instance.signInWithProvider(appleProvider);
final accessToken = user.credential?.accessToken;

// You can send requests with the `accessToken`

Collegare un provider di autenticazione

Se vuoi collegare un provider a un utente attuale, puoi utilizzare il seguente metodo:

await FirebaseAuth.instance.signInAnonymously();

final appleProvider = AppleAuthProvider();

if (kIsWeb) {
  await FirebaseAuth.instance.currentUser?.linkWithPopup(appleProvider);

  // You can also use `linkWithRedirect`
} else {
  await FirebaseAuth.instance.currentUser?.linkWithProvider(appleProvider);
}

// You're anonymous user is now upgraded to be able to connect with Sign In With Apple

Eseguire di nuovo l'autenticazione con il provider

Lo stesso pattern può essere utilizzato con reauthenticateWithProvider, che può essere utilizzato per recuperare nuove credenziali per le operazioni sensibili che richiedono l'accesso recente.

final appleProvider = AppleAuthProvider();

if (kIsWeb) {
  await FirebaseAuth.instance.currentUser?.reauthenticateWithPopup(appleProvider);

  // Or you can reauthenticate with a redirection
  // await FirebaseAuth.instance.currentUser?.reauthenticateWithRedirect(appleProvider);
} else {
  await FirebaseAuth.instance.currentUser?.reauthenticateWithProvider(appleProvider);
}

// You can now perform sensitive operations