আপনি Firebase SDK ব্যবহার করে এন্ড-টু-এন্ড OAuth 2.0 সাইন-ইন ফ্লো সম্পূর্ণ করার মাধ্যমে আপনার ব্যবহারকারীদের Apple আইডি দিয়ে Firebase-এর মাধ্যমে যাচাই করিয়ে নিতে পারবেন।
শুরু করার আগে
Apple ব্যবহার করে ব্যবহারকারীদের সাইন-ইন করতে দিতে, প্রথমে Apple-এর ডেভেলপার সাইটে Apple-এর মাধ্যমে সাইন-ইন করুন কনফিগার করুন, তারপর আপনার Firebase প্রোজেক্টের জন্য সাইন-ইন প্রদানকারী হিসেবে Apple-কে চালু করুন।
Apple Developer Program-এ যোগ দিন
Apple Developer Program-এর মেম্বাররাই শুধু 'Apple-এর মাধ্যমে সাইন-ইন করুন' ফিচার কনফিগার করতে পারবেন।
'Apple-এর মাধ্যমে সাইন-ইন করুন' ফিচার কনফিগার করা
আপনার Firebase প্রোজেক্টে Apple-এর মাধ্যমে সাইন-ইন চালু ও সঠিকভাবে কনফিগার করা থাকতে হবে। Android ও Apple প্ল্যাটফর্ম জুড়ে কনফিগারেশন আলাদা আলাদা হয়। এগিয়ে যাওয়ার আগে Apple প্ল্যাটফর্ম এবং/অথবা Android নির্দেশিকার "Apple-এর মাধ্যমে সাইন-ইন কনফিগার করুন" বিভাগটি ভালো করে পড়ে নিন।সাইন-ইন পরিষেবা প্রদানকারী হিসেবে Apple-কে চালু করা
- Firebase কনসোলে গিয়ে নিরাপত্তা > যাচাইকরণ বিকল্পে যান।
- সাইন-ইন পদ্ধতি ট্যাবে, Apple সাইন-ইন প্রদানকারী চালু করুন।
- Apple সাইন-ইন প্রদানকারীর সেটিংস কনফিগার করুন:
- Apple: আপনি যদি শুধুমাত্র Apple প্ল্যাটফর্মে আপনার অ্যাপ ডিপ্লয় করেন, তাহলে আপনি পরিষেবা আইডি, Apple টিম আইডি, ব্যক্তিগত কী এবং কী আইডি ফিল্ড খালি রাখতে পারেন।
-
Android: Android ডিভাইসে কাজ করার জন্য
নিম্নলিখিতগুলি সম্পূর্ণ করুন:
- আপনার Android প্রোজেক্টে Firebase যোগ করুন।
-
আপনি আগে থেকে না করে থাকলে, আপনার অ্যাপের SHA-1 ফিঙ্গারপ্রিন্ট নির্দিষ্ট করুন।
-
Firebase কনসোলে, গিয়ে
সেটিংস > সাধারণ ট্যাব দেখুন। - নিচের দিকে স্ক্রল করে আপনার অ্যাপ কার্ডে যান, আপনার Android অ্যাপ বেছে নিন, এবং SHA সার্টিফিকেট ফিঙ্গারপ্রিন্ট ফিল্ডে আপনার SHA-1 ফিঙ্গারপ্রিন্ট যোগ করুন।
আপনার অ্যাপের SHA ফিঙ্গারপ্রিন্ট কীভাবে পাবেন সেই বিষয়ে বিস্তারিত জানতে আপনার ক্লায়েন্টকে যাচাই করা দেখুন।
-
Firebase কনসোলে, গিয়ে
-
Apple সাইন-ইন প্রদানকারীর সেটিংস কনফিগার করুন:
- Firebase কনসোলে, নিরাপত্তা > যাচাইকরণ বিকল্পে যান।
- সাইন-ইন পদ্ধতি ট্যাবে, Apple সাইন-ইন প্রোভাইডারে ক্লিক করুন।
- আগের বিভাগে আপনার তৈরি করা পরিষেবা আইডি উল্লেখ করুন। এছাড়াও, OAuth কোড ফ্লো কনফিগারেশন বিভাগে, আপনার Apple টিম আইডি এবং আগের বিভাগে আপনার তৈরি করা ব্যক্তিগত কী ও কী আইডি উল্লেখ করুন।
Apple-এর পরিচয় গোপন রাখা ডেটা সংক্রান্ত প্রয়োজনীয়তা মেনে চলা
সাইন-ইন করার সময়, Sign In with Apple ব্যবহারকারীদের তাদের ইমেল আইডি সহ ডেটা অ্যানোনিমাস করার বিকল্প দেয়।
যেসব ব্যবহারকারী এই বিকল্প বেছে নিয়েছেন
তাদের ইমেল আইডিতে privaterelay.appleid.com ডোমেন আছে। আপনার অ্যাপে
Apple-এর মাধ্যমে সাইন-ইন করুন ব্যবহার করলে, আপনাকে অবশ্যই এইসব বেনামী Apple
আইডি সংক্রান্ত Apple-এর প্রযোজ্য
ডেভেলপার নীতি বা শর্তাবলী মেনে চলতে হবে।
এর মধ্যে অন্তর্ভুক্ত হল, আপনি কোনও সরাসরি শনাক্তকরণযোগ্য ব্যক্তিগত তথ্য কোনও বেনামী Apple ID-এর সাথে অ্যাসোসিয়েট করার আগে প্রয়োজনীয় ব্যবহারকারীর সম্মতি নেওয়া। Firebase যাচাইকরণ ব্যবহার করার সময়, এর মধ্যে নিম্নলিখিত অ্যাকশন অন্তর্ভুক্ত থাকতে পারে:
- অ্যানোনিমাস Apple আইডির সাথে ইমেল আইডি লিঙ্ক করা বা এর বিপরীত।
- অ্যানোনিমাস Apple আইডির সাথে ফোন নম্বর লিঙ্ক করা বা এর বিপরীত
- কোনও বেনামী নয় এমন সোশ্যাল ক্রেডেনশিয়াল (Facebook, Google, ইত্যাদি) কোনও বেনামী Apple আইডির সাথে লিঙ্ক করা অথবা এর বিপরীত।
উপরে দেওয়া তালিকাটি সম্পূর্ণ নয়। আপনার অ্যাপ Apple-এর প্রয়োজনীয়তা পূরণ করছে কিনা তা নিশ্চিত করতে ডেভেলপার অ্যাকাউন্টের মেম্বারশিপ বিভাগে Apple Developer Program লাইসেন্স চুক্তি দেখুন।
firebase::auth::Auth ক্লাসে অ্যাক্সেস করা
Auth ক্লাস হল সব API কলের গেটওয়ে।
- Auth ও App হেডার ফাইল যোগ করুন:
#include <cassert> #include <cstdint> #include "firebase/app.h" #include "firebase/auth.h"
- আপনার ইনিশিয়ালাইজেশন কোডে, একটি
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__)
- আপনার
firebase::App-এর জন্যfirebase::auth::Authক্লাস পান।AppওAuth-এর মধ্যে এক-এক ম্যাপিং আছে।firebase::auth::Auth* auth = firebase::auth::Auth::GetAuth(app);
Firebase SDK-এর মাধ্যমে সাইন-ইন ফ্লো ম্যানেজ করা
Apple এবং Android প্ল্যাটফর্ম জুড়ে 'Apple-এর মাধ্যমে সাইন-ইন করুন' প্রসেস আলাদা আলাদা হয়।
Apple প্ল্যাটফর্মে
আপনার C++ কোড থেকে Apple Sign In Objective-C SDK-এর মাধ্যমে Firebase-এর সাহায্যে আপনার ব্যবহারকারীদের যাচাই করুন।
প্রতিটি সাইন-ইন অনুরোধের জন্য, একটি র্যান্ডম স্ট্রিং—একটি "নন্স"—জেনারেট করুন, যা আপনি এটি নিশ্চিত করতে ব্যবহার করবেন যে আপনার পাওয়া আইডি টোকেনটি বিশেষভাবে আপনার অ্যাপের যাচাইকরণ অনুরোধের উত্তরে মঞ্জুর করা হয়েছে। রিপ্লে অ্যাটাক প্রতিরোধ করার জন্য এই ধাপটি গুরুত্বপূর্ণ।
- (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-এর পাঠানো ভ্যালুর সাথে তুলনা করে উত্তরটি যাচাই করে।
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; }আপনার ইমপ্লিমেন্টেশনে ASAuthorizationControllerDelegate`-এ Apple-এর উত্তর হ্যান্ডেল করুন। সাইন-ইন সফল হলে, Firebase-এর সাথে যাচাই করার জন্য আনহ্যাশড ননস সহ Apple-এর উত্তর থেকে ID টোকেন ব্যবহার করুন:
- (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); } }Firebase Credential তৈরি করতে এবং Firebase-এ সাইন-ইন করতে, ফলাফল হিসেবে পাওয়া টোকেন স্ট্রিং এবং আসল ননস ব্যবহার করুন।
firebase::auth::OAuthProvider::GetCredential( /*provider_id=*/"apple.com", token, nonce, /*access_token=*/nullptr); firebase::Future<firebase::auth::AuthResult> result = auth->SignInAndRetrieveDataWithCredential(credential);Reauthenticate-এর সাথে একই প্যাটার্ন ব্যবহার করা যেতে পারে, যা সংবেদনশীল অপারেশনের জন্য নতুন ক্রেডেনশিয়াল পেতে ব্যবহার করা যেতে পারে, এর জন্য সাম্প্রতিক লগ-ইন প্রয়োজন।firebase::Future<firebase::auth::AuthResult> result = user->Reauthenticate(credential);Apple-এর মাধ্যমে সাইন-ইন ফিচারের সাথে অ্যাকাউন্ট লিঙ্ক করার জন্য একই প্যাটার্ন ব্যবহার করা যেতে পারে। তবে, আপনি যে Apple অ্যাকাউন্টের সাথে লিঙ্ক করার চেষ্টা করছেন সেটির সাথে আগে থেকেই কোনও Firebase অ্যাকাউন্ট লিঙ্ক করা থাকলে সমস্যা হতে পারে। এটি ঘটলে, ভবিষ্যতে একটি স্ট্যাটাস
kAuthErrorCredentialAlreadyInUseরিটার্ন করবে এবংAuthResult-এ একটি সঠিকcredentialথাকতে পারে। এই ক্রেডেনশিয়ালটিSignInAndRetrieveDataWithCredential-এর মাধ্যমে Apple-এর সাথে লিঙ্ক করা অ্যাকাউন্টে সাইন-ইন করতে ব্যবহার করা যেতে পারে। এর জন্য অন্য Apple সাইন-ইন টোকেন ও ননস জেনারেট করার প্রয়োজন নেই।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. }
Android এ
Android-এ, এন্ড-টু-এন্ড সাইন-ইন ফ্লো সম্পূর্ণ করতে Firebase SDK ব্যবহার করে আপনার অ্যাপে ওয়েব-ভিত্তিক সাধারণ OAuth লগ-ইন ইন্টিগ্রেট করার মাধ্যমে Firebase-এর সাহায্যে আপনার ব্যবহারকারীদের যাচাই করুন।
Firebase SDK-এর মাধ্যমে সাইন-ইন ফ্লো ম্যানেজ করতে, এইসব ধাপ অনুসরণ করুন:
Apple-এর জন্য উপযুক্ত প্রোভাইডার আইডির সাথে কনফিগার করা
FederatedOAuthProviderData-এর একটি ইনস্ট্যান্স তৈরি করুন।firebase::auth::FederatedOAuthProviderData provider_data("apple.com");ঐচ্ছিক: ডিফল্ট স্কোপের বাইরে অতিরিক্ত OAuth 2.0 স্কোপ নির্দিষ্ট করুন যা আপনি যাচাইকরণ প্রদানকারীর কাছে অনুরোধ করতে চান।
provider_data.scopes.push_back("email"); provider_data.scopes.push_back("name");ঐচ্ছিক: আপনি যদি ইংরেজি ছাড়া অন্য কোনও ভাষায় Apple-এর সাইন-ইন স্ক্রিন দেখাতে চান, তাহলে
localeপ্যারামিটার সেট করুন। কাজ করে এমন লোকেল সম্পর্কে জানতে Apple-এর মাধ্যমে সাইন-ইন সংক্রান্ত ডকুমেন্ট দেখুন।// Localize to French. provider_data.custom_parameters["language"] = "fr"; ```আপনার প্রদানকারীর ডেটা কনফিগার করা হয়ে গেলে, এটি ব্যবহার করে একটি FederatedOAuthProvider তৈরি করুন।
// Construct a FederatedOAuthProvider for use in Auth methods. firebase::auth::FederatedOAuthProvider provider(provider_data);Auth প্রদানকারী অবজেক্ট ব্যবহার করে Firebase-এর মাধ্যমে যাচাই করিয়ে নিন। মনে রাখবেন যে অন্যান্য FirebaseAuth অপারেশনের মতো নয়, এটি আপনার UI-এর নিয়ন্ত্রণ নেবে এবং একটি ওয়েব ভিউ পপ-আপ করবে যেখানে ব্যবহারকারী তার ক্রেডেনশিয়াল লিখতে পারবেন।
সাইন-ইন ফ্লো শুরু করতে,
signInWithProviderকল করুন:firebase::Future<firebase::auth::AuthResult> result = auth->SignInWithProvider(provider_data);আপনার অ্যাপ্লিকেশন হয়ত অপেক্ষা করবে অথবা Future-এ একটি কলব্যাক রেজিস্টার করবে।
ReauthenticateWithProvider-এর সাথে একই প্যাটার্ন ব্যবহার করা যেতে পারে, যা সংবেদনশীল অপারেশনের জন্য নতুন ক্রেডেনশিয়াল পেতে ব্যবহার করা যেতে পারে, এর জন্য সাম্প্রতিক লগ-ইন প্রয়োজন।firebase::Future<firebase::auth::AuthResult> result = user.ReauthenticateWithProvider(provider_data);আপনার অ্যাপ্লিকেশন হয়ত অপেক্ষা করবে অথবা ভবিষ্যতে কলব্যাক রেজিস্টার করবে ।
এছাড়াও, আগে থেকে থাকা অ্যাকাউন্টের সাথে আলাদা আলাদা পরিচয় প্রদানকারীকে লিঙ্ক করতে, আপনি
LinkWithCredential()ব্যবহার করতে পারবেন।মনে রাখবেন, Apple-এর শর্ত অনুযায়ী, ব্যবহারকারীর Apple অ্যাকাউন্ট অন্য ডেটার সাথে লিঙ্ক করার আগে আপনাকে তার থেকে স্পষ্ট সম্মতি নিতে হবে।
যেমন, বর্তমান Firebase অ্যাকাউন্টের সাথে 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 প্রদান করে না।
এছাড়াও, ব্যবহারকারী অ্যাপের সাথে তার ইমেল আইডি শেয়ার করতে না চাইলে, Apple
সেই ব্যবহারকারীর জন্য একটি অনন্য ইমেল আইডি (এই ধরনের
xyz@privaterelay.appleid.com) প্রদান করে, যা আপনার অ্যাপের সাথে শেয়ার করা হয়। আপনি
প্রাইভেট ইমেল রিলে পরিষেবা কনফিগার করে থাকলে, Apple
অ্যানোনিমাস ইমেল আইডিতে পাঠানো ইমেল ব্যবহারকারীর আসল ইমেল আইডিতে ফরওয়ার্ড করে।
ব্যবহারকারী প্রথমবার সাইন-ইন করলে, Apple শুধুমাত্র অ্যাপের সাথে ডিসপ্লে নামের মতো ব্যবহারকারীর তথ্য শেয়ার করে।
সাধারণত, কোনও ব্যবহারকারী Apple-এর মাধ্যমে প্রথমবার সাইন-ইন করলে Firebase ডিসপ্লে নাম সেভ করে রাখে, যা আপনি
current_user().display_name()-এর মাধ্যমে পেতে পারেন।
তবে, আপনি যদি আগে Firebase ব্যবহার না করে অ্যাপে কোনও ব্যবহারকারীকে সাইন-ইন করানোর জন্য Apple ব্যবহার করে থাকেন, তাহলে Apple Firebase-কে
ব্যবহারকারীর ডিসপ্লে নাম প্রদান করবে না।
পরবর্তী ধাপ
কোনও ব্যবহারকারী প্রথমবার সাইন-ইন করার পরে, একটি নতুন ব্যবহারকারীর অ্যাকাউন্ট তৈরি করা হয় এবং ক্রেডেনশিয়ালের সাথে লিঙ্ক করা হয়—অর্থাৎ, ব্যবহারকারীর নাম এবং পাসওয়ার্ড, ফোন নম্বর বা প্রমাণীকরণ প্রদানকারীর তথ্য—ব্যবহারকারী যেটির মাধ্যমে সাইন-ইন করেছেন। এই নতুন অ্যাকাউন্টটি আপনার Firebase প্রোজেক্টের অংশ হিসেবে স্টোর করা হয় এবং ব্যবহারকারী কীভাবে সাইন-ইন করেছেন তা নির্বিশেষে, আপনার প্রোজেক্টের প্রতিটি অ্যাপ জুড়ে কোনও ব্যবহারকারীকে শনাক্ত করতে ব্যবহার করা যেতে পারে।আপনার অ্যাপে, আপনি
firebase::auth::User অবজেক্ট থেকে ব্যবহারকারীর প্রাথমিক প্রোফাইল তথ্য পেতে পারেন।
ব্যবহারকারীদের ম্যানেজ করা দেখুন।
আপনার Firebase Realtime Database এবং Cloud Storage Security Rules-এ, আপনি সাইন-ইন করা ব্যবহারকারীর অনন্য ব্যবহারকারী আইডি auth ভেরিয়েবল থেকে পেতে পারেন এবং ব্যবহারকারী কোন ডেটা অ্যাক্সেস করতে পারবেন তা নিয়ন্ত্রণ করতে এটি ব্যবহার করতে পারেন।