Федеративная идентификация и вход через социальные сети

Социальная аутентификация — это многоэтапный процесс аутентификации, позволяющий авторизовать пользователя в учетной записи или связать его с уже существующей.

Как нативные платформы, так и веб-платформы поддерживают создание учетных данных, которые затем могут быть переданы методам signInWithCredential или linkWithCredential . В веб-платформах же процесс аутентификации может быть запущен через всплывающее окно или перенаправление.

Google

При использовании Google Sign-In с Firebase большая часть настроек уже задана, однако вам необходимо убедиться, что ключ SHA1 на вашем компьютере настроен для использования с Android. Инструкции по генерации ключа можно найти в документации по аутентификации .

Убедитесь, что в консоли Firebase включен поставщик услуг авторизации «Google».

Если пользователь входит в систему через Google после того, как уже вручную зарегистрировал учетную запись, его поставщик аутентификации автоматически изменится на Google в соответствии с концепцией доверенных поставщиков Firebase Authentications. Подробнее об этом можно узнать здесь .

iOS+ и Android

На нативных платформах для запуска процесса аутентификации требуется сторонняя библиотека.

Установите официальный плагин google_sign_in .

После установки запустите процесс входа в систему и создайте новые учетные данные:

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

Веб

В веб-версии Firebase SDK обеспечивает поддержку автоматической обработки процесса аутентификации с использованием вашего проекта Firebase. Например:

Создайте поставщика аутентификации Google, указав любые дополнительные права доступа, которые вы хотите получить от пользователя:

GoogleAuthProvider googleProvider = GoogleAuthProvider();

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

Передайте учетные данные методу signInWithPopup . Это вызовет появление нового окна с запросом на вход пользователя в ваш проект. В качестве альтернативы вы можете использовать signInWithRedirect чтобы процесс аутентификации проходил в том же окне.

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 (только для Android)

Убедитесь, что в консоли Firebase включен поставщик авторизации "Play Games". Следуйте этим инструкциям для настройки проекта Firebase "Play Games" .

Следуйте этим инструкциям для настройки сервисов Play Games в вашем приложении 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 и выполните действия по настройке, чтобы включить вход через Facebook.

Убедитесь, что в консоли Firebase включен поставщик авторизации «Facebook», а также указаны идентификатор приложения Facebook и секретный ключ.

iOS+ и Android

На нативных платформах для установки SDK Facebook и запуска процесса аутентификации требуется сторонняя библиотека.

Установите плагин flutter_facebook_auth .

Для корректной инициализации SDK Facebook для Android и iOS необходимо выполнить действия, описанные в документации плагина. После завершения запустите процесс авторизации, создайте учетные данные Facebook и выполните вход пользователя:

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

Веб

В веб-версии Firebase SDK обеспечивает поддержку автоматической обработки процесса аутентификации с использованием данных приложения Facebook, предоставляемых в консоли Firebase. Например:

Создайте поставщика услуг Facebook, указав любые дополнительные права доступа, которые вы хотите получить от пользователя.

Убедитесь, что URI перенаправления OAuth из консоли Firebase добавлен в ваше приложение Facebook как действительный URI перенаправления OAuth.

FacebookAuthProvider facebookProvider = FacebookAuthProvider();

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

Передайте учетные данные методу signInWithPopup . Это вызовет появление нового окна, предлагающего пользователю войти в ваше приложение 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);
}

Яблоко

iOS+

Прежде чем начать, настройте вход через Apple и включите Apple в качестве поставщика услуг авторизации .

Далее убедитесь, что ваши приложения Runner поддерживают функцию "Вход с помощью Apple".

Android

Прежде чем начать, настройте вход через Apple и включите Apple в качестве поставщика услуг авторизации .

Веб

Прежде чем начать, настройте вход через Apple и включите Apple в качестве поставщика услуг авторизации .

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

Вход только через платформу Apple.

Для входа в систему Apple на платформах iOS+ также можно использовать следующий метод:

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

Отозвать токены аутентификации Apple

При входе в систему Apple на платформах Apple возвращается код авторизации, который можно использовать для отзыва токена авторизации Apple с помощью 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!);
}

Apple Game Center (только для Apple)

Убедитесь, что в консоли Firebase включен поставщик авторизации «Game Center». Следуйте этим инструкциям для настройки проекта Firebase Game Center .

Для получения учетных данных Firebase Game Center и входа в систему через Firebase вам потребуется войти в Game Center. Вот несколько инструкций , как это сделать.

iOS+

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

Microsoft

iOS+

Прежде чем начать , настройте Microsoft Login для iOS и добавьте пользовательские схемы URL-адресов в ваш Runner (шаг 1) .

Android

Прежде чем приступить к настройке Microsoft Login для Android .

Не забудьте добавить SHA-1-отпечаток вашего приложения.

Веб

Прежде чем приступить к настройке Microsoft Login for 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);
  }
}

Твиттер

Убедитесь, что в консоли Firebase включен поставщик авторизации «Twitter» с указанием ключа API и секрета API. Убедитесь, что URI перенаправления Firebase OAuth (например, my-app-12345.firebaseapp.com/__/auth/handler) указан в качестве URL-адреса обратного вызова авторизации на странице настроек вашего приложения в конфигурации приложения Twitter .

В зависимости от вашего приложения вам также может потребоваться запросить расширенный доступ к API .

iOS+

Вам необходимо настроить собственную схему URL-адресов, как описано в шаге 1 руководства по iOS .

Android

Если вы еще не указали отпечаток SHA-1 вашего приложения, сделайте это на странице настроек консоли Firebase. Подробную информацию о том, как получить отпечаток SHA-1 вашего приложения, см. в разделе «Аутентификация клиента» .

Веб

Работает сразу после распаковки.

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

Убедитесь, что вы настроили приложение OAuth в настройках разработчика GitHub и что поставщик авторизации "GitHub" включен в консоли Firebase, а также указаны идентификатор клиента и секретный ключ, и что URL-адрес обратного вызова задан в приложении GitHub.

iOS+ и Android

Для нативных платформ необходимо добавить файлы google-services.json и GoogleService-Info.plist .

Для iOS добавьте пользовательскую схему URL-адресов, как описано в шаге 1 руководства для iOS .

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

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

Веб

В веб-версии SDK GitHub обеспечивает поддержку автоматической обработки процесса аутентификации с использованием сведений о приложении GitHub, предоставленных в консоли Firebase. Убедитесь, что URL-адрес обратного вызова в консоли Firebase добавлен в качестве URL-адреса обратного вызова в вашем приложении GitHub в консоли разработчика.

Например:

Создайте поставщика GitHub и передайте учетные данные методу signInWithPopup . Это вызовет появление нового окна, предлагающего пользователю войти в ваше приложение 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);
}

Яху

Убедитесь, что в консоли Firebase включен поставщик авторизации "Yahoo", а также указаны ключ API и секретный ключ API. Кроме того, убедитесь, что URI перенаправления Firebase OAuth (например, my-app-12345.firebaseapp.com/__/auth/handler) указан в качестве URI перенаправления в конфигурации вашего приложения в сети разработчиков Yahoo.

iOS+

Прежде чем начать, настройте вход в Yahoo для iOS и добавьте пользовательские схемы URL-адресов в ваш Runner (шаг 1) .

Android

Прежде чем начать, настройте вход в Yahoo для Android .

Не забудьте добавить SHA-1-отпечаток вашего приложения.

Веб

Работает сразу после распаковки.

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

Использование токена доступа OAuth

Используя AuthProvider, вы можете получить токен доступа, связанный с этим провайдером, отправив следующий запрос.

final appleProvider = AppleAuthProvider();

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

// You can send requests with the `accessToken`

Привязка поставщика аутентификации

Если вы хотите связать провайдера с текущим пользователем, вы можете использовать следующий метод:

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

Повторная аутентификация у поставщика услуг.

Аналогичный подход можно использовать с reauthenticateWithProvider , который позволяет получать актуальные учетные данные для выполнения конфиденциальных операций, требующих недавнего входа в систему.

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