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

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

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

الويب

على الويب، تتيح حزمة 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" في وحدة تحكّم Firebase. اتّبِع هذه التعليمات لإعداد مشروع "ألعاب Play" على 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" و"الرمز السري لتطبيق Facebook".

‫iOS+ وAndroid

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

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

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

الويب

على الويب، تتيح حزمة 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

‫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 باستخدام واجهة برمجة التطبيقات 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

‫iOS+

قبل البدء، عليك إعداد ميزة "تسجيل الدخول باستخدام حساب Microsoft" على iOS وإضافة مخططات عناوين URL المخصّصة إلى تطبيق Runner (الخطوة 1).

Android

قبل البدء، عليك إعداد ميزة "تسجيل الدخول باستخدام حساب 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

تأكَّد من تفعيل موفِّر تسجيل الدخول "Twitter" في وحدة تحكّم Firebase مع ضبط "مفتاح واجهة برمجة التطبيقات" و"واجهة برمجة تطبيقات سرّية". تأكَّد من ضبط عنوان URI لإعادة التوجيه عبر 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 المخصّص كما هو موضّح في دليل iOS الخطوة 1.

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

‫iOS+

قبل البدء، عليك إعداد ميزة "تسجيل الدخول باستخدام حساب Yahoo" على 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