Социальная аутентификация — это многоэтапный процесс аутентификации, позволяющий вам регистрировать пользователя в учетной записи или привязывать его к существующей учетной записи.
Как нативные платформы, так и веб-приложения поддерживают создание учётных данных, которые затем можно передать методам signInWithCredential или linkWithCredential . Кроме того, на веб-платформах процесс аутентификации можно запустить через всплывающее окно или перенаправление.
При использовании входа через Google с Firebase большая часть настроек уже настроена, однако вам необходимо убедиться, что ключ SHA1 вашего устройства настроен для использования с Android. Инструкции по генерации ключа см. в документации по аутентификации .
Убедитесь, что в консоли Firebase включен поставщик входа «Google».
Если ваш пользователь войдет в систему через Google, предварительно зарегистрировав учетную запись вручную, его поставщик аутентификации автоматически изменится на Google в соответствии с концепцией доверенных поставщиков аутентификации Firebase. Подробнее об этом можно узнать здесь .
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)
Убедитесь, что поставщик входа «Play Games» включён в консоли Firebase . Следуйте этим инструкциям по настройке проекта 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 и секретный ключ.
iOS+ и Android
На собственных платформах для установки 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);
}
Яблоко
iOS+
Прежде чем начать, настройте функцию «Вход с 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)
Убедитесь, что поставщик входа «Game Center» включён в консоли Firebase . Следуйте этим инструкциям по настройке проекта Game Center в Firebase .
Вам необходимо войти в Game Center, прежде чем вы сможете получить учётные данные Firebase Game Center и войти через Firebase. Вот несколько инструкций по этому вопросу.
iOS+
Future<void> _signInWithGameCenter() async {
final credential = GameCenterAuthProvider.credential();
await FirebaseAuth.instance
.signInWithCredential(credential);
}
Майкрософт
iOS+
Прежде чем приступить к настройке Microsoft Login для iOS и добавить пользовательские схемы URL в свой Runner (шаг 1) .
Андроид
Прежде чем приступить к настройке 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);
}
}
Твиттер
Убедитесь, что поставщик входа «Twitter» включён в консоли Firebase с заданными ключом API и секретным ключом API. Убедитесь, что ваш URI перенаправления Firebase OAuth (например, my-app-12345.firebaseapp.com/__/auth/handler) задан в качестве URL-адреса обратного вызова авторизации на странице настроек приложения в файле config приложения Twitter .
В зависимости от вашего приложения вам также может потребоваться запросить расширенный доступ к API .
iOS+
Вам необходимо настроить собственную схему 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.
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);
}
Интернет
В веб-версии 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» включён в консоли Firebase , и заданы ключ API и секретный ключ API. Также убедитесь, что URI перенаправления Firebase OAuth (например, my-app-12345.firebaseapp.com/__/auth/handler) задан как URI перенаправления в конфигурации Yahoo Developer Network вашего приложения.
iOS+
Прежде чем начать, настройте Yahoo Login для iOS и добавьте пользовательские схемы URL в свой Runner (шаг 1) .
Андроид
Прежде чем начать, настройте Yahoo Login для 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