অ্যান্ড্রয়েডে ওপেনআইডি সংযোগ ব্যবহার করে প্রমাণীকরণ করুন

আপনি যদি Firebase Authentication with Identity Platform আপগ্রেড করে থাকেন, তাহলে আপনি আপনার পছন্দের OpenID Connect (OIDC) অনুগত প্রদানকারী ব্যবহার করে 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. আপনার Android প্রকল্পে Firebase যোগ করুন

  2. আপনি যদি Firebase Authentication with Identity Platform আপগ্রেড না করে থাকেন তবে তা করুন৷ OpenID Connect প্রমাণীকরণ শুধুমাত্র আপগ্রেড করা প্রকল্পগুলিতে উপলব্ধ।

  3. Firebase কনসোলের সাইন-ইন প্রদানকারী পৃষ্ঠায়, নতুন প্রদানকারী যোগ করুন-এ ক্লিক করুন এবং তারপর OpenID Connect-এ ক্লিক করুন।

  4. আপনি অনুমোদন কোড প্রবাহ বা অন্তর্নিহিত অনুদান প্রবাহ ব্যবহার করবেন কিনা তা নির্বাচন করুন৷

    যদি আপনার প্রদানকারী এটি সমর্থন করে তবে আপনার সর্বদা কোড প্রবাহ ব্যবহার করা উচিত । অন্তর্নিহিত প্রবাহ কম নিরাপদ এবং এটি ব্যবহার করা দৃঢ়ভাবে নিরুৎসাহিত করা হয়।

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

  6. আপনার ক্লায়েন্ট আইডি এবং ক্লায়েন্ট সিক্রেট এবং আপনার প্রদানকারীর ইস্যুকারী স্ট্রিং উল্লেখ করুন। এই মানগুলি অবশ্যই আপনার প্রদানকারীর দ্বারা নির্ধারিত মানগুলির সাথে হুবহু মেলে৷

  7. আপনার পরিবর্তন সংরক্ষণ করুন.

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

আপনি যদি একটি Android অ্যাপ তৈরি করেন, তাহলে আপনার OIDC প্রদানকারী ব্যবহার করে Firebase-এর মাধ্যমে আপনার ব্যবহারকারীদের প্রমাণীকরণ করার সবচেয়ে সহজ উপায় হল Firebase Android SDK-এর মাধ্যমে সম্পূর্ণ সাইন-ইন প্রবাহ পরিচালনা করা।

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

  1. একটি OAuthProvider এর বিল্ডার ব্যবহার করে প্রদানকারীর ID সহ একটি উদাহরণ তৈরি করুন৷

    Kotlin+KTX

    val providerBuilder = OAuthProvider.newBuilder("oidc.example-provider")

    Java

    OAuthProvider.Builder providerBuilder = OAuthProvider.newBuilder("oidc.example-provider");

  2. ঐচ্ছিক : অতিরিক্ত কাস্টম OAuth প্যারামিটার নির্দিষ্ট করুন যা আপনি OAuth অনুরোধের সাথে পাঠাতে চান।

    Kotlin+KTX

    // 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 প্রদানকারীর সাথে তাদের সমর্থন করা পরামিতিগুলির জন্য চেক করুন। মনে রাখবেন যে আপনি setCustomParameters() দিয়ে Firebase-প্রয়োজনীয় প্যারামিটার পাস করতে পারবেন না। এই প্যারামিটারগুলি হল client_id , response_type , redirect_uri , state , scope এবং response_mode

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

    Kotlin+KTX

    // 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 প্রদানকারীর সাথে তাদের ব্যবহার করা সুযোগের জন্য চেক করুন।

  4. OAuth প্রদানকারী অবজেক্ট ব্যবহার করে Firebase দিয়ে প্রমাণীকরণ করুন। মনে রাখবেন যে অন্যান্য FirebaseAuth ক্রিয়াকলাপগুলির বিপরীতে, এটি একটি কাস্টম Chrome ট্যাব পপ আপ করে আপনার UI নিয়ন্ত্রণ করবে৷ ফলস্বরূপ, OnSuccessListener এবং OnFailureListener এ আপনার অ্যাক্টিভিটি উল্লেখ করবেন না যেগুলি আপনি সংযুক্ত করেছেন কারণ অপারেশনটি UI শুরু হলে তারা অবিলম্বে বিচ্ছিন্ন হয়ে যাবে।

    আপনি ইতিমধ্যে একটি প্রতিক্রিয়া পেয়েছেন কিনা তা আগে পরীক্ষা করা উচিত. এই পদ্ধতিতে সাইন ইন করা আপনার কার্যকলাপকে ব্যাকগ্রাউন্ডে রাখে, যার মানে সাইন ইন ফ্লো চলাকালীন সিস্টেম দ্বারা এটি পুনরুদ্ধার করা যেতে পারে। যদি এটি ঘটে তবে আপনি ব্যবহারকারীকে আবার চেষ্টা করতে বাধ্য করবেন না তা নিশ্চিত করার জন্য, আপনার ফলাফল ইতিমধ্যে উপস্থিত আছে কিনা তা পরীক্ষা করা উচিত।

    একটি মুলতুবি ফলাফল আছে কিনা তা পরীক্ষা করতে, getPendingAuthResult কল করুন:

    Kotlin+KTX

    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+KTX

    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.
                        }
                    });

  5. যদিও উপরের উদাহরণগুলি সাইন-ইন প্রবাহের উপর ফোকাস করে, আপনার কাছে startActivityForLinkWithProvider ব্যবহার করে একটি OIDC প্রদানকারীকে বিদ্যমান ব্যবহারকারীর সাথে লিঙ্ক করার ক্ষমতাও রয়েছে। উদাহরণস্বরূপ, আপনি একই ব্যবহারকারীর সাথে একাধিক প্রদানকারীকে লিঙ্ক করতে পারেন যাতে তাদের উভয়ের সাথে সাইন ইন করতে পারেন৷

    Kotlin+KTX

    // 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.
                        }
                    });

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

    Kotlin+KTX

    // 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-এর সাথে প্রমাণীকরণের জন্য আপনি আইডি টোকেনটি সরাসরি ব্যবহার করতে পারেন:

Kotlin+KTX

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.
            }
        });

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

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

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

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

আপনি একটি বিদ্যমান ব্যবহারকারীর অ্যাকাউন্টে প্রমাণীকরণ প্রদানকারীর শংসাপত্র লিঙ্ক করে একাধিক প্রমাণীকরণ প্রদানকারী ব্যবহার করে ব্যবহারকারীদের আপনার অ্যাপে সাইন ইন করার অনুমতি দিতে পারেন।

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

Kotlin+KTX

Firebase.auth.signOut()

Java

FirebaseAuth.getInstance().signOut();