আপনি 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 চালু করুন:
আপনি Firebase Authentication with Identity Platform-এ আপগ্রেড না করে থাকলে, তা করুন। OpenID Connect যাচাইকরণ শুধুমাত্র আপগ্রেড করা প্রোজেক্টে উপলভ্য।
Firebase কনসোলে, নিরাপত্তা > যাচাইকরণ বিকল্পে যান।
সাইন-ইন পদ্ধতি ট্যাবে, নতুন পরিষেবা প্রদানকারী যোগ করুন বিকল্পে ক্লিক করুন এবং তারপরে OpenID Connect বিকল্পে ক্লিক করুন।
আপনি অনুমোদন কোড ফ্লো নাকি ইমপ্লিসিট গ্র্যান্ট ফ্লো ব্যবহার করবেন তা বেছে নিন।
আপনার প্রদানকারী এটি সমর্থন করলে, আপনাকে সবসময় কোড ফ্লো ব্যবহার করতে হবে। ইমপ্লিসিট ফ্লো কম সুরক্ষিত এবং এটি ব্যবহার করার জন্য কঠোরভাবে নিষেধ করা হয়।
এই পরিষেবা প্রদানকারীর একটি নাম দিন। জেনারেট করা প্রদানকারী আইডিটি মনে রাখুন:
oidc.example-provider-এর মতো কিছু। আপনার অ্যাপে সাইন-ইন কোড যোগ করার সময় এই আইডি প্রয়োজন হবে।আপনার ক্লায়েন্ট আইডি ও ক্লায়েন্ট সিক্রেট এবং আপনার প্রদানকারীর ইস্যুকারী স্ট্রিং উল্লেখ করুন। এইসব ভ্যালু আপনার পরিষেবা প্রদানকারীর অ্যাসাইন করা ভ্যালুর সাথে হুবহু মিলতে হবে।
আপনার করা পরিবর্তন সেভ করুন।
Firebase SDK-এর মাধ্যমে সাইন-ইন ফ্লো ম্যানেজ করা
আপনি যদি কোনও Android অ্যাপ তৈরি করেন, তাহলে আপনার OIDC প্রদানকারী ব্যবহার করে Firebase-এর সাথে আপনার ব্যবহারকারীদের প্রমাণিত করার সবচেয়ে সহজ উপায় হল Firebase Android SDK-এর সাথে সম্পূর্ণ সাইন-ইন ফ্লো ম্যানেজ করা।
Firebase Android SDK-এর মাধ্যমে সাইন-ইন ফ্লো ম্যানেজ করতে, এইসব ধাপ অনুসরণ করুন:
OAuthProvider-এর একটি ইনস্ট্যান্স তৈরি করতে, এর Builder-এর সাথে প্রোভাইডারের আইডি ব্যবহার করুন
Kotlin
val providerBuilder = OAuthProvider.newBuilder("oidc.example-provider")
Java
OAuthProvider.Builder providerBuilder = OAuthProvider.newBuilder("oidc.example-provider");
ঐচ্ছিক: OAuth অনুরোধের সাথে আপনি পাঠাতে চান এমন অতিরিক্ত কাস্টম OAuth প্যারামিটার নির্দিষ্ট করুন।
Kotlin
// Target specific email with login hint. providerBuilder.addCustomParameter("login_hint", "user@example.com")
Java
// Target specific email with login hint. providerBuilder.addCustomParameter("login_hint", "user@example.com");
আপনার OIDC প্রদানকারীর সাথে যোগাযোগ করে তারা কোন কোন প্যারামিটার সাপোর্ট করে তা জেনে নিন। মনে রাখবেন, আপনি Firebase-এর প্রয়োজনীয় প্যারামিটার
setCustomParameters()-এর সাথে পাস করতে পারবেন না। এইসব প্যারামিটার হল client_id, response_type, redirect_uri, state, scope এবং response_mode.ঐচ্ছিক: যাচাইকরণ প্রদানকারীর কাছে আপনি অনুরোধ করতে চান এমন মৌলিক প্রোফাইলের বাইরে অতিরিক্ত OAuth 2.0 স্কোপ নির্দিষ্ট করুন।
Kotlin
// Request read access to a user's email addresses. // This must be preconfigured in the app's API permissions. providerBuilder.scopes = listOf("mail.read", "calendars.read")
Java
// Request read access to a user's email addresses. // This must be preconfigured in the app's API permissions. List<String> scopes = new ArrayList<String>() { { add("mail.read"); add("calendars.read"); } }; providerBuilder.setScopes(scopes);
আপনার OIDC প্রদানকারীর ব্যবহৃত স্কোপ সম্পর্কে জানতে তার সাথে যোগাযোগ করুন।
OAuth প্রদানকারী অবজেক্ট ব্যবহার করে Firebase-এর মাধ্যমে যাচাই করিয়ে নিন। মনে রাখবেন যে অন্যান্য FirebaseAuth অপারেশনের মতো নয়, এটি একটি কাস্টম Chrome ট্যাবপপ-আপ করে আপনার UI-এর নিয়ন্ত্রণ নেবে। এর ফলে, আপনার অ্যাক্টিভিটি
OnSuccessListenerওOnFailureListener-এর রেফারেন্স দেবেন না, কারণ অপারেশন UI শুরু করলে সেগুলি সঙ্গে সঙ্গে ডিটাচ হয়ে যাবে।আপনি আগেই কোনও উত্তর পেয়েছেন কিনা তা প্রথমে চেক করে নিন। এই পদ্ধতিতে সাইন-ইন করলে আপনার অ্যাক্টিভিটি ব্যাকগ্রাউন্ডে চলে যায়, যার অর্থ হল সাইন-ইন ফ্লো চলাকালীন সিস্টেম এটি পুনরায় দাবি করতে পারে। এটি ঘটলে, ব্যবহারকারীকে যাতে আবার চেষ্টা করতে না হয় তা নিশ্চিত করতে, আপনাকে চেক করে দেখতে হবে যে কোনও ফলাফল আগে থেকেই আছে কিনা।
কোনও ফলাফল বাকি আছে কিনা তা চেক করতে,
getPendingAuthResultনম্বরে কল করুন:Kotlin
val pendingResultTask = firebaseAuth.pendingAuthResult if (pendingResultTask != null) { // There's something already here! Finish the sign-in for your user. pendingResultTask .addOnSuccessListener { // User is signed in. // IdP data available in // authResult.getAdditionalUserInfo().getProfile(). // The OAuth access token can also be retrieved: // ((OAuthCredential)authResult.getCredential()).getAccessToken(). // The OAuth secret can be retrieved by calling: // ((OAuthCredential)authResult.getCredential()).getSecret(). } .addOnFailureListener { // Handle failure. } } else { // There's no pending result so you need to start the sign-in flow. // See below. }
Java
Task<AuthResult> pendingResultTask = firebaseAuth.getPendingAuthResult(); if (pendingResultTask != null) { // There's something already here! Finish the sign-in for your user. pendingResultTask .addOnSuccessListener( new OnSuccessListener<AuthResult>() { @Override public void onSuccess(AuthResult authResult) { // User is signed in. // IdP data available in // authResult.getAdditionalUserInfo().getProfile(). // The OAuth access token can also be retrieved: // ((OAuthCredential)authResult.getCredential()).getAccessToken(). // The OAuth secret can be retrieved by calling: // ((OAuthCredential)authResult.getCredential()).getSecret(). } }) .addOnFailureListener( new OnFailureListener() { @Override public void onFailure(@NonNull Exception e) { // Handle failure. } }); } else { // There's no pending result so you need to start the sign-in flow. // See below. }
সাইন-ইন ফ্লো শুরু করতে,
startActivityForSignInWithProviderকল করুন:Kotlin
firebaseAuth .startActivityForSignInWithProvider(activity, provider.build()) .addOnSuccessListener { // User is signed in. // IdP data available in // authResult.getAdditionalUserInfo().getProfile(). // The OAuth access token can also be retrieved: // ((OAuthCredential)authResult.getCredential()).getAccessToken(). // The OAuth secret can be retrieved by calling: // ((OAuthCredential)authResult.getCredential()).getSecret(). } .addOnFailureListener { // Handle failure. }
Java
firebaseAuth .startActivityForSignInWithProvider(/* activity= */ this, provider.build()) .addOnSuccessListener( new OnSuccessListener<AuthResult>() { @Override public void onSuccess(AuthResult authResult) { // User is signed in. // IdP data available in // authResult.getAdditionalUserInfo().getProfile(). // The OAuth access token can also be retrieved: // ((OAuthCredential)authResult.getCredential()).getAccessToken(). // The OAuth secret can be retrieved by calling: // ((OAuthCredential)authResult.getCredential()).getSecret(). } }) .addOnFailureListener( new OnFailureListener() { @Override public void onFailure(@NonNull Exception e) { // Handle failure. } });
উপরের উদাহরণগুলি সাইন-ইন ফ্লোয়ের উপর ফোকাস করলেও, আপনার কাছে
startActivityForLinkWithProviderব্যবহার করে আগে থেকে থাকা ব্যবহারকারীর সাথে OIDC প্রদানকারীকে লিঙ্ক করার ক্ষমতাও আছে। যেমন, আপনি একই ব্যবহারকারীর সাথে একাধিক পরিষেবা প্রদানকারীকে লিঙ্ক করতে পারেন, যাতে তিনি যেকোনও একটির মাধ্যমে সাইন-ইন করতে পারেন।Kotlin
// The user is already signed-in. val firebaseUser = firebaseAuth.currentUser!! firebaseUser .startActivityForLinkWithProvider(activity, provider.build()) .addOnSuccessListener { // Provider credential is linked to the current user. // IdP data available in // authResult.getAdditionalUserInfo().getProfile(). // The OAuth access token can also be retrieved: // authResult.getCredential().getAccessToken(). // The OAuth secret can be retrieved by calling: // authResult.getCredential().getSecret(). } .addOnFailureListener { // Handle failure. }
Java
// The user is already signed-in. FirebaseUser firebaseUser = firebaseAuth.getCurrentUser(); firebaseUser .startActivityForLinkWithProvider(/* activity= */ this, provider.build()) .addOnSuccessListener( new OnSuccessListener<AuthResult>() { @Override public void onSuccess(AuthResult authResult) { // Provider credential is linked to the current user. // IdP data available in // authResult.getAdditionalUserInfo().getProfile(). // The OAuth access token can also be retrieved: // authResult.getCredential().getAccessToken(). // The OAuth secret can be retrieved by calling: // authResult.getCredential().getSecret(). } }) .addOnFailureListener( new OnFailureListener() { @Override public void onFailure(@NonNull Exception e) { // Handle failure. } });
একই প্যাটার্ন
startActivityForReauthenticateWithProvider-এর সাথে ব্যবহার করা যেতে পারে, যা সংবেদনশীল অপারেশনের জন্য নতুন ক্রেডেনশিয়াল পেতে ব্যবহার করা যেতে পারে যার জন্য সাম্প্রতিক লগ-ইন প্রয়োজন।Kotlin
// The user is already signed-in. val firebaseUser = firebaseAuth.currentUser!! firebaseUser .startActivityForReauthenticateWithProvider(activity, provider.build()) .addOnSuccessListener { // User is re-authenticated with fresh tokens and // should be able to perform sensitive operations // like account deletion and email or password // update. } .addOnFailureListener { // Handle failure. }
Java
// The user is already signed-in. FirebaseUser firebaseUser = firebaseAuth.getCurrentUser(); firebaseUser .startActivityForReauthenticateWithProvider(/* activity= */ this, provider.build()) .addOnSuccessListener( new OnSuccessListener<AuthResult>() { @Override public void onSuccess(AuthResult authResult) { // User is re-authenticated with fresh tokens and // should be able to perform sensitive operations // like account deletion and email or password // update. } }) .addOnFailureListener( new OnFailureListener() { @Override public void onFailure(@NonNull Exception e) { // Handle failure. } });
সাইন-ইন ফ্লো ম্যানুয়ালি ম্যানেজ করা
আপনি যদি ইতিমধ্যেই আপনার অ্যাপে OpenID Connect সাইন-ইন ফ্লো প্রয়োগ করে থাকেন, তাহলে আপনি Firebase-এর সাথে যাচাই করার জন্য সরাসরি ID টোকেন ব্যবহার করতে পারেন:
Kotlin
val providerId = "oidc.example-provider" // As registered in Firebase console. val credential = oAuthCredential(providerId) { setIdToken(idToken) // ID token from OpenID Connect flow. } Firebase.auth .signInWithCredential(credential) .addOnSuccessListener { authResult -> // User is signed in. // IdP data available in: // authResult.additionalUserInfo.profile } .addOnFailureListener { e -> // Handle failure. }
Java
AuthCredential credential = OAuthProvider .newCredentialBuilder("oidc.example-provider") // As registered in Firebase console. .setIdToken(idToken) // ID token from OpenID Connect flow. .build(); FirebaseAuth.getInstance() .signInWithCredential(credential) .addOnSuccessListener(new OnSuccessListener<AuthResult>() { @Override public void onSuccess(AuthResult authResult) { // User is signed in. // IdP data available in: // authResult.getAdditionalUserInfo().getProfile() } }) .addOnFailureListener(new OnFailureListener() { @Override public void onFailure(@NonNull Exception e) { // Handle failure. } });
পরবর্তী ধাপ
কোনও ব্যবহারকারী প্রথমবার সাইন-ইন করার পরে, একটি নতুন ব্যবহারকারীর অ্যাকাউন্ট তৈরি করা হয় এবং ক্রেডেনশিয়ালের সাথে লিঙ্ক করা হয়—অর্থাৎ, ব্যবহারকারীর নাম এবং পাসওয়ার্ড, ফোন নম্বর বা ব্যবহারকারী যে তথ্য দিয়ে সাইন-ইন করেছেন তা প্রদানকারীর তথ্য। এই নতুন অ্যাকাউন্ট আপনার Firebase প্রোজেক্টের অংশ হিসেবে স্টোর করা হয় এবং ব্যবহারকারী কীভাবে সাইন-ইন করেছেন তা নির্বিশেষে, আপনার প্রোজেক্টের প্রতিটি অ্যাপ জুড়ে কোনও ব্যবহারকারীকে শনাক্ত করতে ব্যবহার করা যেতে পারে।
-
আপনার অ্যাপে, আপনি
FirebaseUserঅবজেক্ট থেকে ব্যবহারকারীর প্রাথমিক প্রোফাইল সংক্রান্ত তথ্য পেতে পারেন। ব্যবহারকারীদের ম্যানেজ করা দেখুন। আপনার Firebase Realtime Database এবং Cloud Storage নিরাপত্তা বিধিতে, আপনি
authভেরিয়েবল থেকে সাইন-ইন করা ব্যবহারকারীর অনন্য ব্যবহারকারী আইডি পেতে এবং ব্যবহারকারী কোন ডেটা অ্যাক্সেস করতে পারবেন তা নিয়ন্ত্রণ করতে এটি ব্যবহার করতে পারবেন।
আপনি আগে থেকে থাকা ব্যবহারকারীর অ্যাকাউন্টের সাথে অনুমোদন প্রদানকারীর ক্রেডেনশিয়াল লিঙ্ক করে একাধিক অনুমোদন প্রদানকারীর মাধ্যমে আপনার অ্যাপে সাইন-ইন করার জন্য ব্যবহারকারীদের অনুমতি দিতে পারেন।
কোনও ব্যবহারকারীকে সাইন-আউট করতে,
signOut-এ কল করুন:
Kotlin
Firebase.auth.signOut()
Java
FirebaseAuth.getInstance().signOut();