সংক্ষিপ্ত বিবরণ
২০২২ সালের ১৬ই ফেব্রুয়ারি, আমরা আরও সুরক্ষিত OAuth ফ্লো ব্যবহার করে Google OAuth ইন্টারঅ্যাকশনকে আরও নিরাপদ করার পরিকল্পনা ঘোষণা করেছি । এই নির্দেশিকাটি আপনাকে লুপব্যাক আইপি অ্যাড্রেস ফ্লো থেকে সমর্থিত বিকল্পগুলিতে সফলভাবে স্থানান্তরিত হওয়ার জন্য প্রয়োজনীয় পরিবর্তন এবং পদক্ষেপগুলি বুঝতে সাহায্য করবে।
গুগলের OAuth 2.0 অনুমোদন এন্ডপয়েন্টগুলোর সাথে যোগাযোগের সময় ফিশিং এবং অ্যাপ ছদ্মবেশ আক্রমণ থেকে সুরক্ষার জন্য এই প্রচেষ্টাটি একটি প্রতিরোধমূলক ব্যবস্থা।
লুপব্যাক আইপি অ্যাড্রেস ফ্লো বলতে কী বোঝায়?
লুপব্যাক আইপি অ্যাড্রেস ফ্লো রিডাইরেক্ট ইউআরআই-এর হোস্ট কম্পোনেন্ট হিসেবে একটি লুপব্যাক আইপি অ্যাড্রেস বাlocalhost ব্যবহারের সুযোগ দেয়, যেখানে একজন ব্যবহারকারী একটি OAuth সম্মতি অনুরোধ অনুমোদন করার পর ক্রেডেনশিয়াল পাঠানো হয়। এই ফ্লোটি 'ম্যান ইন দ্য মিডল' আক্রমণের ঝুঁকিতে থাকে, যেখানে কিছু অপারেটিং সিস্টেমে একই লুপব্যাক ইন্টারফেস অ্যাক্সেসকারী একটি ক্ষতিকর অ্যাপ, প্রদত্ত রিডাইরেক্ট ইউআরআই-এর জন্য অথরাইজেশন সার্ভার থেকে আসা প্রতিক্রিয়াটি আটক করে অথরাইজেশন কোডটি হাতিয়ে নিতে পারে।নেটিভ iOS, Android, এবং Chrome OAuth ক্লায়েন্ট টাইপগুলোর জন্য লুপব্যাক আইপি অ্যাড্রেস ফ্লো বাতিল করা হচ্ছে, কিন্তু ডেস্কটপ অ্যাপগুলোতে এর সমর্থন অব্যাহত থাকবে।
গুরুত্বপূর্ণ সম্মতি তারিখসমূহ
- ১৪ মার্চ, ২০২২ - নতুন OAuth ক্লায়েন্টদের Loopback IP address ফ্লো ব্যবহার করা থেকে ব্লক করা হয়েছে।
- ১ আগস্ট, ২০২২ - নিয়মবহির্ভূত OAuth অনুরোধগুলোর জন্য ব্যবহারকারীকে একটি সতর্কীকরণ বার্তা দেখানো হতে পারে।
- ৩১ আগস্ট, ২০২২ - ১৪ মার্চ, ২০২২-এর আগে তৈরি করা নেটিভ অ্যান্ড্রয়েড, ক্রোম অ্যাপ এবং আইওএস OAuth ক্লায়েন্টগুলির জন্য Loopback IP address ফ্লো ব্লক করা হয়েছে।
- ২১শে অক্টোবর, ২০২২ - সকল বিদ্যমান গ্রাহককে ব্লক করা হয়েছে (ছাড়প্রাপ্ত গ্রাহকসহ)।
নিয়মবহির্ভূত অনুরোধগুলির জন্য ব্যবহারকারীর কাছে একটি ত্রুটির বার্তা প্রদর্শিত হবে। বার্তাটি ব্যবহারকারীদের জানাবে যে অ্যাপটি ব্লক করা হয়েছে এবং একই সাথে গুগল এপিআই কনসোলের OAuth সম্মতি স্ক্রিনে আপনার নিবন্ধিত সাপোর্ট ইমেলটিও প্রদর্শন করবে।
- আপনি প্রভাবিত হয়েছেন কিনা তা নির্ণয় করুন।
- আপনি ক্ষতিগ্রস্ত হলে সহায়তাপ্রাপ্ত কোনো বিকল্প ব্যবস্থায় চলে যান।
আপনি প্রভাবিত কিনা তা নির্ধারণ করুন
আপনার OAuth ক্লায়েন্ট আইডি টাইপ পর্যালোচনা করুন
Google Cloud Console-এর Clients পৃষ্ঠায় যান এবং OAuth 2.0 Client IDs বিভাগের অধীনে আপনার OAuth ক্লায়েন্ট আইডি-র ধরনটি দেখুন। এটি নিম্নলিখিতগুলির মধ্যে যেকোনো একটি হবে: ওয়েব অ্যাপ্লিকেশন , অ্যান্ড্রয়েড , আইওএস , ইউনিভার্সাল উইন্ডোজ প্ল্যাটফর্ম (UWP) , ক্রোম অ্যাপ , টিভি ও সীমিত ইনপুট ডিভাইস , ডেস্কটপ অ্যাপ ।
আপনার ক্লায়েন্টের ধরন যদি অ্যান্ড্রয়েড, ক্রোম অ্যাপ বা আইওএস হয় এবং আপনি লুপব্যাক আইপি অ্যাড্রেস ফ্লো ব্যবহার করেন, তাহলে পরবর্তী ধাপে যান।
আপনি যদি ডেস্কটপ অ্যাপ OAuth ক্লায়েন্টে লুপব্যাক আইপি অ্যাড্রেস ফ্লো ব্যবহার করে থাকেন, তাহলে এই ডেপ্রিকেশন সম্পর্কিত কোনো পদক্ষেপ নেওয়ার প্রয়োজন নেই, কারণ সেই ধরনের OAuth ক্লায়েন্টের সাথে এর ব্যবহার সমর্থিত হতে থাকবে।
আপনার অ্যাপটি লুপব্যাক আইপি অ্যাড্রেস ফ্লো ব্যবহার করছে কিনা তা কীভাবে নির্ধারণ করবেন
আপনার অ্যাপের করা Google OAuth অনুমোদন অনুরোধটি লুপব্যাক রিডাইরেক্ট URI ভ্যালু ব্যবহার করছে কিনা তা নির্ধারণ করতে আপনার অ্যাপ কোড অথবা বহির্গামী নেটওয়ার্ক কলটি (যদি আপনার অ্যাপ কোনো 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
https://accounts.google.com/o/oauth2/v2/auth? redirect_uri=http://localhost:3000& response_type=code& scope=<SCOPES>& state=<STATE>& client_id=<CLIENT_ID>
বহির্গামী নেটওয়ার্ক কল পরিদর্শন করুন
- ওয়েব অ্যাপ্লিকেশন - ক্রোমে নেটওয়ার্ক কার্যকলাপ পরিদর্শন
- অ্যান্ড্রয়েড - নেটওয়ার্ক ইন্সপেক্টর দিয়ে নেটওয়ার্ক ট্র্যাফিক পরিদর্শন করুন
- ক্রোম অ্যাপস
- ক্রোম এক্সটেনশন পৃষ্ঠায় যান
- এক্সটেনশন পেজের উপরের ডান কোণায় থাকা ডেভেলপার মোড চেকবক্সটি চেক করুন।
- যে এক্সটেনশনটি আপনি নিরীক্ষণ করতে চান তা নির্বাচন করুন।
- এক্সটেনশন পেজের 'ভিউ পরিদর্শন' বিভাগে থাকা ' ব্যাকগ্রাউন্ড পেজ' লিঙ্কে ক্লিক করুন।
- একটি ডেভেলপার টুলস পপ-আপ খুলে যাবে, যেখানে আপনি নেটওয়ার্ক ট্যাবে নেটওয়ার্ক ট্র্যাফিক নিরীক্ষণ করতে পারবেন।
- iOS - Instruments ব্যবহার করে HTTP ট্র্যাফিক বিশ্লেষণ
- ডেস্কটপ অ্যাপ - যে অপারেটিং সিস্টেমের জন্য অ্যাপটি তৈরি করা হয়েছে, সেটির জন্য উপলব্ধ একটি নেটওয়ার্ক ক্যাপচার টুল ব্যবহার করুন।
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
https://accounts.google.com/o/oauth2/v2/auth? redirect_uri=http://localhost:3000& response_type=code& scope=<SCOPES>& state=<STATE>& client_id=<CLIENT_ID>
একটি সমর্থিত বিকল্পে স্থানান্তরিত হন
মোবাইল ক্লায়েন্ট (অ্যান্ড্রয়েড / আইওএস)
যদি আপনি নিশ্চিত হন যে আপনার অ্যাপটি অ্যান্ড্রয়েড বা আইওএস OAuth ক্লায়েন্ট টাইপের সাথে লুপব্যাক আইপি অ্যাড্রেস ফ্লো ব্যবহার করছে, তাহলে আপনার প্রস্তাবিত SDK ( অ্যান্ড্রয়েড , আইওএস ) ব্যবহার শুরু করা উচিত।
এই SDK-এর মাধ্যমে গুগল এপিআই (API) অ্যাক্সেস করা সহজ হয় এবং এটি গুগলের OAuth 2.0 অথরাইজেশন এন্ডপয়েন্টগুলোতে করা সমস্ত কল পরিচালনা করে।
নিচের ডকুমেন্টেশন লিঙ্কগুলোতে লুপব্যাক আইপি অ্যাড্রেস রিডাইরেক্ট ইউআরআই ব্যবহার না করে প্রস্তাবিত এসডিকে-গুলো দিয়ে কীভাবে গুগল এপিআই অ্যাক্সেস করা যায়, সে সম্পর্কে তথ্য দেওয়া আছে।
অ্যান্ড্রয়েডে গুগল এপিআই অ্যাক্সেস করুন
ক্লায়েন্ট-সাইড অ্যাক্সেস
নিম্নলিখিত উদাহরণে দেখানো হয়েছে, কীভাবে প্রস্তাবিত গুগল আইডেন্টিটি সার্ভিসেস অ্যান্ড্রয়েড লাইব্রেরি ব্যবহার করে অ্যান্ড্রয়েডে ক্লায়েন্ট সাইডে গুগল এপিআই অ্যাক্সেস করা যায় ।
ListrequestedScopes = 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() মেথডটি রয়েছে, যা অ্যাক্সেস টোকেন রিটার্ন করে।
সার্ভার-সাইড (অফলাইন) অ্যাক্সেস
নিম্নলিখিত উদাহরণে দেখানো হয়েছে, কীভাবে অ্যান্ড্রয়েডে সার্ভার সাইডে গুগল এপিআই অ্যাক্সেস করতে হয়।ListrequestedScopes = 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-এ ক্লায়েন্ট সাইড থেকে গুগল এপিআই অ্যাক্সেস করতে হয়।
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 ACCESS_TOKEN ), অথবা Objective-C for REST-এর জন্য Google APIs ক্লায়েন্ট লাইব্রেরির সাথে ফেচার অথরাইজার ( GTMFetcherAuthorizationProtocol ) ব্যবহার করতে পারেন।
ক্লায়েন্ট সাইডে কীভাবে গুগল এপিআই অ্যাক্সেস করবেন, তা জানতে ক্লায়েন্ট-সাইড অ্যাক্সেস গাইডটি পর্যালোচনা করুন।
সার্ভার-সাইড (অফলাইন) অ্যাক্সেস
নিচের উদাহরণটিতে দেখানো হয়েছে, কীভাবে একটি 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 APIs) কীভাবে অ্যাক্সেস করতে হয়, তা জানতে সার্ভার-সাইড অ্যাক্সেস গাইডটি পর্যালোচনা করুন।
ক্রোম অ্যাপ ক্লায়েন্ট
যদি আপনি নিশ্চিত হন যে আপনার অ্যাপটি ক্রোম অ্যাপ ক্লায়েন্টে লুপব্যাক আইপি অ্যাড্রেস ফ্লো ব্যবহার করছে, তাহলে আপনার ক্রোম আইডেন্টিটি এপিআই ব্যবহার শুরু করা উচিত।
নিচের উদাহরণটিতে দেখানো হয়েছে, কীভাবে লুপব্যাক আইপি অ্যাড্রেস রিডাইরেক্ট ইউআরআই ব্যবহার না করে সকল ব্যবহারকারীর কন্ট্যাক্ট পাওয়া যায়।
window.onload = function() { document.querySelector('button').addEventListener('click', function() { // retrieve access token chrome.identity.getAuthToken({interactive: true}, function(token) { // .......... // the example below 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) }); }); }); };