Apple প্ল্যাটফর্মে OpenID Connect ব্যবহার করে যাচাইকরণ

আপনি Firebase Authentication with Identity Platform-এ আপগ্রেড করে থাকলে, আপনার পছন্দমতো OpenID Connect (OIDC) মেনে চলা প্রদানকারীর মাধ্যমে Firebase ব্যবহার করে আপনার ব্যবহারকারীদের যাচাই করতে পারবেন। এর ফলে Firebase-এ নেটিভভাবে কাজ করে না এমন আইডেন্টিটি প্রোভাইডার ব্যবহার করা সম্ভব হয়।

শুরু করার আগে

OIDC প্রদানকারী ব্যবহার করে ব্যবহারকারীদের সাইন-ইন করাতে, আপনাকে প্রথমে প্রদানকারীর থেকে কিছু তথ্য সংগ্রহ করতে হবে:

  • ক্লায়েন্ট আইডি: প্রোভাইডারের অনন্য স্ট্রিং যা আপনার অ্যাপকে শনাক্ত করে। আপনার প্রোভাইডার, আপনি কাজ করেন এমন প্রতিটি প্ল্যাটফর্মের জন্য আপনাকে আলাদা ক্লায়েন্ট আইডি অ্যাসাইন করতে পারে। এটি হল আপনার প্রদানকারীর ইস্যু করা আইডি টোকেনে aud দাবির একটি ভ্যালু।

  • ক্লায়েন্ট সিক্রেট: একটি সিক্রেট স্ট্রিং যা প্রদানকারী ক্লায়েন্ট আইডির মালিকানা কনফার্ম করতে ব্যবহার করে। প্রতিটি ক্লায়েন্ট আইডির জন্য, আপনাকে একটি ম্যাচিং ক্লায়েন্ট সিক্রেট দিতে হবে। (আপনি অনুমোদন কোড ফ্লো ব্যবহার করলে, তবেই এই ভ্যালু প্রয়োজন হয়, যা ব্যবহার করার জন্য অত্যন্ত সাজেস্ট করা হয়।)

  • ইস্যুকারী: আপনার প্রদানকারীকে শনাক্ত করে এমন একটি স্ট্রিং। এই ভ্যালু অবশ্যই একটি URL হতে হবে যা /.well-known/openid-configuration-এর সাথে যোগ করলে, সেটি হবে প্রোভাইডারের OIDC ডিসকভারি ডকুমেন্টের লোকেশন। যেমন, ইস্যুকারী যদি https://auth.example.com হয়, তাহলে ডিসকভারি ডকুমেন্টকে https://auth.example.com/.well-known/openid-configuration-এ উপলভ্য থাকতে হবে।

উপরের তথ্য পাওয়ার পরে, আপনার Firebase প্রোজেক্টের জন্য সাইন-ইন প্রোভাইডার হিসেবে OpenID Connect চালু করুন:

  1. আপনার iOS প্রোজেক্টে Firebase যোগ করুন।

  2. আপনি Firebase Authentication with Identity Platform-এ আপগ্রেড না করে থাকলে, তা করুন। OpenID Connect যাচাইকরণ শুধুমাত্র আপগ্রেড করা প্রোজেক্টে উপলভ্য।

  3. Firebase কনসোলে, নিরাপত্তা > যাচাইকরণ বিকল্পে যান।

  4. সাইন-ইন পদ্ধতি ট্যাবে, নতুন পরিষেবা প্রদানকারী যোগ করুন বিকল্পে ক্লিক করুন এবং তারপরে OpenID Connect বিকল্পে ক্লিক করুন।

  5. আপনি অনুমোদন কোড ফ্লো নাকি ইমপ্লিসিট গ্র্যান্ট ফ্লো ব্যবহার করবেন তা বেছে নিন।

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

  6. এই পরিষেবা প্রদানকারীর একটি নাম দিন। জেনারেট করা প্রদানকারী আইডিটি মনে রাখুন: oidc.example-provider-এর মতো কিছু। আপনার অ্যাপে সাইন-ইন কোড যোগ করার সময় এই আইডি প্রয়োজন হবে।

  7. আপনার ক্লায়েন্ট আইডি ও ক্লায়েন্ট সিক্রেট এবং আপনার প্রদানকারীর ইস্যুকারী স্ট্রিং উল্লেখ করুন। এইসব ভ্যালু আপনার পরিষেবা প্রদানকারীর অ্যাসাইন করা ভ্যালুর সাথে হুবহু মিলতে হবে।

  8. আপনার করা পরিবর্তন সেভ করুন।

Firebase SDK-এর মাধ্যমে সাইন-ইন ফ্লো ম্যানেজ করা

আপনার OIDC প্রোভাইডার ব্যবহার করে Firebase-এর মাধ্যমে আপনার ব্যবহারকারীদের যাচাই করার সবচেয়ে সহজ উপায় হল Firebase SDK-এর মাধ্যমে সম্পূর্ণ সাইন-ইন ফ্লো ম্যানেজ করা।

Firebase Apple প্ল্যাটফর্ম SDK-এর মাধ্যমে সাইন-ইন ফ্লো ম্যানেজ করতে, এইসব ধাপ অনুসরণ করুন:

  1. আপনার Xcode প্রোজেক্টে কাস্টম URL স্কিম যোগ করুন:

    1. আপনার প্রোজেক্ট কনফিগারেশন খুলুন: বাঁদিকের ট্রি ভিউতে প্রোজেক্টের নামে ডবল ক্লিক করুন। টার্গেট বিভাগ থেকে আপনার অ্যাপ বেছে নিন, তারপরে তথ্য ট্যাব বেছে নিন এবং URL-এর ধরন বিভাগটি বড় করুন।
    2. + বোতামে ক্লিক করুন এবং URL স্কিম হিসেবে আপনার এনকোড করা অ্যাপ আইডি যোগ করুন। অন্যান্য ফিল্ড খালি রাখুন।

      আপনি Firebase কনসোলে এনকোড করা অ্যাপ আইডি খুঁজে পেতে পারেন: এর জন্য সেটিংস > সাধারণ ট্যাব, বিকল্পে যান, তারপর আপনার অ্যাপ বিভাগে স্ক্রল করে আপনার iOS অ্যাপের বিবরণ দেখুন।

      সম্পূর্ণ হলে, আপনার কনফিগারেশনটি নিম্নলিখিত (তবে আপনার অ্যাপ্লিকেশন-নির্দিষ্ট মান সহ) আইটেমের মতো দেখতে হবে:

      Xcode-এর কাস্টম URL স্কিম সেট-আপ ইন্টারফেসের স্ক্রিনশট
  2. Firebase কনসোলে পাওয়া প্রোভাইডার আইডি ব্যবহার করে OAuthProvider-এর একটি ইনস্ট্যান্স তৈরি করুন।

    Swift

    var provider = OAuthProvider(providerID: "oidc.example-provider")
    

    Objective-C

    FIROAuthProvider *provider = [FIROAuthProvider providerWithProviderID:@"oidc.example-provider"];
    
  3. ঐচ্ছিক: OAuth অনুরোধের সাথে আপনি পাঠাতে চান এমন অতিরিক্ত কাস্টম OAuth প্যারামিটার নির্দিষ্ট করুন।

    Swift

    provider.customParameters = [
      "login_hint": "user@example.com"
    ]
    

    Objective-C

    [provider setCustomParameters:@{@"login_hint": @"user@example.com"}];
    

    আপনার পরিষেবা প্রদানকারীর সাথে কথা বলে দেখুন যে কোন কোন প্যারামিটার কাজ করে। মনে রাখবেন, আপনি Firebase-এর প্রয়োজনীয় প্যারামিটার setCustomParameters-এর সাথে পাস করতে পারবেন না। এইসব প্যারামিটার হল client_id, response_type, redirect_uri, state, scope এবং response_mode.

  4. ঐচ্ছিক: যাচাইকরণ প্রদানকারীর কাছে আপনি অনুরোধ করতে চান এমন প্রাথমিক প্রোফাইলের বাইরে অতিরিক্ত OAuth 2.0 স্কোপ নির্দিষ্ট করুন।

    Swift

    provider.scopes = ["mail.read", "calendars.read"]
    

    Objective-C

    [provider setScopes:@[@"mail.read", @"calendars.read"]];
    

    আপনার প্রদানকারীর সাথে যোগাযোগ করে দেখুন যে এটি কোন কোন স্কোপে কাজ করে।

  5. ঐচ্ছিক: ব্যবহারকারীকে reCAPTCHA দেখানোর সময় আপনার অ্যাপ SFSafariViewController বা UIWebView যেভাবে দেখায় সেটি কাস্টমাইজ করতে চাইলে, AuthUIDelegate প্রোটোকল মেনে চলে এমন একটি কাস্টম ক্লাস তৈরি করুন।

  6. OAuth প্রদানকারী অবজেক্ট ব্যবহার করে Firebase-এর মাধ্যমে যাচাই করিয়ে নিন।

    Swift

    // If you created a custom class that conforms to AuthUIDelegate,
    // pass it instead of nil:
    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.
          // OAuth access token can also be retrieved:
          // (authResult.credential as? OAuthCredential)?.accessToken
          // OAuth ID token can also be retrieved:
          // (authResult.credential as? OAuthCredential)?.idToken
        }
      }
    }
    

    Objective-C

    // If you created a custom class that conforms to AuthUIDelegate,
    // pass it instead of nil:
    [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.
          // OAuth access token can also be retrieved:
          // ((FIROAuthCredential *)authResult.credential).accessToken
          // OAuth ID token can also be retrieved:
          // ((FIROAuthCredential *)authResult.credential).idToken
        }];
      }
    }];
    
  7. উপরের উদাহরণগুলি সাইন-ইন ফ্লোয়ের উপর ফোকাস করলেও, আপনার কাছে linkWithCredential ব্যবহার করে আগে থেকে থাকা ব্যবহারকারীর সাথে OIDC প্রদানকারীকে লিঙ্ক করার ক্ষমতাও আছে। যেমন, আপনি একই ব্যবহারকারীর সাথে একাধিক পরিষেবা প্রদানকারীকে লিঙ্ক করতে পারেন, যাতে তিনি যেকোনও একটির মাধ্যমে সাইন-ইন করতে পারেন।

    Swift

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

    Objective-C

    [[FIRAuth auth].currentUser
        linkWithCredential:credential
                completion:^(FIRAuthDataResult * _Nullable authResult, NSError * _Nullable error) {
      if (error) {
        // Handle error.
      }
      // OIDC credential is linked to the current user.
      // IdP data available in authResult.additionalUserInfo.profile.
      // OAuth access token can also be retrieved:
      // ((FIROAuthCredential *)authResult.credential).accessToken
      // OAuth ID token can also be retrieved:
      // ((FIROAuthCredential *)authResult.credential).idToken
    }];
    
  8. একই প্যাটার্ন reauthenticateWithCredential-এর সাথে ব্যবহার করা যেতে পারে, যা সংবেদনশীল অপারেশনের জন্য নতুন ক্রেডেনশিয়াল পেতে ব্যবহার করা যেতে পারে, এর জন্য সাম্প্রতিক লগ-ইন প্রয়োজন।

    Swift

    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 can also be retrieved:
      // (authResult.credential as? OAuthCredential)?.accessToken
      // OAuth ID token can also be retrieved:
      // (authResult.credential as? OAuthCredential)?.idToken
    }
    

    Objective-C

    [[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 can also be retrieved:
      // ((FIROAuthCredential *)authResult.credential).accessToken
      // OAuth ID token can also be retrieved:
      // ((FIROAuthCredential *)authResult.credential).idToken
    }];
    

সাইন-ইন ফ্লো ম্যানুয়ালি ম্যানেজ করা

আপনি যদি ইতিমধ্যেই আপনার অ্যাপে OpenID Connect সাইন-ইন ফ্লো প্রয়োগ করে থাকেন, তাহলে আপনি Firebase-এর সাথে যাচাই করার জন্য সরাসরি ID টোকেন ব্যবহার করতে পারেন:

Swift

let credential = OAuthProvider.credential(
    withProviderID: "oidc.example-provider",  // As registered in Firebase console.
    idToken: idToken,  // ID token from OpenID Connect flow.
    rawNonce: nil
)
Auth.auth().signIn(with: credential) { authResult, error in
    if error {
        // Handle error.
        return
    }
    // User is signed in.
    // IdP data available in authResult?.additionalUserInfo?.profile
}

Objective-C

FIROAuthCredential *credential =
    [FIROAuthProvider credentialWithProviderID:@"oidc.example-provider"  // As registered in Firebase console.
                                       IDToken:idToken  // ID token from OpenID Connect flow.
                                      rawNonce:nil];
[[FIRAuth auth] signInWithCredential:credential
                          completion:^(FIRAuthDataResult * _Nullable authResult,
                                      NSError * _Nullable error) {
    if (error != nil) {
        // Handle error.
        return;
    }
    // User is signed in.
    // IdP data available in authResult.additionalUserInfo.profile
}];

পরবর্তী ধাপ

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

  • আপনার অ্যাপে, আপনি User অবজেক্ট থেকে ব্যবহারকারীর প্রাথমিক প্রোফাইল সংক্রান্ত তথ্য পেতে পারেন। ব্যবহারকারীদের ম্যানেজ করা দেখুন।

  • আপনার Firebase Realtime Database এবং Cloud Storage নিরাপত্তা বিধিতে, আপনি auth ভেরিয়েবল থেকে সাইন-ইন করা ব্যবহারকারীর অনন্য ব্যবহারকারী আইডি পেতে এবং ব্যবহারকারী কোন ডেটা অ্যাক্সেস করতে পারবেন তা নিয়ন্ত্রণ করতে এটি ব্যবহার করতে পারবেন।

আপনি আগে থেকে থাকা ব্যবহারকারীর অ্যাকাউন্টের সাথে অনুমোদন প্রদানকারীর ক্রেডেনশিয়াল লিঙ্ক করে একাধিক অনুমোদন প্রদানকারীর মাধ্যমে আপনার অ্যাপে সাইন-ইন করার জন্য ব্যবহারকারীদের অনুমতি দিতে পারেন।

কোনও ব্যবহারকারীকে সাইন-আউট করতে, signOut:-এ কল করুন।

Swift

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

Objective-C

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

এছাড়াও, আপনি হয়ত সম্পূর্ণ রেঞ্জের যাচাইকরণ সমস্যার জন্য সমস্যা সমাধানকারী কোড যোগ করতে চান। সমস্যা সমাধান করা দেখুন।