লুপব্যাক IP অ্যাড্রেস ফ্লো মাইগ্রেশন গাইড

এক নজরে

১৬ ফেব্রুয়ারি ২০২২-এ, আমরা আরও সুরক্ষিত OAuth ফ্লো ব্যবহার করে Google OAuth ইন্টার‍্যাকশন আরও নিরাপদ করার পরিকল্পনা ঘোষণা করেছি। এই নির্দেশিকা আপনাকে লুপব্যাক IP অ্যাড্রেস ফ্লো থেকে সমর্থিত বিকল্পে সফলভাবে মাইগ্রেট করার জন্য প্রয়োজনীয় পরিবর্তন এবং পদক্ষেপগুলি বুঝতে সাহায্য করে।

Google-এর OAuth 2.0 অনুমোদন এন্ডপয়েন্টের সাথে ইন্টার‍্যাক্ট করার সময় ফিশিং ও অ্যাপের ছদ্মবেশে আক্রমণ থেকে রক্ষা করার জন্য এই পদক্ষেপ নেওয়া হয়েছে।

লুপব্যাক IP অ্যাড্রেস ফ্লো কী?

লুপব্যাক IP অ্যাড্রেস ফ্লো রিডাইরেক্ট URI-এর হোস্ট কম্পোনেন্ট হিসেবে লুপব্যাক IP অ্যাড্রেস বা localhost-এর ব্যবহার সমর্থন করে যেখানে কোনও ব্যবহারকারী OAuth সম্মতি অনুরোধ অনুমোদন করার পরে ক্রেডেনশিয়াল পাঠানো হয়। এই ফ্লো ম্যান ইন দ্য মিডল অ্যাটাকের ক্ষেত্রে অসুরক্ষিত, যেখানে কিছু অপারেটিং সিস্টেমে একই লুপব্যাক ইন্টারফেস অ্যাক্সেস করে কোনও ক্ষতিকর অ্যাপ, প্রদত্ত রিডাইরেক্ট URI-তে অথরাইজেশন সার্ভার থেকে আসা রেসপন্স ইন্টারসেপ্ট করতে এবং অথরাইজেশন কোডে অ্যাক্সেস পেতে পারে।

iOS, Android এবং Chrome OAuth অ্যাপ্লিকেশন ধরনের জন্য লুপব্যাক IP অ্যাড্রেস ফ্লো বন্ধ করা হচ্ছে, তবে ডেস্কটপ অ্যাপে এটি কাজ করা চালিয়ে যাবে।

সম্মতি সংক্রান্ত গুরুত্বপূর্ণ তারিখ

  • ১৪ মার্চ, ২০২২ - নতুন OAuth ক্লায়েন্টদের লুপব্যাক IP অ্যাড্রেস ফ্লো ব্যবহার করা থেকে ব্লক করা হয়েছে
  • ১ আগস্ট, ২০২২ - নীতি মেনে চলে না এমন OAuth অনুরোধের ক্ষেত্রে ব্যবহারকারীকে সতর্কতা মেসেজ দেখানো হতে পারে
  • ৩১ আগস্ট, ২০২২ - ১৪ মার্চ, ২০২২-এর আগে তৈরি করা Android, Chrome অ্যাপ এবং iOS OAuth ক্লায়েন্টের জন্য লুপব্যাক IP অ্যাড্রেস ফ্লো ব্লক করা হয়েছে
  • ২১ অক্টোবর, ২০২২ - আগে থেকে থাকা সব ক্লায়েন্টকে ব্লক করা হয়েছে (ছাড়প্রাপ্ত ক্লায়েন্ট সহ)

নীতি মেনে চলে না এমন অনুরোধের ক্ষেত্রে ব্যবহারকারী নিজে ইন্টার‌্যাক্ট করতে পারেন এমন ত্রুটি মেসেজ দেখানো হবে। এই মেসেজ ব্যবহারকারীদের জানাবে যে অ্যাপটি ব্লক করা হয়েছে এবং একই সাথে সহায়তা ইমেল দেখাবে যা আপনি Google Cloud কনসোলে OAuth সম্মতি স্ক্রিনে রেজিস্টার করেছেন।

মাইগ্রেশন প্রসেস সম্পূর্ণ করার জন্য দুটি প্রধান ধাপ রয়েছে:

  1. আপনি প্রভাবিত হয়েছেন কিনা তা নির্ধারণ করুন।
  2. আপনি প্রভাবিত হলে, কাজ করে এমন কোনও বিকল্পে মাইগ্রেট করুন।

আপনি প্রভাবিত হয়েছেন কিনা তা নির্ধারণ করুন

আপনার OAuth অ্যাপ্লিকেশনের ধরন পর্যালোচনা করুন

Google Cloud Console-এর ক্লায়েন্ট পৃষ্ঠায় নেভিগেট করুন এবং OAuth 2.0 ক্লায়েন্ট আইডি বিভাগের অধীনে আপনার OAuth অ্যাপ্লিকেশনের ধরন দেখুন। এটি নিম্নলিখিত যেকোনও একটি হবে: ওয়েব অ্যাপ্লিকেশন, Android, iOS, Universal Windows Platform (UWP), Chrome অ্যাপ, TV ও সীমিত ইনপুট ডিভাইস, ডেস্কটপ অ্যাপ।

আপনার অ্যাপ্লিকেশন টাইপ Android, Chrome অ্যাপ বা iOS হলে এবং আপনি লুপব্যাক IP অ্যাড্রেস ফ্লো ব্যবহার করলে, পরবর্তী ধাপে যান।

আপনি যদি ডেস্কটপ অ্যাপ OAuth ক্লায়েন্টে লুপব্যাক IP অ্যাড্রেস ফ্লো ব্যবহার করেন, তাহলে এই বন্ধ হয়ে যাওয়া সংক্রান্ত কোনও কিছু করার প্রয়োজন নেই, কারণ সেই OAuth অ্যাপ্লিকেশন টাইপের সাথে ব্যবহার করা চালিয়ে যাওয়ার জন্য সহায়তা করা হবে।

আপনার অ্যাপ লুপব্যাক IP অ্যাড্রেস ফ্লো ব্যবহার করছে কিনা তা কীভাবে নির্ধারণ করবেন

আপনার অ্যাপের করা Google OAuth অনুমোদনের অনুরোধ লুপব্যাক রিডাইরেক্ট URI ভ্যালু ব্যবহার করছে কিনা তা নির্ধারণ করতে আপনার অ্যাপ কোড বা আউটগোয়িং নেটওয়ার্ক কল (আপনার অ্যাপ OAuth লাইব্রেরি ব্যবহার করলে) পরীক্ষা করুন।

আপনার অ্যাপ্লিকেশন কোড পরীক্ষা করা

আপনার অ্যাপ্লিকেশন কোডের সেই অংশটি পর্যালোচনা করুন যেখানে আপনি Google OAuth অনুমোদন এন্ডপয়েন্ট-এ কল করছেন এবং নির্ধারণ করুন যে redirect_uri প্যারামিটারে নিম্নলিখিত মানগুলির মধ্যে কোনওটি আছে কিনা:

  • redirect_uri=http://127.0.0.1:<port> (যেমন, redirect_uri=http://127.0.0.1:3000)
  • redirect_uri=http://[::1]:<port> (যেমন, redirect_uri=http://[::1]:3000)
  • redirect_uri=http://localhost:<port> (যেমন, redirect_uri=http://localhost:3000)

স্যাম্পেল লুপব্যাক IP অ্যাড্রেস রিডাইরেক্ট ফ্লো অনুরোধ নিম্নলিখিতটির মতো দেখতে হয়:

https://accounts.google.com/o/oauth2/v2/auth?
redirect_uri=http://localhost:3000&
response_type=code&
scope=<SCOPES>&
state=<STATE>&
client_id=<CLIENT_ID>

আউটগোয়িং নেটওয়ার্ক কল পরীক্ষা করুন

আপনার অ্যাপ্লিকেশনের ধরনের উপর নির্ভর করে নেটওয়ার্ক কল পরীক্ষা করার পদ্ধতি আলাদা হবে।

নেটওয়ার্ক কল পরীক্ষা করার সময়, Google OAuth অনুমোদন এন্ডপয়েন্টে পাঠানো অনুরোধগুলি দেখুন এবং redirect_uri প্যারামিটারে নিম্নলিখিত কোনও ভ্যালু আছে কিনা তা নির্ধারণ করুন:

  • redirect_uri=http://127.0.0.1:<port> (যেমন, redirect_uri=http://127.0.0.1:3000)
  • redirect_uri=http://[::1]:<port> (যেমন, redirect_uri=http://[::1]:3000)
  • redirect_uri=http://localhost:<port> (যেমন, redirect_uri=http://localhost:3000)

স্যাম্পেল লুপব্যাক IP অ্যাড্রেস রিডাইরেক্ট ফ্লো অনুরোধ নিম্নলিখিতটির মতো দেখতে হয়:

https://accounts.google.com/o/oauth2/v2/auth?
redirect_uri=http://localhost:3000&
response_type=code&
scope=<SCOPES>&
state=<STATE>&
client_id=<CLIENT_ID>

কাজ করে এমন বিকল্পে মাইগ্রেট করা

মোবাইল ক্লায়েন্ট (Android ও iOS)

আপনি যদি দেখেন যে আপনার অ্যাপ Android বা iOS OAuth অ্যাপ্লিকেশন টাইপের সাথে লুপব্যাক IP অ্যাড্রেস ফ্লো ব্যবহার করছে, তাহলে আপনার উচিত সাজেস্ট করা SDK (Android, iOS) ব্যবহার করা শুরু করা।

SDK আপনাকে Google API অ্যাক্সেস করতে সাহায্য করে এবং Google-এর OAuth 2.0 অনুমোদনের এন্ডপয়েন্টে করা সব কল ম্যানেজ করে।

নিম্নলিখিত ডকুমেন্টেশন লিঙ্ক থেকে আপনি জানতে পারবেন যে কীভাবে লুপব্যাক IP অ্যাড্রেস রিডাইরেক্ট URI ব্যবহার না করে Google API অ্যাক্সেস করার জন্য সাজেস্ট করা SDK ব্যবহার করতে হয়।

Android-এ Google API অ্যাক্সেস করা

ক্লায়েন্ট-সাইড অ্যাক্সেস

নিম্নলিখিত উদাহরণে দেখানো হয়েছে যে কীভাবে সাজেস্ট করা Google Identity Services Android লাইব্রেরি ব্যবহার করে Android-এ ক্লায়েন্ট সাইডে Google API অ্যাক্সেস করতে হয়।

List<Scopes> requestedScopes = Arrays.asList(DriveScopes.DRIVE_APPDATA);
AuthorizationRequest authorizationRequest =
    AuthorizationRequest.builder()
        .setRequestedScopes(requestedScopes)
        .build();
Identity.getAuthorizationClient(activity)
    .authorize(authorizationRequest)
    .addOnSuccessListener(
        authorizationResult -> {
          if (authorizationResult.hasResolution()) {
            // Access needs to be granted by the user
            PendingIntent pendingIntent =
                authorizationResult.getPendingIntent();
            try {
              startIntentSenderForResult(
                  pendingIntent.getIntentSender(),
                  REQUEST_AUTHORIZE, null, 0, 0, 0, null);
            } catch (IntentSender.SendIntentException e) {
              Log.e(
                  TAG,
                  "Couldn't start Authorization UI: "
                      + e.getLocalizedMessage());
            }
          } else {
            // Access already granted, continue with user action
            saveToDriveAppFolder(authorizationResult);
          }
        })
    .addOnFailureListener(e -> Log.e(TAG, "Failed to authorize", e));

ব্যবহারকারীর ড্রাইভ ফোল্ডারে কন্টেন্ট সেভ করার জন্য আপনার নির্ধারিত পদ্ধতিতে authorizationResult পাস করুন। authorizationResult-এ getAccessToken() পদ্ধতি আছে যা অ্যাক্সেস টোকেন ফেরত দেয়।

সার্ভার-সাইড (অফলাইন) অ্যাক্সেস

Android-এ সার্ভার সাইডে Google API কীভাবে অ্যাক্সেস করতে হয় তা নিম্নলিখিত উদাহরণে দেখানো হয়েছে।

List<Scopes> requestedScopes = Arrays.asList(DriveScopes.DRIVE_APPDATA);
AuthorizationRequest authorizationRequest =
    AuthorizationRequest.builder()
        .requestOfflineAccess(webClientId)
        .setRequestedScopes(requestedScopes)
        .build();
Identity.getAuthorizationClient(activity)
    .authorize(authorizationRequest)
    .addOnSuccessListener(
        authorizationResult -> {
          if (authorizationResult.hasResolution()) {
            // Access needs to be granted by the user
            PendingIntent pendingIntent =
                authorizationResult.getPendingIntent();
            try {
              startIntentSenderForResult(
                  pendingIntent.getIntentSender(),
                  REQUEST_AUTHORIZE, null, 0, 0, 0, null);
            } catch (IntentSender.SendIntentException e) {
              Log.e(
                  TAG,
                  "Couldn't start Authorization UI: "
                      + e.getLocalizedMessage());
            }
          } else {
            String authCode =
                authorizationResult.getServerAuthCode();
          }
        })
    .addOnFailureListener(e -> Log.e(TAG, "Failed to authorize", e));

authorizationResult-এ getServerAuthCode() পদ্ধতি আছে যা অথরাইজেশন কোড রিটার্ন করে, অ্যাক্সেস ও রিফ্রেশ টোকেন পেতে আপনি এটি আপনার ব্যাকএন্ডে পাঠাতে পারেন।

iOS অ্যাপে Google API অ্যাক্সেস করা

ক্লায়েন্ট-সাইড অ্যাক্সেস

নিচের উদাহরণে দেখানো হয়েছে যে কীভাবে iOS-এ ক্লায়েন্ট সাইডে Google API অ্যাক্সেস করতে হয়।

user.authentication.do { authentication, error in
  guard error == nil else { return }
  guard let authentication = authentication else { return }
  
  // Get the access token to attach it to a REST or gRPC request.
  let accessToken = authentication.accessToken
  
  // Or, get an object that conforms to GTMFetcherAuthorizationProtocol for
  // use with GTMAppAuth and the Google APIs client library.
  let authorizer = authentication.fetcherAuthorizer()
}

API কল করার জন্য অ্যাক্সেস টোকেন ব্যবহার করুন, REST বা gRPC অনুরোধের হেডারে অ্যাক্সেস টোকেন অন্তর্ভুক্ত করে (Authorization: Bearer <var>ACCESS_TOKEN</var>), অথবা Google APIs client library for Objective-C for REST-এর সাথে ফেচার অথরাইজার (GTMFetcherAuthorizationProtocol) ব্যবহার করে।

ক্লায়েন্টের দিক থেকে কীভাবে Google API অ্যাক্সেস করবেন সেই বিষয়ে ক্লায়েন্টের দিক থেকে অ্যাক্সেস করার নির্দেশিকা পর্যালোচনা করুন।

সার্ভার-সাইড (অফলাইন) অ্যাক্সেস

iOS ক্লায়েন্টকে সহায়তা করার জন্য সার্ভার সাইডে কীভাবে Google API অ্যাক্সেস করতে হয় তা নিম্নলিখিত উদাহরণে দেখানো হয়েছে।

GIDSignIn.sharedInstance.signIn(
    with: signInConfig, presenting: self
) { user, error in
  guard error == nil else { return }
  guard let user = user else { return }
  
  // request a one-time authorization code that your server exchanges for
  // an access token and refresh token
  let authCode = user.serverAuthCode
}

সার্ভার-সাইড থেকে কীভাবে Google API অ্যাক্সেস করবেন সেই সম্পর্কে সার্ভার-সাইড অ্যাক্সেস গাইড পর্যালোচনা করুন।

Chrome অ্যাপ ক্লায়েন্ট

আপনি যদি দেখেন যে আপনার অ্যাপ Chrome অ্যাপ ক্লায়েন্টে লুপব্যাক IP অ্যাড্রেস ফ্লো ব্যবহার করছে, তাহলে আপনাকে Chrome Identity API ব্যবহার করার জন্য মাইগ্রেট করতে হবে।

লুপব্যাক IP অ্যাড্রেস রিডাইরেক্ট URI ব্যবহার না করে কীভাবে সব ব্যবহারকারীর পরিচিতি পাওয়া যায় তা নিম্নলিখিত উদাহরণে দেখানো হয়েছে।

window.onload = function() {
  document.querySelector('button').addEventListener('click', function() {

  
  // retrieve access token
  chrome.identity.getAuthToken({interactive: true}, function(token) {
  
  // ..........


  // the following example shows how to use a retrieved access token with an
  // appropriate scope to call the Google People API contactGroups.get endpoint

  fetch(
    'https://people.googleapis.com/v1/contactGroups/all'
        + '?maxMembers=20&key=API_KEY',
    init)
    .then((response) => response.json())
    .then(function(data) {
      console.log(data)
    });
   });
 });
};

Chrome Identity API-এর মাধ্যমে কীভাবে ব্যবহারকারীদের যাচাই করবেন এবং Google এন্ডপয়েন্ট কল করবেন সেই সম্পর্কে আরও জানতে Chrome Identity API নির্দেশিকা পর্যালোচনা করুন।