Tożsamość sfederowana i logowanie się w mediach społecznościowych

Uwierzytelnianie przez media społecznościowe to proces uwierzytelniania wieloetapowego, który umożliwia logowanie użytkownika na koncie lub jego łączenie z istniejącym kontem.

Zarówno platformy natywne, jak i internetowe obsługują tworzenie danych logowania, które można następnie przekazać do metod signInWithCredential lub linkWithCredential. Na platformach internetowych możesz też uruchomić proces uwierzytelniania za pomocą wyskakującego okienka lub przekierowania.

Google

Większość konfiguracji jest już skonfigurowana, gdy używasz logowania Google z Firebase, ale musisz się upewnić, że klucz SHA1 Twojego komputera jest skonfigurowany do użycia z Androidem. Informacje o generowaniu klucza znajdziesz w dokumentacji uwierzytelniania.

Upewnij się, że dostawca logowania „Google” jest włączony w konsoli Firebase.

Jeśli użytkownik zaloguje się za pomocą Google, po ręcznym zarejestrowaniu konta jego dostawca uwierzytelniania zostanie automatycznie zmieniony na Google ze względu na koncepcję zaufanych dostawców uwierzytelniania w Firebase Authentication. Więcej informacji na ten temat znajdziesz tutaj.

iOS+ i Android

Na platformach natywnych do wywołania procesu uwierzytelniania wymagana jest biblioteka zewnętrzna.

Zainstaluj oficjalną wtyczkę google_sign_in.

Po zainstalowaniu aplikacji uruchom proces logowania i utwórz nowe dane logowania:

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

Sieć

W internecie pakiet SDK Firebase umożliwia automatyczne przetwarzanie procesu uwierzytelniania za pomocą projektu Firebase. Przykład:

Utwórz dostawcę uwierzytelniania Google, podając dodatkowe zakresy uprawnień, które chcesz uzyskać od użytkownika:

GoogleAuthProvider googleProvider = GoogleAuthProvider();

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

Podaj dane logowania do metody signInWithPopup. Wyświetli się nowe okno, w którym użytkownik będzie mógł zalogować się w Twoim projekcie. Możesz też użyć signInWithRedirect, aby proces uwierzytelniania odbywał się w tym samym oknie.

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

Gry Google Play (tylko na Androida)

Upewnij się, że w konsoli Firebase włączony jest dostawca logowania „Gry Play”. Postępuj zgodnie z tymi instrukcjami, aby skonfigurować projekt Firebase w Google Play Games.

Postępuj zgodnie z tymi instrukcjami konfigurowania usług gier Play w aplikacji 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

Zanim zaczniesz, skonfiguruj aplikację dla dewelopera Facebooka i wykonaj proces konfiguracji, aby włączyć logowanie przez Facebooka.

Upewnij się, że dostawca logowania „Facebook” jest włączony w Konsoli Firebase z ustawionym identyfikatorem i kluczem tajnym aplikacji Facebook.

iOS+ i Android

Na platformach natywnych do zainstalowania pakietu SDK Facebooka i wywołania procesu uwierzytelniania wymagana jest biblioteka innej firmy.

Zainstaluj wtyczkę flutter_facebook_auth.

Aby sprawdzić, czy pakiety SDK Facebooka na Androida i iOS zostały prawidłowo zainicjowane, wykonaj czynności opisane w dokumentacji wtyczki. Po zakończeniu procesu uruchom proces logowania, utwórz dane logowania na Facebooku i zaloguj użytkownika:

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

Sieć

W internecie pakiet SDK Firebase umożliwia automatyczne przetwarzanie procesu uwierzytelniania za pomocą danych aplikacji Facebooka podanych w konsoli Firebase. Przykład:

Utwórz dostawcę Facebooka, podając dodatkowe uprawnienia, których chcesz otrzymać od użytkownika.

Upewnij się, że identyfikator URI przekierowania OAuth z konsoli Firebase został dodany jako prawidłowy identyfikator URI przekierowania OAuth w aplikacji na Facebooku.

FacebookAuthProvider facebookProvider = FacebookAuthProvider();

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

Podaj dane logowania do metody signInWithPopup. Wyświetli się nowe okno z prośbą o zalogowanie się w aplikacji 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+

Zanim zaczniesz, skonfiguruj logowanie przez Apple i włącz Apple jako dostawcę logowania.

Następnie sprawdź, czy aplikacje Runner mają funkcję „Zaloguj się przez Apple”.

Android

Zanim zaczniesz, skonfiguruj logowanie przez Apple i włącz Apple jako dostawcę logowania.

Sieć

Zanim zaczniesz, skonfiguruj logowanie przez Apple i włącz Apple jako dostawcę logowania.

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

Tylko logowanie na platformie Apple

Zalogowanie się w Apple na platformach iOS+ jest też możliwe za pomocą tej metody:

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

Unieważnia tokenów uwierzytelniających Apple

Logowanie Apple na platformach Apple zwraca kod autoryzacji, którego można użyć do odwołania tokena autoryzacji Apple za pomocą interfejsu revokeTokenWithAuthorizationCode()API.

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

Apple Game Center (tylko Apple)

Upewnij się, że w konsoli Firebase włączony jest logowanie za pomocą usługi „Game Center”. Postępuj zgodnie z tymi instrukcjami dotyczącymi konfigurowania projektu Firebase w Game Center.

Zanim zaczniesz korzystać z uprawnień Firebase Game Center, musisz się zalogować w usłudze Game Center. Tutaj znajdziesz instrukcje, jak to zrobić.

iOS+

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

Microsoft

iOS+

Zanim zaczniesz, skonfiguruj logowanie Microsoft na iOS i dodaj niestandardowe schematy adresów URL do swojego Runnera (krok 1).

Android

Zanim zaczniesz, skonfiguruj logowanie Microsoft na Androida.

Nie zapomnij dodać odcisku cyfrowego SHA-1 aplikacji.

Sieć

Zanim zaczniesz, skonfiguruj logowanie Microsoft dla sieci 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

Upewnij się, że dostawca logowania „Twitter” jest włączony w konsoli Firebase z ustawionym kluczem API i kluczem tajnym API. Upewnij się, że identyfikator URI przekierowania protokołu OAuth Firebase (np. my-app-12345.firebaseapp.com/__/auth/handler) jest ustawiony jako adres URL wywołania zwrotnego autoryzacji na stronie ustawień aplikacji w konfiguracji aplikacji Twitter.

W zależności od aplikacji może też być konieczne przesłanie prośby o rozszerzenie dostępu do interfejsu API.

iOS+

Musisz skonfigurować schemat niestandardowego adresu URL zgodnie z opisem w kroku 1 przewodnika po iOS.

Android

Jeśli nie masz jeszcze podanego odcisku palca SHA-1 aplikacji, zrób to na stronie Ustawienia w konsoli Firebase. Szczegółowe informacje o pobieraniu odcisku cyfrowego SHA-1 aplikacji znajdziesz w artykule Uwierzytelnianie klienta.

Sieć

Gotowe do użycia.

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

Upewnij się, że skonfigurowano aplikację OAuth w ustawieniach dewelopera GitHuba, a także że w konsoli Firebase włączono dostawcę logowania „GitHub” z ustawionymi identyfikatorem klienta i kluczem tajnym oraz z adresem URL wywołania zwrotnego ustawionym w aplikacji GitHub.

iOS+ i Android

W przypadku platform natywnych musisz dodać google-services.jsonGoogleService-Info.plist.

W przypadku iOS dodaj niestandardowy schemat adresu URL zgodnie z instrukcjami podanymi w kroku 1 w przewodniku na temat iOS.

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

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

Sieć

W internecie pakiet SDK GitHuba umożliwia automatyczne przetwarzanie procesu uwierzytelniania za pomocą danych aplikacji GitHub podanych w Konsoli Firebase. Upewnij się, że URL wywołania zwrotnego w konsoli Firebase został dodany jako URL wywołania zwrotnego w aplikacji GitHub w konsoli dla deweloperów.

Przykład:

Utwórz dostawcę GitHub i podaj dane logowania do metody signInWithPopup. Spowoduje to wyświetlenie nowego okna, w którym użytkownik zostanie poproszony o zalogowanie się w aplikacji 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

Upewnij się, że dostawca logowania „Yahoo” jest włączony w konsoli Firebase z ustawionym kluczem API i kluczem tajnym API. Sprawdź też, czy identyfikator URI przekierowania protokołu OAuth Firebase (np. my-app-12345.firebaseapp.com/__/auth/handler) jest ustawiony jako identyfikator URI przekierowania w konfiguracji aplikacji w Yahoo Developer Network.

iOS+

Zanim zaczniesz, skonfiguruj logowanie Yahoo na iOS i dodaj niestandardowe schematy adresów URL do swojego Runnera (krok 1).

Android

Zanim zaczniesz, skonfiguruj logowanie Yahoo na urządzeniu z Androidem.

Nie zapomnij dodać odcisku cyfrowego SHA-1 aplikacji.

Sieć

Gotowe do użycia.

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

Korzystanie z tokena dostępu OAuth

Za pomocą klasy AuthProvider możesz pobrać token dostępu powiązany z dostawcą, wysyłając to żądanie.

final appleProvider = AppleAuthProvider();

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

// You can send requests with the `accessToken`

Łączenie dostawcy uwierzytelniania

Jeśli chcesz połączyć dostawcę z obecnym użytkownikiem, możesz użyć tej metody:

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

Ponowne uwierzytelnianie u dostawcy

Tego samego schematu można używać w przypadku funkcji reauthenticateWithProvider, która umożliwia pobieranie nowych danych logowania na potrzeby operacji narażonych na wyciek danych, które wymagają niedawnego zalogowania się.

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