Apple और C++ का उपयोग करके प्रमाणित करें

आप एंड-टू-एंड OAuth 2.0 साइन-इन प्रवाह को पूरा करने के लिए Firebase SDK का उपयोग करके अपने उपयोगकर्ताओं को उनकी Apple ID का उपयोग करके Firebase से प्रमाणित करने दे सकते हैं।

शुरू करने से पहले

Apple का उपयोग करने वाले उपयोगकर्ताओं को साइन इन करने के लिए, पहले Apple की डेवलपर साइट पर साइन इन विथ Apple कॉन्फ़िगर करें, फिर Apple को अपने फायरबेस प्रोजेक्ट के लिए साइन-इन प्रदाता के रूप में सक्षम करें।

Apple डेवलपर प्रोग्राम से जुड़ें

Apple के साथ साइन इन केवल Apple डेवलपर प्रोग्राम के सदस्यों द्वारा ही कॉन्फ़िगर किया जा सकता है।

Apple के साथ साइन इन कॉन्फ़िगर करें

आपके फायरबेस प्रोजेक्ट में Apple साइन इन सक्षम और ठीक से कॉन्फ़िगर किया जाना चाहिए। कॉन्फ़िगरेशन Android और Apple प्लेटफ़ॉर्म पर भिन्न होता है। कृपया आगे बढ़ने से पहले ऐप्पल प्लेटफ़ॉर्म और/या एंड्रॉइड गाइड के "कॉन्फ़िगर साइन इन विथ ऐप्पल" अनुभाग का पालन करें।

Apple को साइन-इन प्रदाता के रूप में सक्षम करें

  1. फायरबेस कंसोल में, ऑथ सेक्शन खोलें। साइन इन विधि टैब पर, Apple प्रदाता को सक्षम करें।
  2. Apple साइन-इन प्रदाता सेटिंग्स कॉन्फ़िगर करें:
    1. यदि आप अपना ऐप केवल ऐप्पल प्लेटफ़ॉर्म पर तैनात कर रहे हैं, तो आप सर्विस आईडी, ऐप्पल टीम आईडी, निजी कुंजी और कुंजी आईडी फ़ील्ड को खाली छोड़ सकते हैं।
    2. Android उपकरणों पर समर्थन के लिए:
      1. अपने एंड्रॉइड प्रोजेक्ट में फायरबेस जोड़ें । जब आप अपना ऐप फ़ायरबेस कंसोल में सेट करते हैं तो अपने ऐप का SHA-1 हस्ताक्षर पंजीकृत करना सुनिश्चित करें।
      2. फायरबेस कंसोल में, ऑथ सेक्शन खोलें। साइन इन विधि टैब पर, Apple प्रदाता को सक्षम करें। पिछले अनुभाग में आपके द्वारा बनाई गई सेवा आईडी निर्दिष्ट करें। इसके अलावा, OAuth कोड प्रवाह कॉन्फ़िगरेशन अनुभाग में, अपनी Apple टीम आईडी और पिछले अनुभाग में आपके द्वारा बनाई गई निजी कुंजी और कुंजी आईडी निर्दिष्ट करें।

Apple अज्ञात डेटा आवश्यकताओं का अनुपालन करें

साइन इन विद ऐप्पल उपयोगकर्ताओं को साइन इन करते समय अपने ईमेल पते सहित अपने डेटा को अज्ञात करने का विकल्प देता है। जो उपयोगकर्ता इस विकल्प को चुनते हैं उनके पास privaterelay.appleid.com ​​डोमेन के साथ ईमेल पते होते हैं। जब आप अपने ऐप में साइन इन विद ऐप्पल का उपयोग करते हैं, तो आपको इन अज्ञात ऐप्पल आईडी के संबंध में ऐप्पल की किसी भी लागू डेवलपर नीतियों या शर्तों का पालन करना होगा।

इसमें किसी भी सीधे पहचान वाली व्यक्तिगत जानकारी को अज्ञात ऐप्पल आईडी के साथ जोड़ने से पहले किसी भी आवश्यक उपयोगकर्ता की सहमति प्राप्त करना शामिल है। फायरबेस प्रमाणीकरण का उपयोग करते समय, इसमें निम्नलिखित क्रियाएं शामिल हो सकती हैं:

  • किसी ईमेल पते को अज्ञात Apple ID से लिंक करें या इसके विपरीत।
  • किसी फ़ोन नंबर को अज्ञात Apple ID से लिंक करें या इसके विपरीत
  • एक गैर-गुमनाम सामाजिक क्रेडेंशियल (फेसबुक, गूगल, आदि) को एक अज्ञात ऐप्पल आईडी से लिंक करें या इसके विपरीत।

उपरोक्त सूची संपूर्ण नहीं है. यह सुनिश्चित करने के लिए कि आपका ऐप Apple की आवश्यकताओं को पूरा करता है, अपने डेवलपर खाते के सदस्यता अनुभाग में Apple डेवलपर प्रोग्राम लाइसेंस अनुबंध देखें।

firebase::auth::Auth क्लास तक पहुंचें

Auth क्लास सभी एपीआई कॉल के लिए प्रवेश द्वार है।
  1. प्रामाणिक और ऐप हेडर फ़ाइलें जोड़ें:
    #include "firebase/app.h"
    #include "firebase/auth.h"
    
  2. अपने इनिशियलाइज़ेशन कोड में, एक firebase::App क्लास बनाएं।
    #if defined(__ANDROID__)
      firebase::App* app =
          firebase::App::Create(firebase::AppOptions(), my_jni_env, my_activity);
    #else
      firebase::App* app = firebase::App::Create(firebase::AppOptions());
    #endif  // defined(__ANDROID__)
    
  3. अपने firebase::App के लिए firebase::auth::Auth क्लास प्राप्त करें। App और Auth के बीच वन-टू-वन मैपिंग है।
    firebase::auth::Auth* auth = firebase::auth::Auth::GetAuth(app);
    

फायरबेस एसडीके के साथ साइन-इन प्रवाह को संभालें

Apple के साथ साइन-इन करने की प्रक्रिया Apple और Android प्लेटफ़ॉर्म पर अलग-अलग होती है।

एप्पल प्लेटफॉर्म पर

अपने C++ कोड से प्राप्त Apple साइन इन ऑब्जेक्टिव-सी SDK के माध्यम से अपने उपयोगकर्ताओं को फायरबेस के साथ प्रमाणित करें।

  1. प्रत्येक साइन-इन अनुरोध के लिए, एक यादृच्छिक स्ट्रिंग उत्पन्न करें - एक "नॉन्स" - जिसका उपयोग आप यह सुनिश्चित करने के लिए करेंगे कि आपको प्राप्त आईडी टोकन विशेष रूप से आपके ऐप के प्रमाणीकरण अनुरोध के जवाब में प्रदान किया गया था। रीप्ले हमलों को रोकने के लिए यह कदम महत्वपूर्ण है।

      - (NSString *)randomNonce:(NSInteger)length {
        NSAssert(length > 0, @"Expected nonce to have positive length");
        NSString *characterSet = @"0123456789ABCDEFGHIJKLMNOPQRSTUVXYZabcdefghijklmnopqrstuvwxyz-._";
        NSMutableString *result = [NSMutableString string];
        NSInteger remainingLength = length;
    
        while (remainingLength > 0) {
          NSMutableArray *randoms = [NSMutableArray arrayWithCapacity:16];
          for (NSInteger i = 0; i < 16; i++) {
            uint8_t random = 0;
            int errorCode = SecRandomCopyBytes(kSecRandomDefault, 1, &random);
            NSAssert(errorCode == errSecSuccess, @"Unable to generate nonce: OSStatus %i", errorCode);
    
            [randoms addObject:@(random)];
          }
    
          for (NSNumber *random in randoms) {
            if (remainingLength == 0) {
              break;
            }
    
            if (random.unsignedIntValue < characterSet.length) {
              unichar character = [characterSet characterAtIndex:random.unsignedIntValue];
              [result appendFormat:@"%C", character];
              remainingLength--;
            }
          }
        }
      }
    
    

    आप अपने साइन-इन अनुरोध के साथ नॉन का SHA256 हैश भेजेंगे, जिसे Apple प्रतिक्रिया में अपरिवर्तित कर देगा। फायरबेस मूल नॉन को हैश करके और ऐप्पल द्वारा पारित मूल्य से तुलना करके प्रतिक्रिया को मान्य करता है।

  2. Apple का साइन-इन प्रवाह प्रारंभ करें, जिसमें आपके अनुरोध में नॉन का SHA256 हैश और प्रतिनिधि वर्ग शामिल है जो Apple की प्रतिक्रिया को संभालेगा (अगला चरण देखें):

      - (void)startSignInWithAppleFlow {
        NSString *nonce = [self randomNonce:32];
        self.currentNonce = nonce;
        ASAuthorizationAppleIDProvider *appleIDProvider = [[ASAuthorizationAppleIDProvider alloc] init];
        ASAuthorizationAppleIDRequest *request = [appleIDProvider createRequest];
        request.requestedScopes = @[ASAuthorizationScopeFullName, ASAuthorizationScopeEmail];
        request.nonce = [self stringBySha256HashingString:nonce];
    
        ASAuthorizationController *authorizationController =
            [[ASAuthorizationController alloc] initWithAuthorizationRequests:@[request]];
        authorizationController.delegate = self;
        authorizationController.presentationContextProvider = self;
        [authorizationController performRequests];
      }
    
      - (NSString *)stringBySha256HashingString:(NSString *)input {
        const char *string = [input UTF8String];
        unsigned char result[CC_SHA256_DIGEST_LENGTH];
        CC_SHA256(string, (CC_LONG)strlen(string), result);
    
        NSMutableString *hashed = [NSMutableString stringWithCapacity:CC_SHA256_DIGEST_LENGTH * 2];
        for (NSInteger i = 0; i < CC_SHA256_DIGEST_LENGTH; i++) {
          [hashed appendFormat:@"%02x", result[i]];
        }
        return hashed;
      }
    
  3. ASAuthorizationControllerDelegate` के अपने कार्यान्वयन में Apple की प्रतिक्रिया को संभालें। यदि साइन-इन सफल रहा, तो फायरबेस के साथ प्रमाणित करने के लिए अनहैश किए गए नॉन के साथ ऐप्पल की प्रतिक्रिया से आईडी टोकन का उपयोग करें:

      - (void)authorizationController:(ASAuthorizationController *)controller
         didCompleteWithAuthorization:(ASAuthorization *)authorization API_AVAILABLE(ios(13.0)) {
        if ([authorization.credential isKindOfClass:[ASAuthorizationAppleIDCredential class]]) {
          ASAuthorizationAppleIDCredential *appleIDCredential = authorization.credential;
          NSString *rawNonce = self.currentNonce;
          NSAssert(rawNonce != nil, @"Invalid state: A login callback was received, but no login request was sent.");
    
          if (appleIDCredential.identityToken == nil) {
            NSLog(@"Unable to fetch identity token.");
            return;
          }
    
          NSString *idToken = [[NSString alloc] initWithData:appleIDCredential.identityToken
                                                    encoding:NSUTF8StringEncoding];
          if (idToken == nil) {
            NSLog(@"Unable to serialize id token from data: %@", appleIDCredential.identityToken);
          }
        }
    
  4. फ़ायरबेस क्रेडेंशियल बनाने और फ़ायरबेस में साइन इन करने के लिए परिणामी टोकन स्ट्रिंग और मूल नॉन का उपयोग करें।

    firebase::auth::OAuthProvider::GetCredential(
            /*provider_id=*/"apple.com", token, nonce,
            /*access_token=*/nullptr);
    
    firebase::Future<firebase::auth::AuthResult> result =
        auth->SignInAndRetrieveDataWithCredential(credential);
    
  5. उसी पैटर्न का उपयोग Reauthenticate के साथ किया जा सकता है जिसका उपयोग संवेदनशील संचालन के लिए ताज़ा क्रेडेंशियल प्राप्त करने के लिए किया जा सकता है जिनके लिए हाल ही में लॉगिन की आवश्यकता होती है।

    firebase::Future<firebase::auth::AuthResult> result =
        user->Reauthenticate(credential);
    
  6. किसी खाते को Apple साइन इन से लिंक करने के लिए उसी पैटर्न का उपयोग किया जा सकता है। हालाँकि, आपको एक त्रुटि का सामना करना पड़ सकता है जब एक मौजूदा फायरबेस खाता पहले से ही उस Apple खाते से लिंक किया गया हो जिसे आप लिंक करने का प्रयास कर रहे हैं। जब ऐसा होता है तो भविष्य में kAuthErrorCredentialAlreadyInUse की स्थिति वापस आ जाएगी और AuthResult में एक वैध credential हो सकता है। इस क्रेडेंशियल का उपयोग Apple-लिंक्ड खाते में SignInAndRetrieveDataWithCredential के माध्यम से साइन इन करने के लिए किया जा सकता है, बिना किसी अन्य ऐप्पल साइन इन टोकन और नॉन को उत्पन्न करने की आवश्यकता के।

    firebase::Future<firebase::auth::AuthResult> link_result =
        auth->current_user().LinkWithCredential(credential);
    
    // To keep example simple, wait on the current thread until call completes.
    while (link_result.status() == firebase::kFutureStatusPending) {
      Wait(100);
    }
    
    // Determine the result of the link attempt
    if (link_result.error() == firebase::auth::kAuthErrorNone) {
      // user linked correctly.
    } else if (link_result.error() ==
                   firebase::auth::kAuthErrorCredentialAlreadyInUse &&
               link_result.result()
                   ->additional_user_info.updated_credential.is_valid()) {
      // Sign In with the new credential
      firebase::Future<firebase::auth::AuthResult> result =
          auth->SignInAndRetrieveDataWithCredential(
              link_result.result()->additional_user_info.updated_credential);
    } else {
      // Another link error occurred.
    }
    

एंड्रॉइड पर

एंड्रॉइड पर, शुरू से अंत तक साइन-इन प्रवाह को पूरा करने के लिए फायरबेस एसडीके का उपयोग करके अपने ऐप में वेब-आधारित जेनेरिक OAuth लॉगिन को एकीकृत करके अपने उपयोगकर्ताओं को फायरबेस के साथ प्रमाणित करें।

फायरबेस एसडीके के साथ साइन-इन प्रवाह को संभालने के लिए, इन चरणों का पालन करें:

  1. Apple के लिए उपयुक्त प्रदाता आईडी के साथ कॉन्फ़िगर किए गए FederatedOAuthProviderData का एक उदाहरण बनाएं।

    firebase::auth::FederatedOAuthProviderData provider_data("apple.com");
    
  2. वैकल्पिक: डिफ़ॉल्ट से परे अतिरिक्त OAuth 2.0 स्कोप निर्दिष्ट करें जिसे आप प्रमाणीकरण प्रदाता से अनुरोध करना चाहते हैं।

    provider_data.scopes.push_back("email");
    provider_data.scopes.push_back("name");
    
  3. वैकल्पिक: यदि आप Apple की साइन-इन स्क्रीन को अंग्रेजी के अलावा किसी अन्य भाषा में प्रदर्शित करना चाहते हैं, तो locale पैरामीटर सेट करें। समर्थित स्थानों के लिए Apple से साइन इन दस्तावेज़ देखें।

    // Localize to French.
    provider_data.custom_parameters["language"] = "fr";
    ```
    
  4. एक बार जब आपका प्रदाता डेटा कॉन्फ़िगर हो जाए, तो FederatedOAuthProvider बनाने के लिए इसका उपयोग करें।

    // Construct a FederatedOAuthProvider for use in Auth methods.
    firebase::auth::FederatedOAuthProvider provider(provider_data);
    
  5. प्रामाणिक प्रदाता ऑब्जेक्ट का उपयोग करके फायरबेस से प्रमाणित करें। ध्यान दें कि अन्य फायरबेसऑथ ऑपरेशंस के विपरीत, यह एक वेब दृश्य को पॉप अप करके आपके यूआई को नियंत्रित करेगा जिसमें उपयोगकर्ता अपने क्रेडेंशियल दर्ज कर सकते हैं।

    साइन इन प्रवाह शुरू करने के लिए, signInWithProvider पर कॉल करें:

    firebase::Future<firebase::auth::AuthResult> result =
      auth->SignInWithProvider(provider_data);
    

    तब आपका एप्लिकेशन प्रतीक्षा कर सकता है या Future पर कॉलबैक दर्ज कर सकता है

  6. उसी पैटर्न का उपयोग ReauthenticateWithProvider के साथ किया जा सकता है जिसका उपयोग संवेदनशील संचालन के लिए ताज़ा क्रेडेंशियल प्राप्त करने के लिए किया जा सकता है जिनके लिए हाल ही में लॉगिन की आवश्यकता होती है।

    firebase::Future<firebase::auth::AuthResult> result =
      user.ReauthenticateWithProvider(provider_data);
    

    तब आपका एप्लिकेशन प्रतीक्षा कर सकता है या Future पर कॉलबैक दर्ज कर सकता है

  7. और, आप विभिन्न पहचान प्रदाताओं को मौजूदा खातों से जोड़ने के लिए LinkWithCredential() उपयोग कर सकते हैं।

    ध्यान दें कि Apple को अपने Apple खातों को अन्य डेटा से लिंक करने से पहले आपको उपयोगकर्ताओं से स्पष्ट सहमति प्राप्त करने की आवश्यकता है।

    उदाहरण के लिए, किसी फेसबुक खाते को वर्तमान फायरबेस खाते से लिंक करने के लिए, उपयोगकर्ता को फेसबुक पर साइन इन करने से प्राप्त एक्सेस टोकन का उपयोग करें:

    // Initialize a Facebook credential with a Facebook access token.
    AuthCredential credential =
        firebase::auth::FacebookAuthProvider.getCredential(token);
    
    // Assuming the current user is an Apple user linking a Facebook provider.
    firebase::Future<firebase::auth::AuthResult> result =
        auth.current_user().LinkWithCredential(credential);
    

Apple नोट्स के साथ साइन इन करें

फायरबेस ऑथ द्वारा समर्थित अन्य प्रदाताओं के विपरीत, ऐप्पल एक फोटो यूआरएल प्रदान नहीं करता है।

साथ ही, जब उपयोगकर्ता ऐप के साथ अपना ईमेल साझा नहीं करने का विकल्प चुनता है, तो ऐप्पल उस उपयोगकर्ता के लिए एक अद्वितीय ईमेल पता ( xyz@privaterelay.appleid.com फॉर्म का) प्रावधान करता है, जिसे वह आपके ऐप के साथ साझा करता है। यदि आपने निजी ईमेल रिले सेवा कॉन्फ़िगर की है, तो Apple अज्ञात पते पर भेजे गए ईमेल को उपयोगकर्ता के वास्तविक ईमेल पते पर अग्रेषित करता है।

जब कोई उपयोगकर्ता पहली बार साइन इन करता है तो Apple केवल डिस्प्ले नाम जैसी उपयोगकर्ता जानकारी ऐप्स के साथ साझा करता है। आमतौर पर, जब कोई उपयोगकर्ता पहली बार Apple में साइन इन करता है, तो Firebase डिस्प्ले नाम संग्रहीत करता है, जिसे आप current_user().display_name() के साथ प्राप्त कर सकते हैं। हालाँकि, यदि आपने पहले किसी उपयोगकर्ता को फायरबेस का उपयोग किए बिना ऐप में साइन इन करने के लिए ऐप्पल का उपयोग किया था, तो ऐप्पल उपयोगकर्ता के प्रदर्शन नाम के साथ फायरबेस प्रदान नहीं करेगा।

अगले कदम

किसी उपयोगकर्ता द्वारा पहली बार साइन इन करने के बाद, एक नया उपयोगकर्ता खाता बनाया जाता है और क्रेडेंशियल्स से लिंक किया जाता है - यानी, उपयोगकर्ता नाम और पासवर्ड, फोन नंबर, या ऑथ प्रदाता जानकारी - जिस उपयोगकर्ता के साथ साइन इन किया जाता है। यह नया खाता आपके फायरबेस प्रोजेक्ट के हिस्से के रूप में संग्रहीत है, और इसका उपयोग आपके प्रोजेक्ट के प्रत्येक ऐप में उपयोगकर्ता की पहचान करने के लिए किया जा सकता है, भले ही उपयोगकर्ता कैसे भी साइन इन करता हो।

अपने ऐप्स में, आप उपयोगकर्ता की मूल प्रोफ़ाइल जानकारी firebase::auth::User ऑब्जेक्ट से प्राप्त कर सकते हैं। उपयोगकर्ता प्रबंधित करें देखें.

अपने फायरबेस रीयलटाइम डेटाबेस और क्लाउड स्टोरेज सुरक्षा नियमों में, आप साइन-इन किए गए उपयोगकर्ता की अद्वितीय उपयोगकर्ता आईडी को ऑथ वेरिएबल से प्राप्त कर सकते हैं, और इसका उपयोग यह नियंत्रित करने के लिए कर सकते हैं कि उपयोगकर्ता किस डेटा तक पहुंच सकता है।