Android-এ Microsoft ব্যবহার করে যাচাই করা

এন্ড-টু-এন্ড সাইন-ইন ফ্লো সম্পূর্ণ করতে, Firebase SDK ব্যবহার করে আপনার অ্যাপে ওয়েব-ভিত্তিক জেনেরিক OAuth লগ-ইন ইন্টিগ্রেট করে, আপনি Microsoft Azure Active Directory-র মতো OAuth প্রদানকারীর মাধ্যমে Firebase-এর সাথে আপনার ব্যবহারকারীদের যাচাই করিয়ে নিতে পারবেন।

শুরু করার আগে

Microsoft অ্যাকাউন্ট (Azure Active Directory ও ব্যক্তিগত Microsoft অ্যাকাউন্ট) ব্যবহার করে ব্যবহারকারীদের সাইন-ইন করতে দিতে, আপনাকে প্রথমে Firebase প্রোজেক্টের জন্য Microsoft-কে সাইন-ইন পরিষেবা প্রদানকারী হিসেবে চালু করতে হবে:

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

  2. Firebase কনসোলে গিয়ে নিরাপত্তা > যাচাইকরণ বিকল্পে যান।
  3. সাইন-ইন পদ্ধতি ট্যাবে, Microsoft সাইন-ইন প্রদানকারীকে চালু করুন।
  4. প্রোভাইডার কনফিগারেশনে সেই প্রোভাইডারের ডেভেলপার কনসোল থেকে ক্লায়েন্ট আইডি ও ক্লায়েন্ট সিক্রেট যোগ করুন:
    1. Microsoft OAuth ক্লায়েন্ট রেজিস্টার করতে, দ্রুত শুরু: Azure Active Directory v2.0 এন্ডপয়েন্টের সাথে অ্যাপ রেজিস্টার করুন লিঙ্কে দেওয়া নির্দেশাবলী অনুসরণ করুন। মনে রাখবেন, এই এন্ডপয়েন্ট Microsoft ব্যক্তিগত অ্যাকাউন্ট এবং Azure Active Directory অ্যাকাউন্ট ব্যবহার করে সাইন-ইন করার সুবিধা দেয়। Azure Active Directory v2.0 সম্পর্কে আরও জানুন।
    2. এইসব পরিষেবা প্রদানকারীর সাথে অ্যাপ রেজিস্টার করার সময়, আপনার অ্যাপের জন্য রিডাইরেক্ট ডোমেন হিসেবে আপনার প্রোজেক্টের জন্য *.firebaseapp.com ডোমেন রেজিস্টার করতে ভুলবেন না।
  5. সেভ করুন বিকল্পে ক্লিক করুন।
  6. আপনি আগে থেকে না করে থাকলে, আপনার অ্যাপের SHA-1 ফিঙ্গারপ্রিন্ট নির্দিষ্ট করুন।

    1. Firebase কনসোলে, সেটিংস > সাধারণ ট্যাব বিকল্পে যান।

    2. নিচের দিকে স্ক্রল করে আপনার অ্যাপ কার্ডে যান, আপনার Android অ্যাপ বেছে নিন এবং SHA সার্টিফিকেট ফিঙ্গারপ্রিন্ট ফিল্ডে আপনার SHA-1 ফিঙ্গারপ্রিন্ট যোগ করুন।

    আপনার অ্যাপের SHA ফিঙ্গারপ্রিন্ট কীভাবে পাবেন সেই বিষয়ে বিস্তারিত জানতে, আপনার ক্লায়েন্টকে যাচাই করা লিঙ্কে যান।

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

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

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

  1. OAuthProvider-এর একটি ইনস্ট্যান্স তৈরি করতে, এর Builder-এর সাথে প্রোভাইডার আইডি microsoft.com ব্যবহার করুন।

    Kotlin

    val provider = OAuthProvider.newBuilder("microsoft.ctivity.kt

    Java

    OAuthProvider.Builder provider = OAuthProvider.newBuilder("microsoft.civity.java

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

    Kotlin

    // Target specific email with login hint.
    // Force re-consent.
    provider.addCustomParameter("prompt", "consent")
    
    // Target specific email with login hint.
    provider.addCustomParameter("login_hint", &qicrosoft.com")GenericIdpActivity.kt

    Java

    // Target specific email with login hint.
    // Force re-consent.
    provider.addCustomParameter("prompt", "consent");
    
    // Target specific email with login hint.
    provider.addCustomParameter("login_hint", &quosoft.com");GenericIdpActivity.java

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

    কোনও নির্দিষ্ট Azure AD টেন্যান্টের ব্যবহারকারীদের শুধুমাত্র অ্যাপ্লিকেশনে সাইন-ইন করার অনুমতি দিতে, Azure AD টেন্যান্টের বন্ধুত্বপূর্ণ ডোমেন নাম বা টেন্যান্টের GUID শনাক্তকারী ব্যবহার করা যেতে পারে। কাস্টম প্যারামিটার অবজেক্টে "টেন্যান্ট" ফিল্ড উল্লেখ করে এটি করা যেতে পারে।

    Kotlin

    // Optional "tenant" parameter in case you are using an Azure AD tenant.
    // eg. '8eaef023-2b34-4da1-9baa-8bc8c9d6a490' or 'contoso.onmicrosoft.com'
    // or "common" for tenant-independent tokens.
    // The default value is "common".
    prover("tenant", "TENANT_ID")GenericIdpActivity.kt

    Java

    // Optional "tenant" parameter in case you are using an Azure AD tenant.
    // eg. '8eaef023-2b34-4da1-9baa-8bc8c9d6a490' or 'contoso.onmicrosoft.com'
    // or "common" for tenant-independent tokens.
    // The default value is "common".
    provi"tenant", "TENANT_ID");GenericIdpActivity.java

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

    Kotlin

    // Request read access to a user's email addresses.
    // This must be preconfigured in the app's API permissions.
    provider.scopes = listOf("mail.read",")GenericIdpActivity.kt

    Java

    // Request read access to a user's email addresses.
    // This must be preconfigured in the app's API permissio<ns.
    Li>stString scopes =
            new A<rrayLi>stString() {
                {
                    add("mail.read");
                    add("calendars.read");
                }
            };pes);GenericIdpActivity.java

    আরও জানতে, Microsoft-এর অনুমতি ও সম্মতি সংক্রান্ত ডকুমেন্টেশন দেখুন।

  4. 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 ivity.kt

    Java

    Task<AuthResult> pendingResultTask = firebaseAuth.getPendingAuthResult();
    if (pendingResultTask != null) {
        // There's something already here! Finish the sign-in for your user.
        pendingResultTask
                .addOnSuccessListener(
                        new OnSuccessList<enerAuthRe>sult() {
                            @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 ity.java

    সাইন-ইন ফ্লো শুরু করতে, 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.
                        }
                    });

    সফলভাবে সম্পূর্ণ হলে, প্রদানকারীর সাথে যুক্ত OAuth অ্যাক্সেস টোকেন ফেরত আসা OAuthCredential অবজেক্ট থেকে পাওয়া যেতে পারে।

    OAuth অ্যাক্সেস টোকেন ব্যবহার করে, আপনি Microsoft Graph API কল করতে পারবেন।

    Firebase Auth-এর সাথে কাজ করে এমন অন্যান্য পরিষেবা প্রদানকারীর মতো, Microsoft কোনও ফটো URL প্রদান করে না এবং পরিবর্তে, প্রোফাইল ফটোর বাইনারি ডেটা Microsoft Graph API-এর মাধ্যমে অনুরোধ করতে হবে।

    OAuth অ্যাক্সেস টোকেন ছাড়াও, ব্যবহারকারীর OAuth ID টোকেন OAuthCredential অবজেক্ট থেকে পাওয়া যেতে পারে। ID টোকেনে থাকা sub দাবিটি অ্যাপ-নির্দিষ্ট এবং এটি Firebase Auth-এর ব্যবহার করা ফেডারেশন করা ব্যবহারকারীর শনাক্তকারীর সাথে মিলবে না এবং এটি user.getProviderData().get(0).getUid()-এর মাধ্যমে অ্যাক্সেস করা যাবে। এর পরিবর্তে oid দাবি ফিল্ড ব্যবহার করা উচিত। সাইন-ইন করার জন্য Azure AD টেন্যান্ট ব্যবহার করার সময়, oid দাবিটি হুবহু মিলবে। তবে, নন-টেন্যান্টের ক্ষেত্রে, oid ফিল্ড প্যাড করা হয়। ফেডারেটেড আইডি 4b2eabcdefghijkl-এর জন্য, oid-এর একটি ফর্ম 00000000-0000-0000-4b2e-abcdefghijkl থাকবে।

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

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

  6. একই প্যাটার্ন 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.
                        }
                    });

পরবর্তী ধাপ

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

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

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

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

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

Kotlin

Firebase.auth.signOut()

Java

FirebaseAuth.getInstance().signOut();