זהות מאוחדת & כניסה ברשתות חברתיות

אימות חברתי הוא תהליך אימות רב-שלבי שמאפשר לכם להכניס משתמש לחשבון או לקשר אותו לחשבון קיים.

גם בפלטפורמות מקוריות וגם באינטרנט יש תמיכה ביצירת פרטי כניסה, שאפשר להעביר לאחר מכן לשיטות signInWithCredential או linkWithCredential. לחלופין, בפלטפורמות אינטרנט אפשר להפעיל את תהליך האימות באמצעות חלון קופץ או הפניה אוטומטית.

Google

רוב ההגדרות כבר מוגדרות כשמשתמשים בכניסה באמצעות חשבון Google עם Firebase, אבל צריך לוודא שמפתח ה-SHA1 של המכונה מוגדר לשימוש עם Android. במסמכי התיעוד בנושא אימות מוסבר איך יוצרים את המפתח.

מוודאים שספק הכניסה 'Google' מופעל במסוף Firebase.

אם המשתמש נכנס באמצעות חשבון 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().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);
}

אינטרנט

באינטרנט, ה-SDK של Firebase מספק תמיכה בטיפול אוטומטי בתהליך האימות באמצעות פרויקט 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 Games (‏Android בלבד)

מוודאים שספק הכניסה של Play Games מופעל במסוף Firebase. פועלים לפי ההוראות האלה להגדרת פרויקט Firebase ב-Play Games.

פועלים לפי ההוראות להגדרת Play Games Services באפליקציה שלכם ב-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 ולפעול לפי תהליך ההגדרה כדי להפעיל את הכניסה באמצעות חשבון Facebook.

מוודאים שספק הכניסה של Facebook מופעל במסוף Firebase. עם מזהה האפליקציה והסוד של Facebook.

iOS+ ו-Android

בפלטפורמות מקוריות, נדרש ספרייה של צד שלישי כדי להתקין את Facebook SDK ולהפעיל את תהליך האימות.

מתקינים את הפלאגין flutter_facebook_auth.

עליכם לפעול לפי השלבים שמפורטים במסמכי העזרה של הפלאגין כדי לוודא ש-Facebook SDK ל-Android ו-Facebook SDK ל-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);
}

אינטרנט

באינטרנט, ה-SDK של Firebase מספק תמיכה בטיפול אוטומטי בתהליך האימות באמצעות פרטי האפליקציה של 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

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 בלבד)

מוודאים שספק הכניסה Game Center מופעל במסוף Firebase. פועלים לפי ההוראות האלה להגדרת פרויקט 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 לאינטרנט.

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

מוודאים שספק הכניסה של Twitter מופעל במסוף Firebase עם מפתח API וסודות API מוגדרים. מוודאים שכתובת ה-URI להפניה אוטומטית של OAuth ב-Firebase (למשל my-app-12345.firebaseapp.com/__/auth/handler) מוגדרת ככתובת ה-URL להודעת החזרה (callback) של ההרשאה בדף ההגדרות של האפליקציה בתצורה של אפליקציית 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 להודעת החזרה (callback) מוגדרת באפליקציית 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 להודעת החזרה (callback) במסוף 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 של ההפניה האוטומטית ב-OAuth של Firebase (למשל: my-app-12345.firebaseapp.com/__/auth/handler) מוגדר כ-URI של הפניה אוטומטית בהגדרות של האפליקציה ברשת Yahoo למפתחים.

iOS+

לפני שמתחילים, צריך להגדיר את Yahoo Login ל-iOS ולהוסיף את הסכמות כתובות ה-URL בהתאמה אישית ל-Runner (שלב 1).

Android

לפני שמתחילים, צריך להגדיר את 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