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

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

تتيح كلّ من المنصّات الأصلية والويب إنشاء بيانات اعتماد يمكن تمريرها بعد ذلك إلى الطريقتَين 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" (على أجهزة Android فقط)

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

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

على المنصات الأصلية، يجب استخدام مكتبة تابعة لجهة خارجية لتثبيت حزمة 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);
}

الويب

على الويب، توفّر حزمة تطوير البرامج (SDK) لبرنامج Firebase إمكانية معالجة عملية المصادقة تلقائيًا باستخدام تفاصيل تطبيق Facebook المقدَّمة في وحدة تحكّم Firebase. على سبيل المثال:

أنشئ مقدّم خدمة Facebook، مع تقديم أي نطاق إذن إضافي تريد الحصول عليه من المستخدم.

تأكَّد من إضافة معرّف الموارد المنتظم (URI) لإعادة التوجيه في OAuth من وحدة تحكّم Firebase كمعرّف موارد منتظم صالح لإعادة التوجيه في 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 فقط)

تأكَّد من تفعيل مقدّم خدمة تسجيل الدخول إلى "مركز الألعاب" في وحدة تحكُّم Firebase. اتّبِع التعليمات التالية لإعداد مشروع Firebase في Game Center.

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

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