المصادقة باستخدام 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. افتح تكوين المشروع الخاص بك: انقر نقرًا مزدوجًا فوق اسم المشروع في عرض الشجرة الأيسر. حدد التطبيق الخاص بك من قسم الأهداف ، ثم حدد علامة التبويب المعلومات ، وقم بتوسيع قسم أنواع عناوين 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 و range و state .

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

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