অ্যান্ড্রয়েডের জন্য লিঙ্ক করা অ্যাকাউন্ট সাইন-ইন

লিঙ্ক করা অ্যাকাউন্ট সাইন-ইন সেই ব্যবহারকারীদের জন্য Google এর সাথে এক ট্যাপ সাইন ইন সক্ষম করে যাদের ইতিমধ্যেই আপনার পরিষেবার সাথে তাদের Google অ্যাকাউন্ট লিঙ্ক করা আছে। এটি ব্যবহারকারীদের জন্য অভিজ্ঞতা উন্নত করে কারণ তারা তাদের ব্যবহারকারীর নাম এবং পাসওয়ার্ড পুনরায় প্রবেশ না করেই এক ক্লিকে সাইন ইন করতে পারে৷ এটি ব্যবহারকারীদের আপনার পরিষেবাতে ডুপ্লিকেট অ্যাকাউন্ট তৈরি করার সম্ভাবনাও হ্রাস করে।

লিঙ্ক করা অ্যাকাউন্ট সাইন-ইন Android-এর জন্য ওয়ান ট্যাপ সাইন-ইন প্রবাহের অংশ হিসেবে উপলব্ধ৷ এর অর্থ হল আপনার অ্যাপে ইতিমধ্যেই ওয়ান ট্যাপ বৈশিষ্ট্য সক্ষম থাকলে আপনাকে আলাদা লাইব্রেরি আমদানি করতে হবে না।

এই নথিতে, আপনি লিঙ্কড অ্যাকাউন্ট সাইন-ইন সমর্থন করার জন্য আপনার Android অ্যাপটি কীভাবে পরিবর্তন করবেন তা শিখবেন।

এটা কিভাবে কাজ করে

  1. আপনি ওয়ান ট্যাপ সাইন-ইন ফ্লো চলাকালীন লিঙ্ক করা অ্যাকাউন্টগুলি দেখানোর জন্য নির্বাচন করেন৷
  2. ব্যবহারকারী যদি Google-এ সাইন ইন করে থাকেন এবং আপনার পরিষেবাতে তাদের অ্যাকাউন্টের সাথে তাদের Google অ্যাকাউন্ট লিঙ্ক করে থাকেন, তাহলে লিঙ্ক করা অ্যাকাউন্টের জন্য একটি আইডি টোকেন ফেরত দেওয়া হবে।
  3. ব্যবহারকারীকে তাদের লিঙ্ক করা অ্যাকাউন্ট দিয়ে আপনার পরিষেবাতে সাইন ইন করার বিকল্প সহ একটি ওয়ান ট্যাপ সাইন-ইন প্রম্পট দেখানো হয়।
  4. ব্যবহারকারী যদি লিঙ্ক করা অ্যাকাউন্টের সাথে চালিয়ে যেতে পছন্দ করে, তাহলে ব্যবহারকারীর আইডি টোকেন আপনার অ্যাপে ফেরত দেওয়া হবে। লগ ইন করা ব্যবহারকারীকে শনাক্ত করার জন্য ধাপ 2-এ আপনার সার্ভারে পাঠানো টোকেনের সাথে আপনি এটি মেলে।

সেটআপ

আপনার উন্নয়ন পরিবেশ সেট আপ করুন

আপনার ডেভেলপমেন্ট হোস্টে লেটেস্ট Google Play পরিষেবা পান:

  1. অ্যান্ড্রয়েড এসডিকে ম্যানেজার খুলুন।
  1. SDK টুলের অধীনে, Google Play পরিষেবাগুলি খুঁজুন।

  2. যদি এই প্যাকেজগুলির জন্য স্ট্যাটাস ইনস্টল করা না থাকে, সেগুলি উভয়ই নির্বাচন করুন এবং প্যাকেজ ইনস্টল করুন ক্লিক করুন।

আপনার অ্যাপ কনফিগার করুন

  1. আপনার প্রজেক্ট-লেভেল build.gradle ফাইলে, আপনার buildscript এবং allprojects উভয় বিভাগেই Google-এর Maven সংগ্রহস্থল অন্তর্ভুক্ত করুন।

    buildscript {
        repositories {
            google()
        }
    }
    
    allprojects {
        repositories {
            google()
        }
    }
    
  2. আপনার মডিউলের অ্যাপ-লেভেল গ্রেডল ফাইলে "Google এর সাথে লিঙ্ক করুন" API-এর নির্ভরতা যোগ করুন, যা সাধারণত app/build.gradle হয় :

    dependencies {
      implementation 'com.google.android.gms:play-services-auth:21.2.0'
    }
    

লিঙ্ক করা অ্যাকাউন্ট সাইন-ইন সমর্থন করতে আপনার অ্যান্ড্রয়েড অ্যাপ পরিবর্তন করুন

লিঙ্ক করা অ্যাকাউন্ট সাইন-ইন ফ্লো শেষে, একটি আইডি টোকেন আপনার অ্যাপে ফেরত দেওয়া হয়। ব্যবহারকারী সাইন ইন করার আগে আইডি টোকেনের অখণ্ডতা যাচাই করা উচিত।

নিম্নলিখিত কোড নমুনাটি পুনরুদ্ধার, আইডি টোকেন যাচাই এবং পরবর্তীতে ব্যবহারকারীকে সাইন ইন করার পদক্ষেপের বিবরণ দেয়।

  1. সাইন-ইন অভিপ্রায়ের ফলাফল পেতে একটি কার্যকলাপ তৈরি করুন

    কোটলিন

      private val activityResultLauncher = registerForActivityResult(
        ActivityResultContracts.StartIntentSenderForResult()) { result ->
        if (result.resultCode == RESULT_OK) {
          try {
            val signInCredentials = Identity.signInClient(this)
                                    .signInCredentialFromIntent(result.data)
            // Review the Verify the integrity of the ID token section for
            // details on how to verify the ID token
            verifyIdToken(signInCredential.googleIdToken)
          } catch (e: ApiException) {
            Log.e(TAG, "Sign-in failed with error code:", e)
          }
        } else {
          Log.e(TAG, "Sign-in failed")
        }
      }
    

    জাভা

      private final ActivityResultLauncher<IntentSenderResult>
        activityResultLauncher = registerForActivityResult(
        new ActivityResultContracts.StartIntentSenderForResult(),
        result -> {
        If (result.getResultCode() == RESULT_OK) {
            try {
              SignInCredential signInCredential = Identity.getSignInClient(this)
                             .getSignInCredentialFromIntent(result.getData());
              verifyIdToken(signInCredential.getGoogleIdToken());
            } catch (e: ApiException ) {
              Log.e(TAG, "Sign-in failed with error:", e)
            }
        } else {
            Log.e(TAG, "Sign-in failed")
        }
    });
    
  2. সাইন ইন অনুরোধ তৈরি করুন

    কোটলিন

    private val tokenRequestOptions =
    GoogleIdTokenRequestOptions.Builder()
      .supported(true)
      // Your server's client ID, not your Android client ID.
      .serverClientId(getString("your-server-client-id")
      .filterByAuthorizedAccounts(true)
      .associateLinkedAccounts("service-id-of-and-defined-by-developer",
                               scopes)
      .build()
    

    জাভা

     private final GoogleIdTokenRequestOptions tokenRequestOptions =
         GoogleIdTokenRequestOptions.Builder()
      .setSupported(true)
      .setServerClientId("your-service-client-id")
      .setFilterByAuthorizedAccounts(true)
      .associateLinkedAccounts("service-id-of-and-defined-by-developer",
                                scopes)
      .build()
    
  3. সাইন-ইন মুলতুবি অভিপ্রায় চালু করুন

    কোটলিন

     Identity.signInClient(this)
        .beginSignIn(
      BeginSignInRequest.Builder()
        .googleIdTokenRequestOptions(tokenRequestOptions)
      .build())
        .addOnSuccessListener{result ->
          activityResultLauncher.launch(result.pendingIntent.intentSender)
      }
      .addOnFailureListener {e ->
        Log.e(TAG, "Sign-in failed because:", e)
      }
    

    জাভা

     Identity.getSignInClient(this)
      .beginSignIn(
        BeginSignInRequest.Builder()
          .setGoogleIdTokenRequestOptions(tokenRequestOptions)
          .build())
      .addOnSuccessListener(result -> {
        activityResultLauncher.launch(
            result.getPendingIntent().getIntentSender());
    })
    .addOnFailureListener(e -> {
      Log.e(TAG, "Sign-in failed because:", e);
    });
    

আইডি টোকেনের অখণ্ডতা যাচাই করুন

টোকেনটি বৈধ কিনা তা যাচাই করতে, নিম্নলিখিত মানদণ্ডগুলি সন্তুষ্ট তা নিশ্চিত করুন:

  • আইডি টোকেনটি Google দ্বারা সঠিকভাবে স্বাক্ষরিত। টোকেনের স্বাক্ষর যাচাই করতে Google-এর সর্বজনীন কী ( JWK বা PEM ফর্ম্যাটে উপলব্ধ) ব্যবহার করুন। এই কীগুলি নিয়মিত ঘোরানো হয়; আপনার কখন সেগুলি আবার পুনরুদ্ধার করা উচিত তা নির্ধারণ করতে প্রতিক্রিয়াতে Cache-Control শিরোনামটি পরীক্ষা করুন।
  • আইডি টোকেনে aud মান আপনার অ্যাপের ক্লায়েন্ট আইডিগুলির একটির সমান। আপনার অ্যাপ্লিকেশানের ব্যাকএন্ড সার্ভারে একই ব্যবহারকারীর ডেটা অ্যাক্সেস করতে ব্যবহৃত কোনও দূষিত অ্যাপে জারি করা আইডি টোকেনগুলি প্রতিরোধ করতে এই চেকটি প্রয়োজনীয়৷
  • ID টোকেনে iss এর মান accounts.google.com বা https://accounts.google.com এর সমান।
  • আইডি টোকেনের exp শেষ হয় নি।
  • আপনি যদি আইডি টোকেনটি Google Workspace বা ক্লাউড সংস্থার অ্যাকাউন্টের প্রতিনিধিত্ব করে তা যাচাই করতে চান, তাহলে আপনি hd দাবিটি পরীক্ষা করতে পারেন, যা ব্যবহারকারীর হোস্ট করা ডোমেন নির্দেশ করে। শুধুমাত্র নির্দিষ্ট ডোমেনের সদস্যদের জন্য একটি সম্পদের অ্যাক্সেস সীমাবদ্ধ করার সময় এটি অবশ্যই ব্যবহার করা উচিত। এই দাবির অনুপস্থিতি নির্দেশ করে যে অ্যাকাউন্টটি Google হোস্ট করা ডোমেনের অন্তর্গত নয়।

email , email_verified এবং hd ক্ষেত্রগুলি ব্যবহার করে, আপনি নির্ধারণ করতে পারেন যে Google হোস্ট করে এবং একটি ইমেল ঠিকানার জন্য অনুমোদিত কিনা। যে ক্ষেত্রে Google কর্তৃত্বপূর্ণ, ব্যবহারকারী বৈধ অ্যাকাউন্টের মালিক হিসাবে পরিচিত, এবং আপনি পাসওয়ার্ড বা অন্যান্য চ্যালেঞ্জ পদ্ধতি এড়িয়ে যেতে পারেন।

যেসব ক্ষেত্রে Google কর্তৃত্বপূর্ণ:

  • email একটি @gmail.com প্রত্যয় রয়েছে, এটি একটি Gmail অ্যাকাউন্ট।
  • email_verified সত্য এবং hd সেট করা আছে, এটি একটি G Suite অ্যাকাউন্ট।

ব্যবহারকারীরা Gmail বা G Suite ব্যবহার না করে Google অ্যাকাউন্টের জন্য নিবন্ধন করতে পারেন। যখন email @gmail.com প্রত্যয় থাকে না এবং hd অনুপস্থিত থাকে, তখন Google অনুমোদিত নয় এবং ব্যবহারকারীকে যাচাই করার জন্য পাসওয়ার্ড বা অন্যান্য চ্যালেঞ্জ পদ্ধতি সুপারিশ করা হয়। email_verified ও সত্য হতে পারে কারণ Google প্রাথমিকভাবে ব্যবহারকারীকে যাচাই করেছিল যখন Google অ্যাকাউন্ট তৈরি হয়েছিল, তবে তৃতীয় পক্ষের ইমেল অ্যাকাউন্টের মালিকানা তখন থেকে পরিবর্তিত হতে পারে।

এই যাচাইকরণ পদক্ষেপগুলি সম্পাদন করার জন্য আপনার নিজের কোড লেখার পরিবর্তে, আমরা দৃঢ়ভাবে আপনার প্ল্যাটফর্মের জন্য একটি Google API ক্লায়েন্ট লাইব্রেরি বা একটি সাধারণ-উদ্দেশ্য JWT লাইব্রেরি ব্যবহার করার পরামর্শ দিই। ডেভেলপমেন্ট এবং ডিবাগিংয়ের জন্য, আপনি আমাদের tokeninfo যাচাইকরণ শেষ পয়েন্টে কল করতে পারেন।

একটি Google API ক্লায়েন্ট লাইব্রেরি ব্যবহার করুন

জাভা গুগল এপিআই ক্লায়েন্ট লাইব্রেরি ব্যবহার করা একটি প্রোডাকশন পরিবেশে Google আইডি টোকেন যাচাই করার প্রস্তাবিত উপায়।

জাভা

  import com.google.api.client.googleapis.auth.oauth2.GoogleIdToken;
  import com.google.api.client.googleapis.auth.oauth2.GoogleIdToken.Payload;
  import com.google.api.client.googleapis.auth.oauth2.GoogleIdTokenVerifier;

  ...

  GoogleIdTokenVerifier verifier = new GoogleIdTokenVerifier.Builder(transport, jsonFactory)
      // Specify the CLIENT_ID of the app that accesses the backend:
      .setAudience(Collections.singletonList(CLIENT_ID))
      // Or, if multiple clients access the backend:
      //.setAudience(Arrays.asList(CLIENT_ID_1, CLIENT_ID_2, CLIENT_ID_3))
      .build();

  // (Receive idTokenString by HTTPS POST)

  GoogleIdToken idToken = verifier.verify(idTokenString);
  if (idToken != null) {
    Payload payload = idToken.getPayload();

    // Print user identifier
    String userId = payload.getSubject();
    System.out.println("User ID: " + userId);

    // Get profile information from payload
    String email = payload.getEmail();
    boolean emailVerified = Boolean.valueOf(payload.getEmailVerified());
    String name = (String) payload.get("name");
    String pictureUrl = (String) payload.get("picture");
    String locale = (String) payload.get("locale");
    String familyName = (String) payload.get("family_name");
    String givenName = (String) payload.get("given_name");

    // Use or store profile information
    // ...

  } else {
    System.out.println("Invalid ID token.");
  }

GoogleIdTokenVerifier.verify() পদ্ধতি JWT স্বাক্ষর, aud দাবি, iss দাবি এবং তাদের exp দাবি যাচাই করে।

আপনি যদি আইডি টোকেনটি Google Workspace বা ক্লাউড সংস্থার অ্যাকাউন্টের প্রতিনিধিত্ব করে তা যাচাই করতে চান, তাহলে আপনি Payload.getHostedDomain() পদ্ধতিতে ফেরত দেওয়া ডোমেন নাম চেক করে hd দাবিটি যাচাই করতে পারেন।

টোকেনইনফো এন্ডপয়েন্টে কল করা হচ্ছে

ডিবাগিংয়ের জন্য একটি আইডি টোকেন স্বাক্ষর যাচাই করার একটি সহজ উপায় হল tokeninfo এন্ডপয়েন্ট ব্যবহার করা। এই এন্ডপয়েন্টে কল করার সাথে একটি অতিরিক্ত নেটওয়ার্ক অনুরোধ অন্তর্ভুক্ত থাকে যা আপনার নিজের কোডে যথাযথ বৈধতা এবং পেলোড নিষ্কাশন পরীক্ষা করার সময় আপনার জন্য বেশিরভাগ বৈধতা দেয়। এটি প্রোডাকশন কোডে ব্যবহারের জন্য উপযুক্ত নয় কারণ অনুরোধগুলি থ্রোটল হতে পারে বা অন্যথায় মাঝে মাঝে ত্রুটির বিষয় হতে পারে।

tokeninfo এন্ডপয়েন্ট ব্যবহার করে একটি আইডি টোকেন যাচাই করতে, একটি HTTPS পোস্ট করুন বা এন্ডপয়েন্টে GET অনুরোধ করুন এবং id_token প্যারামিটারে আপনার আইডি টোকেন পাস করুন। উদাহরণস্বরূপ, টোকেন "XYZ123" যাচাই করতে, নিম্নলিখিত GET অনুরোধ করুন:

https://oauth2.googleapis.com/tokeninfo?id_token=XYZ123

যদি টোকেনটি সঠিকভাবে স্বাক্ষরিত হয় এবং iss এবং exp দাবির প্রত্যাশিত মান থাকে, তাহলে আপনি একটি HTTP 200 প্রতিক্রিয়া পাবেন, যেখানে মূল অংশে JSON- ফরম্যাটেড আইডি টোকেন দাবিগুলি রয়েছে৷ এখানে একটি উদাহরণ প্রতিক্রিয়া:

{
 // These six fields are included in all Google ID Tokens.
 "iss": "https://accounts.google.com",
 "sub": "110169484474386276334",
 "azp": "1008719970978-hb24n2dstb40o45d4feuo2ukqmcc6381.apps.googleusercontent.com",
 "aud": "1008719970978-hb24n2dstb40o45d4feuo2ukqmcc6381.apps.googleusercontent.com",
 "iat": "1433978353",
 "exp": "1433981953",

 // These seven fields are only included when the user has granted the "profile" and
 // "email" OAuth scopes to the application.
 "email": "testuser@gmail.com",
 "email_verified": "true",
 "name" : "Test User",
 "picture": "https://lh4.googleusercontent.com/-kYgzyAWpZzJ/ABCDEFGHI/AAAJKLMNOP/tIXL9Ir44LE/s99-c/photo.jpg",
 "given_name": "Test",
 "family_name": "User",
 "locale": "en"
}

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