الهوية الموحّدة وتسجيل الدخول على وسائل التواصل الاجتماعي

المصادقة عبر وسائل التواصل الاجتماعي هي عملية مصادقة متعدّدة الخطوات، تتيح لك تسجيل دخول المستخدم إلى حساب أو ربطه بحساب حالي.

تتيح كلّ من المنصّات الأصلية والويب إنشاء بيانات اعتماد يمكن بعد ذلك تمريرها إلى الطريقتَين signInWithCredential أو linkWithCredential. بدلاً من ذلك، يمكنك على منصات الويب بدء عملية المصادقة من خلال نافذة منبثقة أو إعادة توجيه.

Google

يتم إعداد معظم الإعدادات تلقائيًا عند استخدام ميزة "تسجيل الدخول باستخدام حساب Google" مع Firebase، ولكن عليك التأكّد من ضبط مفتاح SHA1 الخاص بجهازك لاستخدامه مع Android. يمكنك الاطّلاع على كيفية إنشاء المفتاح في مستندات المصادقة.

تأكَّد من تفعيل موفّر تسجيل الدخول "Google" في وحدة تحكّم Firebase.

إذا سجّل المستخدم الدخول باستخدام Google بعد أن سبق له تسجيل حساب يدويًا، سيتغيّر موفّر المصادقة تلقائيًا إلى Google، وذلك بسبب مفهوم موفّري الخدمات الموثوق بهم في Firebase Authentication. يمكنك الاطّلاع على مزيد من المعلومات حول هذا الموضوع هنا.

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

الويب

على الويب، توفّر حزمة تطوير البرامج (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" (على أجهزة Android فقط)

تأكَّد من تفعيل موفّر تسجيل الدخول "ألعاب Play" في وحدة تحكّم Firebase. اتّبِع هذه التعليمات لإعداد مشروع Play Games Firebase.

اتّبِع التعليمات التالية لإعداد "خدمات ألعاب Play" باستخدام تطبيق 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

على المنصات الأصلية، يجب توفّر مكتبة تابعة لجهة خارجية لتثبيت حزمة تطوير البرامج (SDK) من Facebook وتفعيل مسار المصادقة.

ثبِّت المكوّن الإضافي flutter_facebook_auth.

يجب اتّباع الخطوات الواردة في مستندات المكوّن الإضافي للتأكّد من أنّه تم إعداد كل من حِزمتَي تطوير البرامج (SDK) لنظامَي التشغيل 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);
}

الويب

على الويب، توفّر حزمة تطوير البرامج (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

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 باستخدام واجهة برمجة التطبيقات 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 قبل أن يتم إصدار بيانات اعتماد Game Center على Firebase وتسجيل الدخول من خلال Firebase. إليك بعض التعليمات حول كيفية تحقيق ذلك.

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

تأكَّد من تفعيل موفِّر تسجيل الدخول "Twitter" في وحدة تحكّم Firebase مع ضبط مفتاح واجهة برمجة التطبيقات ورمزها السري. تأكَّد من ضبط معرّف الموارد المنتظم لإعادة التوجيه في OAuth على Firebase (مثل my-app-12345.firebaseapp.com/__/auth/handler) كعنوان URL لردّ الاتصال الخاص بالتفويض في صفحة إعدادات تطبيقك على إعدادات تطبيق Twitter.

قد تحتاج أيضًا إلى طلب إذن وصول موسّع إلى واجهة برمجة التطبيقات حسب تطبيقك.

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

Yahoo

تأكَّد من تفعيل مقدّم خدمة تسجيل الدخول "Yahoo" في وحدة تحكّم Firebase مع ضبط مفتاح واجهة برمجة التطبيقات ورمزها السري. تأكَّد أيضًا من ضبط معرّف الموارد المنتظم (URI) الخاص بإعادة التوجيه عبر بروتوكول OAuth في Firebase (مثل my-app-12345.firebaseapp.com/__/auth/handler) كمعرّف موارد منتظم (URI) خاص بإعادة التوجيه في إعدادات "شبكة مطوّري Yahoo" لتطبيقك.

iOS+‎

قبل البدء، عليك ضبط Yahoo Login لنظام التشغيل 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