Apple এবং C++ ব্যবহার করে প্রমাণীকরণ করুন

এন্ড-টু-এন্ড OAuth 2.0 সাইন-ইন ফ্লো চালানোর জন্য আপনি Firebase SDK ব্যবহার করে আপনার ব্যবহারকারীদের তাদের Apple ID ব্যবহার করে Firebase-এর সাথে প্রমাণীকরণ করতে দিতে পারেন।

তুমি শুরু করার আগে

Apple ব্যবহার করে ব্যবহারকারীদের সাইন ইন করতে, প্রথমে Apple এর বিকাশকারী সাইটে Apple এর সাথে সাইন ইন কনফিগার করুন, তারপর আপনার Firebase প্রকল্পের জন্য একটি সাইন-ইন প্রদানকারী হিসাবে Apple সক্ষম করুন৷

অ্যাপল ডেভেলপার প্রোগ্রামে যোগ দিন

Apple এর সাথে সাইন ইন শুধুমাত্র Apple বিকাশকারী প্রোগ্রামের সদস্যদের দ্বারা কনফিগার করা যেতে পারে৷

অ্যাপল দিয়ে সাইন ইন কনফিগার করুন

আপনার ফায়ারবেস প্রজেক্টে Apple সাইন ইন অবশ্যই সক্ষম এবং সঠিকভাবে কনফিগার করা আবশ্যক। কনফিগারেশন অ্যান্ড্রয়েড এবং অ্যাপল প্ল্যাটফর্ম জুড়ে পরিবর্তিত হয়। এগিয়ে যাওয়ার আগে অনুগ্রহ করে অ্যাপল প্ল্যাটফর্ম এবং/অথবা অ্যান্ড্রয়েড গাইডের "অ্যাপলের সাথে সাইন ইন কনফিগার করুন" বিভাগটি অনুসরণ করুন।

একটি সাইন-ইন প্রদানকারী হিসাবে Apple সক্ষম করুন৷

  1. Firebase কনসোলে , Auth বিভাগটি খুলুন। সাইন ইন পদ্ধতি ট্যাবে, অ্যাপল প্রদানকারী সক্ষম করুন।
  2. অ্যাপল সাইন-ইন প্রদানকারী সেটিংস কনফিগার করুন:
    1. আপনি যদি শুধুমাত্র অ্যাপল প্ল্যাটফর্মে আপনার অ্যাপ স্থাপন করেন, তাহলে আপনি সার্ভিস আইডি, অ্যাপল টিম আইডি, প্রাইভেট কী এবং কী আইডি ক্ষেত্রগুলি খালি রাখতে পারেন।
    2. অ্যান্ড্রয়েড ডিভাইসে সমর্থনের জন্য:
      1. আপনার Android প্রকল্পে Firebase যোগ করুন । Firebase কনসোলে আপনার অ্যাপ সেট আপ করার সময় আপনার অ্যাপের SHA-1 স্বাক্ষর নিবন্ধন করতে ভুলবেন না।
      2. Firebase কনসোলে , Auth বিভাগটি খুলুন। সাইন ইন পদ্ধতি ট্যাবে, অ্যাপল প্রদানকারী সক্ষম করুন। পূর্ববর্তী বিভাগে আপনি যে পরিষেবা আইডি তৈরি করেছেন তা উল্লেখ করুন। এছাড়াও, OAuth কোড ফ্লো কনফিগারেশন বিভাগে, আপনার Apple টিম আইডি এবং পূর্ববর্তী বিভাগে আপনার তৈরি করা ব্যক্তিগত কী এবং কী আইডি উল্লেখ করুন।

অ্যাপল বেনামী ডেটা প্রয়োজনীয়তা মেনে চলুন

অ্যাপলের সাথে সাইন ইন ব্যবহারকারীদের সাইন ইন করার সময় তাদের ইমেল ঠিকানা সহ তাদের ডেটা বেনামী করার বিকল্প দেয়৷ যে ব্যবহারকারীরা এই বিকল্পটি বেছে নেন তাদের কাছে privaterelay.appleid.com ডোমেনের ইমেল ঠিকানা রয়েছে৷ আপনি যখন আপনার অ্যাপে Apple এর সাথে সাইন ইন ব্যবহার করেন, তখন আপনাকে অবশ্যই এই বেনামী Apple ID সংক্রান্ত যেকোন প্রযোজ্য বিকাশকারী নীতি বা Apple থেকে শর্তাবলী মেনে চলতে হবে।

আপনি একটি বেনামী অ্যাপল আইডির সাথে সরাসরি সনাক্তকারী ব্যক্তিগত তথ্য সংযুক্ত করার আগে যেকোন প্রয়োজনীয় ব্যবহারকারীর সম্মতি প্রাপ্ত করা এর মধ্যে রয়েছে। ফায়ারবেস প্রমাণীকরণ ব্যবহার করার সময়, এতে নিম্নলিখিত ক্রিয়াগুলি অন্তর্ভুক্ত থাকতে পারে:

  • একটি বেনামী অ্যাপল আইডি বা বিপরীতে একটি ইমেল ঠিকানা লিঙ্ক করুন.
  • একটি বেনামী অ্যাপল আইডিতে একটি ফোন নম্বর লিঙ্ক করুন বা এর বিপরীতে
  • একটি বেনামী সামাজিক শংসাপত্র (ফেসবুক, গুগল, ইত্যাদি) একটি বেনামী অ্যাপল আইডিতে বা এর বিপরীতে লিঙ্ক করুন৷

উপরের তালিকায় সম্পূর্ণ নয়। আপনার অ্যাপ অ্যাপলের প্রয়োজনীয়তা পূরণ করছে তা নিশ্চিত করতে আপনার ডেভেলপার অ্যাকাউন্টের সদস্যপদ বিভাগে অ্যাপল ডেভেলপার প্রোগ্রাম লাইসেন্স চুক্তি পড়ুন।

firebase::auth::Auth ক্লাস অ্যাক্সেস করুন

Auth ক্লাস হল সমস্ত API কলের গেটওয়ে।
  1. Auth এবং অ্যাপ হেডার ফাইল যোগ করুন:
    #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);
    

Firebase SDK দিয়ে সাইন-ইন ফ্লো পরিচালনা করুন

অ্যাপলের সাথে সাইন-ইন করার প্রক্রিয়া Apple এবং Android প্ল্যাটফর্ম জুড়ে পরিবর্তিত হয়।

অ্যাপল প্ল্যাটফর্মে

আপনার C++ কোড থেকে আমন্ত্রিত Apple সাইন ইন অবজেক্টিভ-সি SDK-এর মাধ্যমে Firebase-এর মাধ্যমে আপনার ব্যবহারকারীদের প্রমাণীকরণ করুন।

  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 প্রতিক্রিয়ায় অপরিবর্তিত পাস করবে। Firebase আসল নন্স হ্যাশ করে এবং Apple দ্বারা পাস করা মানের সাথে তুলনা করে প্রতিক্রিয়া যাচাই করে।

  2. Apple-এর সাইন-ইন ফ্লো শুরু করুন, আপনার অনুরোধে ননসের SHA256 হ্যাশ এবং অ্যাপলের প্রতিক্রিয়া পরিচালনা করবে এমন প্রতিনিধি ক্লাস সহ (পরবর্তী ধাপটি দেখুন):

      - (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` বাস্তবায়নে অ্যাপলের প্রতিক্রিয়া পরিচালনা করুন। সাইন-ইন সফল হলে, ফায়ারবেসের সাথে প্রমাণীকরণের জন্য আনহ্যাশড নন্স সহ অ্যাপলের প্রতিক্রিয়া থেকে আইডি টোকেন ব্যবহার করুন:

      - (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-এ সাইন ইন করতে ফলস্বরূপ টোকেন স্ট্রিং এবং আসল নন্স ব্যবহার করুন।

    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. অ্যাপল সাইন ইনের সাথে একটি অ্যাকাউন্ট লিঙ্ক করতে একই প্যাটার্ন ব্যবহার করা যেতে পারে। যাইহোক, আপনি একটি ত্রুটির সম্মুখীন হতে পারেন যখন একটি বিদ্যমান Firebase অ্যাকাউন্ট ইতিমধ্যেই আপনি যে Apple অ্যাকাউন্টের সাথে লিঙ্ক করার চেষ্টা করছেন তার সাথে লিঙ্ক করা হয়েছে৷ এটি ঘটলে ভবিষ্যৎ kAuthErrorCredentialAlreadyInUse এর একটি স্থিতি ফিরিয়ে দেবে এবং AuthResult এ একটি বৈধ credential থাকতে পারে। এই শংসাপত্রটি অন্য অ্যাপল সাইন ইন টোকেন তৈরি করার প্রয়োজন ছাড়াই 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 লগইনকে একীভূত করে Firebase-এর সাথে আপনার ব্যবহারকারীদের প্রমাণীকরণ করুন Firebase SDK ব্যবহার করে সাইন-ইন ফ্লো শেষ করার জন্য।

Firebase SDK-এর সাথে সাইন-ইন প্রবাহ পরিচালনা করতে, এই ধাপগুলি অনুসরণ করুন:

  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 প্যারামিটার সেট করুন। সমর্থিত লোকেলের জন্য অ্যাপল ডক্স দিয়ে সাইন ইন দেখুন।

    // 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. Auth প্রদানকারী বস্তু ব্যবহার করে Firebase দিয়ে প্রমাণীকরণ করুন। মনে রাখবেন যে অন্যান্য FirebaseAuth ক্রিয়াকলাপগুলির বিপরীতে, এটি একটি ওয়েব ভিউ পপ আপ করে আপনার UI নিয়ন্ত্রণ করবে যেখানে ব্যবহারকারী তাদের শংসাপত্রগুলি প্রবেশ করতে পারে৷

    সাইন ইন ফ্লো শুরু করতে, signInWithProvider কল করুন:

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

    আপনার আবেদনটি তখন অপেক্ষা করতে পারে বা ভবিষ্যতে একটি কলব্যাক নিবন্ধন করতে পারে

  6. একই প্যাটার্ন ReauthenticateWithProvider এর সাথে ব্যবহার করা যেতে পারে যা সাম্প্রতিক লগইন প্রয়োজন এমন সংবেদনশীল ক্রিয়াকলাপের জন্য নতুন শংসাপত্র পুনরুদ্ধার করতে ব্যবহার করা যেতে পারে।

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

    আপনার আবেদনটি তখন অপেক্ষা করতে পারে বা ভবিষ্যতে একটি কলব্যাক নিবন্ধন করতে পারে

  7. এবং, আপনি বিদ্যমান অ্যাকাউন্টে বিভিন্ন পরিচয় প্রদানকারীকে লিঙ্ক করতে LinkWithCredential() ব্যবহার করতে পারেন।

    মনে রাখবেন যে অ্যাপল আপনাকে তাদের অ্যাপল অ্যাকাউন্টগুলিকে অন্য ডেটার সাথে লিঙ্ক করার আগে ব্যবহারকারীদের কাছ থেকে স্পষ্ট সম্মতি নিতে হবে।

    উদাহরণস্বরূপ, বর্তমান ফায়ারবেস অ্যাকাউন্টের সাথে একটি Facebook অ্যাকাউন্ট লিঙ্ক করতে, ব্যবহারকারীকে Facebook-এ সাইন ইন করার সময় আপনি যে অ্যাক্সেস টোকেন পেয়েছেন তা ব্যবহার করুন:

    // 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 Notes দিয়ে সাইন ইন করুন

Firebase Auth দ্বারা সমর্থিত অন্যান্য প্রদানকারীদের থেকে ভিন্ন, Apple একটি ফটো URL প্রদান করে না।

এছাড়াও, ব্যবহারকারী যখন অ্যাপের সাথে তাদের ইমেল শেয়ার না করা বেছে নেয়, তখন অ্যাপল সেই ব্যবহারকারীর জন্য একটি অনন্য ইমেল ঠিকানার ব্যবস্থা করে (ফর্ম xyz@privaterelay.appleid.com ), যা এটি আপনার অ্যাপের সাথে শেয়ার করে। আপনি যদি ব্যক্তিগত ইমেল রিলে পরিষেবা কনফিগার করেন, অ্যাপল ব্যবহারকারীর আসল ইমেল ঠিকানায় বেনামী ঠিকানায় পাঠানো ইমেলগুলি ফরওয়ার্ড করে।

অ্যাপল শুধুমাত্র ব্যবহারকারীর তথ্য শেয়ার করে যেমন ডিসপ্লে নাম অ্যাপের সাথে প্রথমবার যখন কোনো ব্যবহারকারী সাইন ইন করে। সাধারণত, Firebase ডিসপ্লে নাম সংরক্ষণ করে যখন কোনো ব্যবহারকারী অ্যাপলের সাথে প্রথমবার সাইন ইন করে, যা আপনি current_user().display_name() দিয়ে পেতে পারেন। যাইহোক, আপনি যদি আগে Firebase ব্যবহার না করে অ্যাপে কোনো ব্যবহারকারীকে সাইন ইন করার জন্য Apple ব্যবহার করেন, তাহলে Apple ব্যবহারকারীর প্রদর্শনের নাম দিয়ে Firebase প্রদান করবে না।

পরবর্তী পদক্ষেপ

একজন ব্যবহারকারী প্রথমবার সাইন ইন করার পরে, একটি নতুন ব্যবহারকারীর অ্যাকাউন্ট তৈরি করা হয় এবং শংসাপত্রগুলির সাথে লিঙ্ক করা হয়—অর্থাৎ, ব্যবহারকারীর নাম এবং পাসওয়ার্ড, ফোন নম্বর, বা প্রমাণ প্রদানকারীর তথ্য — ব্যবহারকারী সাইন ইন করেছেন। এই নতুন অ্যাকাউন্টটি আপনার ফায়ারবেস প্রকল্পের অংশ হিসাবে সংরক্ষণ করা হয়েছে এবং ব্যবহারকারী কীভাবে সাইন ইন করুন না কেন, আপনার প্রকল্পের প্রতিটি অ্যাপ জুড়ে একজন ব্যবহারকারীকে শনাক্ত করতে ব্যবহার করা যেতে পারে।

আপনার অ্যাপে, আপনি firebase::auth::User অবজেক্ট থেকে ব্যবহারকারীর মৌলিক প্রোফাইল তথ্য পেতে পারেন। ব্যবহারকারীদের পরিচালনা দেখুন।

আপনার ফায়ারবেস রিয়েলটাইম ডেটাবেস এবং ক্লাউড স্টোরেজ সুরক্ষা নিয়মে, আপনি প্রমাণীকরণ ভেরিয়েবল থেকে সাইন-ইন করা ব্যবহারকারীর অনন্য ব্যবহারকারী আইডি পেতে পারেন এবং ব্যবহারকারী কোন ডেটা অ্যাক্সেস করতে পারে তা নিয়ন্ত্রণ করতে এটি ব্যবহার করতে পারেন।