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

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

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

Google

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

Убедитесь, что провайдер входа Google включен в консоли Firebase .

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

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

Установите официальный плагин 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().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);
}

В Интернете 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 Игры». Следуйте этим инструкциям по настройке проекта Play Games Firebase .

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

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

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

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

Установите плагин 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 добавлен как действительный URI перенаправления OAuth в вашем приложении Facebook.

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

Яблоко

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

Затем убедитесь, что в ваших приложениях Runner есть возможность «Войти через Apple».

Прежде чем начать, настройте вход с помощью 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». Следуйте этим инструкциям для настройки проекта Game Center Firebase .

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

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

Майкрософт

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

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

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

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

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

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

Если вы еще не указали отпечаток 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.

Для нативных платформ вам необходимо добавить 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);
}

В Интернете GitHub SDK обеспечивает поддержку автоматической обработки потока аутентификации с использованием сведений о приложении 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);
}

Yahoo

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

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

Прежде чем начать, настройте вход в 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`

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

Если вы хотите связать провайдера с текущим пользователем, вы можете использовать следующий метод: ```dart await FirebaseAuth.instance.signInAnonymous();

окончательный appleProvider = AppleAuthProvider();

если (kIsWeb) {ждут FirebaseAuth.instance.currentUser?.linkWithPopup(appleProvider);

// Вы также можете использовать linkWithRedirect } else { await FirebaseAuth.instance.currentUser?.linkWithProvider(appleProvider); }

// Ваш анонимный пользователь теперь обновлен, чтобы иметь возможность подключаться с помощью функции «Вход через 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