Identidad federada y inicio de sesión social

La autenticación social es un flujo de autenticación de varios pasos que le permite registrar a un usuario en una cuenta o vincularlo con una existente.

Tanto las plataformas nativas como la web admiten la creación de una credencial que luego se puede pasar a los métodos signInWithCredential o linkWithCredential . Alternativamente, en las plataformas web, puede activar el proceso de autenticación mediante una ventana emergente o una redirección.

Google

La mayor parte de la configuración ya está configurada cuando se utiliza el inicio de sesión de Google con Firebase; sin embargo, debe asegurarse de que la clave SHA1 de su máquina esté configurada para usar con Android. Puedes ver cómo generar la clave en la documentación de autenticación .

Asegúrese de que el proveedor de inicio de sesión "Google" esté habilitado en Firebase Console .

Si su usuario inicia sesión con Google, después de haber registrado manualmente una cuenta, su proveedor de autenticación cambiará automáticamente a Google, debido al concepto de proveedores confiables de Firebase Authentications. Puedes encontrar más información sobre esto aquí .

iOS+ y Android

En plataformas nativas, se requiere una biblioteca de terceros para activar el flujo de autenticación.

Instale el complemento oficial google_sign_in .

Una vez instalada, active el flujo de inicio de sesión y cree una nueva credencial:

import 'package:google_sign_in/google_sign_in.dart';

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

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

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

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

Web

En la web, el SDK de Firebase brinda soporte para manejar automáticamente el flujo de autenticación mediante su proyecto de Firebase. Por ejemplo:

Cree un proveedor de autenticación de Google, proporcionando cualquier alcance de permiso adicional que desee obtener del usuario:

GoogleAuthProvider googleProvider = GoogleAuthProvider();

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

Proporcione la credencial al método signInWithPopup . Esto hará que aparezca una nueva ventana solicitando al usuario que inicie sesión en su proyecto. Alternativamente, puedes usar signInWithRedirect para mantener el proceso de autenticación en la misma ventana.

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

Juegos de Google Play

Puedes autenticar usuarios en tu juego de Android mediante el inicio de sesión de Play Games.

Androide

Sigue las instrucciones para la configuración de Google en Android y luego configura los servicios de Play Games con la información de tu aplicación Firebase .

Lo siguiente activará el flujo de inicio de sesión, creará una nueva credencial e iniciará sesión como usuario:

final googleUser = await GoogleSignIn(
  signInOption: SignInOption.games,
).signIn();

final googleAuth = await googleUser?.authentication;

if (googleAuth != null) {
  // Create a new credential
  final credential = GoogleAuthProvider.credential(
    accessToken: googleAuth.accessToken,
    idToken: googleAuth.idToken,
  );

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

Facebook

Antes de comenzar, configure su aplicación para desarrolladores de Facebook y siga el proceso de configuración para habilitar el inicio de sesión con Facebook.

Asegúrese de que el proveedor de inicio de sesión "Facebook" esté habilitado en Firebase Console . con el ID de la aplicación de Facebook y el conjunto secreto.

iOS+ y Android

En plataformas nativas, se requiere una biblioteca de terceros para instalar el SDK de Facebook y activar el flujo de autenticación.

Instale el complemento flutter_facebook_auth .

Deberá seguir los pasos de la documentación del complemento para asegurarse de que los SDK de Facebook de Android e iOS se hayan inicializado correctamente. Una vez completado, active el flujo de inicio de sesión, cree una credencial de Facebook e inicie sesión como usuario:

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

En la web, el SDK de Firebase brinda soporte para manejar automáticamente el flujo de autenticación utilizando los detalles de la aplicación de Facebook proporcionados en Firebase console. Por ejemplo:

Cree un proveedor de Facebook, proporcionando cualquier alcance de permiso adicional que desee obtener del usuario.

Asegúrese de que el URI de redireccionamiento de OAuth desde Firebase console se agregue como un URI de redireccionamiento de OAuth válido en su aplicación de Facebook.

FacebookAuthProvider facebookProvider = FacebookAuthProvider();

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

Proporcione la credencial al método signInWithPopup . Esto hará que aparezca una nueva ventana solicitando al usuario que inicie sesión en su aplicación de 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);
}

Manzana

iOS+

Antes de comenzar, configure Iniciar sesión con Apple y habilite Apple como proveedor de inicio de sesión .

A continuación, asegúrese de que sus aplicaciones Runner tengan la capacidad "Iniciar sesión con Apple".

Androide

Antes de comenzar, configure Iniciar sesión con Apple y habilite Apple como proveedor de inicio de sesión .

Web

Antes de comenzar, configure Iniciar sesión con Apple y habilite Apple como proveedor de inicio de sesión .

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

Revocar tokens de autenticación de Apple

El inicio de sesión de Apple en las plataformas Apple devuelve un código de autorización que se puede utilizar para revocar el token de autenticación de Apple mediante la 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!);
}

microsoft

iOS+

Antes de comenzar , configure Microsoft Login para iOS y agregue los esquemas de URL personalizados a su Runner (paso 1) .

Androide

Antes de comenzar , configure el inicio de sesión de Microsoft para Android .

No olvide agregar la huella digital SHA-1 de su aplicación.

Web

Antes de comenzar, configure el inicio de sesión de Microsoft para 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);
  }
}

Gorjeo

Asegúrese de que el proveedor de inicio de sesión "Twitter" esté habilitado en Firebase Console con una clave API y un secreto API configurados. Asegúrese de que su URI de redireccionamiento de Firebase OAuth (por ejemplo, my-app-12345.firebaseapp.com/__/auth/handler) esté configurado como su URL de devolución de llamada de autorización en la página de configuración de su aplicación en la configuración de su aplicación de Twitter .

Es posible que también deba solicitar acceso API elevado según su aplicación .

iOS+

Debe configurar su esquema de URL personalizado como se describe en el paso 1 de la guía de iOS .

Androide

Si aún no ha especificado la huella digital SHA-1 de su aplicación, hágalo desde la página Configuración de Firebase console. Consulte Autenticar a su cliente para obtener detalles sobre cómo obtener la huella digital SHA-1 de su aplicación.

Web

Funciona desde el primer momento.

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

Asegúrese de haber configurado una aplicación OAuth desde su configuración de desarrollador de GitHub y de que el proveedor de inicio de sesión "GitHub" esté habilitado en Firebase Console con el ID de cliente y el secreto configurados, con la URL de devolución de llamada configurada en la aplicación GitHub.

iOS+ y Android

Para plataformas nativas, debe agregar google-services.json y GoogleService-Info.plist .

Para iOS, agregue el esquema de URL personalizado como se describe en el paso 1 de la guía de iOS .

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

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

Web

En la web, el SDK de GitHub brinda soporte para manejar automáticamente el flujo de autenticación utilizando los detalles de la aplicación GitHub proporcionados en Firebase console. Asegúrese de que la URL de devolución de llamada en Firebase console se agregue como una URL de devolución de llamada en su aplicación GitHub en la consola de desarrollador.

Por ejemplo:

Cree un proveedor de GitHub y proporcione la credencial al método signInWithPopup . Esto hará que aparezca una nueva ventana solicitando al usuario que inicie sesión en su aplicación 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

Asegúrese de que el proveedor de inicio de sesión "Yahoo" esté habilitado en Firebase Console con una clave API y un secreto API configurados. También asegúrese de que su URI de redireccionamiento de Firebase OAuth (por ejemplo, my-app-12345.firebaseapp.com/__/auth/handler) esté configurado como un URI de redireccionamiento en la configuración de Yahoo Developer Network de su aplicación.

iOS+

Antes de comenzar, configure Yahoo Login para iOS y agregue los esquemas de URL personalizados a su Runner (paso 1) .

Androide

Antes de comenzar, configure Yahoo Login para Android .

No olvide agregar la huella digital SHA-1 de su aplicación.

Web

Funciona desde el primer momento.

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

Usando el token de acceso de OAuth

Al utilizar un AuthProvider, puede recuperar el token de acceso asociado con el proveedor realizando la siguiente solicitud.

final appleProvider = AppleAuthProvider();

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

// You can send requests with the `accessToken`

Vincular un proveedor de autenticación

Si desea vincular un proveedor a un usuario actual, puede utilizar el siguiente método: ```dart await FirebaseAuth.instance.signInAnonymfully();

final appleProvider = AppleAuthProvider();

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

// También puedes usar linkWithRedirect } else { await FirebaseAuth.instance.currentUser?.linkWithProvider(appleProvider); }

// Su usuario anónimo ahora está actualizado para poder conectarse con Iniciar sesión con Apple ```

Volver a autenticarse con el proveedor

Se puede usar el mismo patrón con reauthenticateWithProvider , que se puede usar para recuperar credenciales nuevas para operaciones confidenciales que requieren un inicio de sesión reciente.

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