المصادقة باستخدام Yahoo على منصات Apple

يمكنك السماح للمستخدمين بالمصادقة مع Firebase باستخدام موفري OAuth مثل Yahoo من خلال دمج تسجيل دخول OAuth العام في تطبيقك باستخدام Firebase SDK لتنفيذ تدفق تسجيل الدخول الشامل.

قبل ان تبدأ

لتسجيل دخول المستخدمين باستخدام حسابات Yahoo، يجب عليك أولاً تمكين Yahoo كموفر تسجيل دخول لمشروع Firebase الخاص بك:

  1. أضف Firebase إلى مشروع Apple الخاص بك .
  2. في وحدة تحكم Firebase ، افتح قسم المصادقة .
  3. في علامة التبويب طريقة تسجيل الدخول ، قم بتمكين موفر Yahoo .
  4. أضف معرف العميل وسر العميل من وحدة تحكم المطور الخاصة بهذا الموفر إلى تكوين الموفر:
    1. لتسجيل عميل Yahoo OAuth، اتبع وثائق مطور Yahoo حول تسجيل تطبيق ويب مع Yahoo .

      تأكد من تحديد أذونات OpenID Connect API: profile email .

    2. عند تسجيل التطبيقات مع هؤلاء الموفرين، تأكد من تسجيل النطاق *.firebaseapp.com لمشروعك باعتباره مجال إعادة التوجيه لتطبيقك.
  5. انقر فوق حفظ .

تعامل مع تدفق تسجيل الدخول باستخدام Firebase SDK

للتعامل مع تدفق تسجيل الدخول باستخدام Firebase Apple Platform SDK، اتبع الخطوات التالية:

  1. أضف أنظمة URL مخصصة إلى مشروع Xcode الخاص بك:

    1. افتح تكوين مشروعك: انقر نقرًا مزدوجًا فوق اسم المشروع في عرض الشجرة الأيسر. حدد تطبيقك من قسم TARGETS ، ثم حدد علامة تبويب المعلومات ، وقم بتوسيع قسم أنواع URL .
    2. انقر فوق الزر + ، وأضف معرف التطبيق المشفر الخاص بك كمخطط URL. يمكنك العثور على معرف التطبيق المشفر الخاص بك في صفحة الإعدادات العامة لوحدة تحكم Firebase، في القسم الخاص بتطبيق iOS الخاص بك. اترك الحقول الأخرى فارغة.

      عند الانتهاء، يجب أن يبدو التكوين الخاص بك مشابهًا لما يلي (ولكن مع القيم الخاصة بالتطبيق):

      لقطة شاشة لواجهة إعداد مخطط URL المخصص لـ Xcode

  2. قم بإنشاء مثيل لـ OAuthProvider باستخدام معرف الموفر yahoo.com .

    سويفت

    var provider = OAuthProvider(providerID: "yahoo.com")
        

    ج موضوعية

    FIROAuthProvider *provider = [FIROAuthProvider providerWithProviderID:@"yahoo.com"];
        
  3. اختياري : حدد معلمات OAuth المخصصة الإضافية التي تريد إرسالها مع طلب OAuth.

    سويفت

    provider.customParameters = [
    "prompt": "login",
    "language": "fr"
    ]
        

    ج موضوعية

    [provider setCustomParameters:@{@"prompt": @"login", @"language": @"fr"}];
        

    للتعرف على المعلمات التي يدعمها Yahoo، راجع وثائق Yahoo OAuth . لاحظ أنه لا يمكنك تمرير المعلمات المطلوبة لـ Firebase باستخدام setCustomParameters . هذه المعلمات هي Client_id و redirect_uri و response_type والنطاق والحالة .

  4. اختياري : حدد نطاقات OAuth 2.0 الإضافية خارج profile email الذي تريد طلبه من موفر المصادقة. إذا كان التطبيق الخاص بك يتطلب الوصول إلى بيانات المستخدم الخاصة من Yahoo APIs، فستحتاج إلى طلب أذونات إلى Yahoo APIs ضمن أذونات API في وحدة تحكم مطور Yahoo. يجب أن تكون نطاقات OAuth المطلوبة مطابقة تمامًا للنطاقات التي تم تكوينها مسبقًا في أذونات واجهة برمجة تطبيقات التطبيق. على سبيل المثال، إذا تم طلب الوصول للقراءة/الكتابة إلى جهات اتصال المستخدم وتم تكوينه مسبقًا في أذونات واجهة برمجة التطبيقات الخاصة بالتطبيق، فيجب تمرير sdct-w بدلاً من نطاق OAuth للقراءة فقط sdct-r . وإلا، فسوف يفشل التدفق وسيظهر خطأ للمستخدم النهائي.

    سويفت

    // Request access to Yahoo Mail API.
    // Request read/write access to user contacts.
    // This must be preconfigured in the app's API permissions.
    provider.scopes = ["mail-r", "sdct-w"]
        

    ج موضوعية

    // Request access to Yahoo Mail API.
    // Request read/write access to user contacts.
    // This must be preconfigured in the app's API permissions.
    [provider setScopes:@[@"mail-r", @"sdct-w"]];
        

    لمعرفة المزيد، راجع وثائق نطاقات Yahoo .

  5. اختياري : إذا كنت تريد تخصيص الطريقة التي يعرض بها تطبيقك SFSafariViewController أو UIWebView عند عرض reCAPTCHA للمستخدم، فقم بإنشاء فئة مخصصة تتوافق مع بروتوكول AuthUIDelegate ، وقم بتمريرها إلى credentialWithUIDelegate .

  6. قم بالمصادقة مع Firebase باستخدام كائن موفر OAuth.

    سويفت

    provider.getCredentialWith(nil) { credential, error in
    if error != nil {
    // Handle error.
    }
    if credential != nil {
    Auth().signIn(with: credential) { authResult, error in
      if error != nil {
        // Handle error.
      }
      // User is signed in.
      // IdP data available in authResult.additionalUserInfo.profile.
      // Yahoo OAuth access token can also be retrieved by:
      // (authResult.credential as? OAuthCredential)?.accessToken
      // Yahoo OAuth ID token can be retrieved by calling:
      // (authResult.credential as? OAuthCredential)?.idToken
    }
    }
    }
        

    ج موضوعية

    [provider getCredentialWithUIDelegate:nil
                           completion:^(FIRAuthCredential *_Nullable credential, NSError *_Nullable error) {
    if (error) {
    // Handle error.
    }
    if (credential) {
    [[FIRAuth auth] signInWithCredential:credential
                              completion:^(FIRAuthDataResult *_Nullable authResult, NSError *_Nullable error) {
      if (error) {
        // Handle error.
      }
      // User is signed in.
      // IdP data available in authResult.additionalUserInfo.profile.
      // Yahoo OAuth access token can also be retrieved by:
      // ((FIROAuthCredential *)authResult.credential).accessToken
      // Yahoo OAuth ID token can be retrieved by calling:
      // ((FIROAuthCredential *)authResult.credential).idToken
    }];
    }
    }];
        

    باستخدام رمز وصول OAuth، يمكنك الاتصال بـ Yahoo API .

    على سبيل المثال، للحصول على معلومات الملف الشخصي الأساسية، يمكنك الاتصال بـ REST API، وتمرير رمز الوصول في رأس Authorization :

    https://social.yahooapis.com/v1/user/YAHOO_USER_UID/profile?format=json
    

    حيث YAHOO_USER_UID هو معرف مستخدم Yahoo الذي يمكن استرجاعه من حقل Auth.auth.currentUser.providerData[0].uid أو من authResult.additionalUserInfo.profile .

  7. بينما تركز الأمثلة المذكورة أعلاه على تدفقات تسجيل الدخول، لديك أيضًا القدرة على ربط موفر خدمة Yahoo بمستخدم حالي باستخدام linkWithPopup . على سبيل المثال، يمكنك ربط عدة موفري خدمات بنفس المستخدم مما يسمح لهم بتسجيل الدخول باستخدام أي منهما.

    سويفت

    Auth().currentUser.link(withCredential: credential) { authResult, error in
    if error != nil {
    // Handle error.
    }
    // Yahoo credential is linked to the current user.
    // IdP data available in authResult.additionalUserInfo.profile.
    // Yahoo OAuth access token can also be retrieved by:
    // (authResult.credential as? OAuthCredential)?.accessToken
    // Yahoo OAuth ID token can be retrieved by calling:
    // (authResult.credential as? OAuthCredential)?.idToken
    }
        

    ج موضوعية

    [[FIRAuth auth].currentUser
    linkWithCredential:credential
            completion:^(FIRAuthDataResult * _Nullable authResult, NSError * _Nullable error) {
    if (error) {
    // Handle error.
    }
    // Yahoo credential is linked to the current user.
    // IdP data available in authResult.additionalUserInfo.profile.
    // Yahoo OAuth access token is can also be retrieved by:
    // ((FIROAuthCredential *)authResult.credential).accessToken
    // Yahoo OAuth ID token can be retrieved by calling:
    // ((FIROAuthCredential *)authResult.credential).idToken
    }];
        
  8. يمكن استخدام نفس النمط مع reauthenticateWithPopup / reauthenticateWithRedirect والذي يمكن استخدامه لاسترداد بيانات اعتماد جديدة للعمليات الحساسة التي تتطلب تسجيل دخول مؤخرًا.

    سويفت

    Auth().currentUser.reauthenticateWithCredential(withCredential: credential) { authResult, error in
    if error != nil {
    // Handle error.
    }
    // User is re-authenticated with fresh tokens minted and
    // should be able to perform sensitive operations like account
    // deletion and email or password update.
    // IdP data available in result.additionalUserInfo.profile.
    // Additional OAuth access token is can also be retrieved by:
    // (authResult.credential as? OAuthCredential)?.accessToken
    // Yahoo OAuth ID token can be retrieved by calling:
    // (authResult.credential as? OAuthCredential)?.idToken
    }
        

    ج موضوعية

    [[FIRAuth auth].currentUser
    reauthenticateWithCredential:credential
                      completion:^(FIRAuthDataResult * _Nullable authResult, NSError * _Nullable error) {
    if (error) {
    // Handle error.
    }
    // User is re-authenticated with fresh tokens minted and
    // should be able to perform sensitive operations like account
    // deletion and email or password update.
    // IdP data available in result.additionalUserInfo.profile.
    // Additional OAuth access token is can also be retrieved by:
    // ((FIROAuthCredential *)authResult.credential).accessToken
    // Yahoo OAuth ID token can be retrieved by calling:
    // ((FIROAuthCredential *)authResult.credential).idToken
    }];
        

الخطوات التالية

بعد قيام المستخدم بتسجيل الدخول لأول مرة، يتم إنشاء حساب مستخدم جديد وربطه ببيانات الاعتماد - أي اسم المستخدم وكلمة المرور أو رقم الهاتف أو معلومات موفر المصادقة - التي قام المستخدم بتسجيل الدخول بها. يتم تخزين هذا الحساب الجديد كجزء من مشروع Firebase الخاص بك، ويمكن استخدامه لتحديد المستخدم عبر كل تطبيق في مشروعك، بغض النظر عن كيفية تسجيل دخول المستخدم.

  • في تطبيقاتك، يمكنك الحصول على معلومات الملف الشخصي الأساسية للمستخدم من كائن User . راجع إدارة المستخدمين .

  • في قاعدة بيانات Firebase Realtime وقواعد أمان التخزين السحابي، يمكنك الحصول على معرف المستخدم الفريد للمستخدم الذي قام بتسجيل الدخول من متغير auth ، واستخدامه للتحكم في البيانات التي يمكن للمستخدم الوصول إليها.

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

لتسجيل خروج مستخدم، اتصل signOut: .

سويفت

let firebaseAuth = Auth.auth()
do {
  try firebaseAuth.signOut()
} catch let signOutError as NSError {
  print("Error signing out: %@", signOutError)
}

ج موضوعية

NSError *signOutError;
BOOL status = [[FIRAuth auth] signOut:&signOutError];
if (!status) {
  NSLog(@"Error signing out: %@", signOutError);
  return;
}

قد ترغب أيضًا في إضافة رمز معالجة الأخطاء للنطاق الكامل من أخطاء المصادقة. راجع التعامل مع الأخطاء .