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

Uwierzytelnianie społecznościowe to wieloetapowy proces uwierzytelniania, który umożliwia zalogowanie użytkownika na konto lub powiązanie go z istniejącym kontem.

Zarówno platformy natywne, jak i internetowe obsługują tworzenie danych logowania, które można następnie przekazywać do metod signInWithCredentiallub 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 przez Google w Firebase, ale musisz się upewnić, że klucz SHA1 na Twoim komputerze został skonfigurowany do używania z Androidem. Informacje o tym, jak wygenerować klucz, znajdziesz w dokumentacji uwierzytelniania.

Sprawdź, czy dostawca logowania „Google” jest włączony w konsoli Firebase.

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

iOS+ i Android

Na platformach natywnych do uruchomienia procesu uwierzytelniania wymagana jest biblioteka innej firmy.

Zainstaluj oficjalną wtyczkę google_sign_in.

Po zainstalowaniu 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.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);
}

Sieć

W przypadku internetu pakiet SDK Firebase obsługuje automatyczne zarządzanie procesem 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 w metodzie signInWithPopup. Spowoduje to wyświetlenie nowego okna z prośbą o zalogowanie się w projekcie. Możesz też użyć signInWithRedirect, aby proces uwierzytelniania pozostał 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 Androidzie)

Sprawdź, czy dostawca logowania „Gry Play” jest włączony w konsoli Firebase. Postępuj zgodnie z tymi instrukcjami, aby skonfigurować projekt Firebase w Usługach gier Play.

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 deweloperów na Facebooku i postępuj zgodnie z instrukcjami, aby włączyć logowanie przez Facebooka.

Sprawdź, czy dostawca logowania „Facebook” jest włączony w konsoli Firebase, a identyfikator aplikacji Facebooka i klucz tajny są ustawione.

iOS+ i Android

Na platformach natywnych do zainstalowania pakietu Facebook SDK i uruchomienia procesu uwierzytelniania wymagana jest biblioteka innej firmy.

Zainstaluj wtyczkę flutter_facebook_auth.

Aby upewnić się, że pakiety SDK Facebooka na Androida i iOS zostały prawidłowo zainicjowane, wykonaj czynności opisane w dokumentacji wtyczki. Po zakończeniu wywołaj 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 przypadku internetu pakiet SDK Firebase obsługuje automatyczne zarządzanie procesem uwierzytelniania przy użyciu szczegółów aplikacji na Facebooku podanych w konsoli Firebase. Przykład:

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

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

FacebookAuthProvider facebookProvider = FacebookAuthProvider();

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

Podaj dane logowania w metodzie signInWithPopup. Spowoduje to wyświetlenie nowego okna z prośbą o zalogowanie się w aplikacji na Facebooku:

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 się przez Applewłącz Apple jako dostawcę logowania.

Następnie upewnij się, że Twoje Runneraplikacje mają funkcję „Zaloguj się przez Apple”.

Android

Zanim zaczniesz, skonfiguruj logowanie się przez Applewłącz Apple jako dostawcę logowania.

Sieć

Zanim zaczniesz, skonfiguruj logowanie się przez Applewłą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

Logowanie przez Apple na platformach iOS+ można też zrealizować w ten sposób:

// 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żnianie tokenów uwierzytelniania Apple

Logowanie przez Apple na platformach Apple zwraca kod autoryzacji, którego można użyć do unieważnienia 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)

Sprawdź, czy dostawca logowania „Game Center” jest włączony w konsoli Firebase. Postępuj zgodnie z tymi instrukcjami, aby skonfigurować projekt Firebase w Game Center.

Zanim będzie można wydać dane logowania Game Center w Firebase i zalogować się za ich pomocą w Firebase, musisz zalogować się w Game Center. Tutaj znajdziesz instrukcje, jak to zrobić.

iOS+

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

Microsoft

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

Sprawdź, czy dostawca logowania „Twitter” jest włączony w konsoli Firebase i czy ustawiono klucz API oraz tajny klucz 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 na Twitterze.

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

iOS+

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

Android

Jeśli nie masz jeszcze określonego odcisku cyfrowego SHA-1 aplikacji, zrób to na stronie Ustawienia w konsoli Firebase. Szczegółowe informacje o tym, jak uzyskać odcisk cyfrowy SHA-1 aplikacji, znajdziesz w artykule Uwierzytelnianie klienta.

Sieć

Działa od razu po wyjęciu z pudełka.

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 masz skonfigurowaną aplikację OAuth w ustawieniach dewelopera GitHub i że dostawca logowania „GitHub” jest włączony w konsoli Firebase. Musisz też ustawić identyfikator klienta i klucz tajny oraz adres URL wywołania zwrotnego w aplikacji GitHub.

iOS+ i Android

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

W przypadku iOS dodaj schemat niestandardowego adresu URL zgodnie z instrukcjami w kroku 1 przewodnika po iOS.

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

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

Sieć

W internecie pakiet SDK GitHub obsługuje automatyczne zarządzanie procesem uwierzytelniania za pomocą szczegółów aplikacji GitHub podanych w konsoli Firebase. Sprawdź, czy URL wywołania zwrotnego w konsoli Firebase został dodany jako URL wywołania zwrotnego w aplikacji GitHub w konsoli dewelopera.

Przykład:

Utwórz dostawcę GitHub i podaj dane logowania w metodzie signInWithPopup. Spowoduje to wyświetlenie nowego okna z prośbą 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

Sprawdź, czy dostawca logowania „Yahoo” jest włączony w konsoli Firebase i czy ustawiono klucz interfejsu API oraz tajny klucz interfejsu 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 sieci deweloperów Yahoo Twojej aplikacji.

iOS+

Zanim zaczniesz, skonfiguruj logowanie przez Yahoo na iOS i dodaj niestandardowe schematy adresów URL do narzędzia Runner (krok 1).

Android

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

Nie zapomnij dodać odcisku cyfrowego SHA-1 aplikacji.

Sieć

Działa od razu po wyjęciu z pudełka.

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

Korzystając z usługi 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 bieżącym 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

Ten sam wzorzec można stosować w przypadku funkcji reauthenticateWithProvider, która umożliwia pobieranie nowych danych logowania do operacji wrażliwych wymagających 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