সংক্ষিপ্ত বিবরণ
২০২২ সালের ১৬ই ফেব্রুয়ারি, আমরা আরও সুরক্ষিত OAuth ফ্লো ব্যবহার করে Google OAuth ইন্টারঅ্যাকশনকে আরও নিরাপদ করার পরিকল্পনা ঘোষণা করেছি । এই নির্দেশিকাটি আপনাকে OAuth আউট-অফ-ব্যান্ড (OOB) ফ্লো থেকে সমর্থিত বিকল্পগুলিতে সফলভাবে স্থানান্তরিত হওয়ার জন্য প্রয়োজনীয় পরিবর্তন এবং পদক্ষেপগুলি বুঝতে সাহায্য করবে।
গুগলের OAuth 2.0 অনুমোদন এন্ডপয়েন্টগুলোর সাথে যোগাযোগের সময় ফিশিং এবং অ্যাপ ছদ্মবেশ আক্রমণ থেকে সুরক্ষার জন্য এই প্রচেষ্টাটি একটি প্রতিরোধমূলক ব্যবস্থা।
OOB বলতে কী বোঝায়?
OAuth আউট-অফ-ব্যান্ড (OOB) , যা ম্যানুয়াল কপি/পেস্ট অপশন নামেও পরিচিত, হলো একটি পুরোনো কার্যপ্রণালী যা এমন নেটিভ ক্লায়েন্টদের সমর্থন করার জন্য তৈরি করা হয়েছিল, যাদের কাছে ব্যবহারকারীর OAuth সম্মতি অনুরোধ অনুমোদনের পর ক্রেডেনশিয়াল গ্রহণ করার জন্য কোনো রিডাইরেক্ট URI থাকে না। OOB কার্যপ্রণালীটি একটি রিমোট ফিশিং ঝুঁকি তৈরি করে এবং এই দুর্বলতা থেকে রক্ষা পেতে ক্লায়েন্টদের অবশ্যই একটি বিকল্প পদ্ধতিতে স্থানান্তরিত হতে হবে।সকল প্রকার ক্লায়েন্টের জন্য, যেমন—ওয়েব অ্যাপ্লিকেশন, অ্যান্ড্রয়েড, আইওএস, ইউনিভার্সাল উইন্ডোজ প্ল্যাটফর্ম (ইউডব্লিউপি), ক্রোম অ্যাপ, টিভি ও সীমিত-ইনপুট ডিভাইস এবং ডেস্কটপ অ্যাপের ক্ষেত্রে, ওওবি (OOB) ফ্লো বাতিল করা হচ্ছে।
গুরুত্বপূর্ণ সম্মতি তারিখসমূহ
- ২৮ ফেব্রুয়ারি, ২০২২ - OOB ফ্লো-এর জন্য নতুন OAuth ব্যবহার ব্লক করা হয়েছে।
- ৫ সেপ্টেম্বর, ২০২২ - নিয়মবহির্ভূত OAuth অনুরোধগুলোর জন্য ব্যবহারকারীকে একটি সতর্কীকরণ বার্তা দেখানো হতে পারে।
- ৩ অক্টোবর, ২০২২ - ২৮ ফেব্রুয়ারি, ২০২২-এর আগে তৈরি করা OAuth ক্লায়েন্টগুলির জন্য OOB ফ্লোটি বাতিল করা হয়েছে।
- ৩১শে জানুয়ারী, ২০২৩ - সকল বিদ্যমান গ্রাহককে ব্লক করা হয়েছে (ছাড়প্রাপ্ত গ্রাহক সহ)।
নিয়মবহির্ভূত অনুরোধগুলির জন্য ব্যবহারকারীর কাছে একটি ত্রুটির বার্তা প্রদর্শিত হবে। বার্তাটি ব্যবহারকারীদের জানাবে যে অ্যাপটি ব্লক করা হয়েছে এবং একই সাথে গুগল এপিআই কনসোলের OAuth সম্মতি স্ক্রিনে আপনার নিবন্ধিত সাপোর্ট ইমেলটিও প্রদর্শন করবে।
- আপনি প্রভাবিত হয়েছেন কিনা তা নির্ণয় করুন।
- আপনি ক্ষতিগ্রস্ত হলে আরও নিরাপদ কোনো বিকল্পে চলে যান।
আপনি প্রভাবিত কিনা তা নির্ধারণ করুন
এই বাতিলকরণটি শুধুমাত্র প্রোডাকশন অ্যাপের ক্ষেত্রে প্রযোজ্য (অর্থাৎ, যে অ্যাপগুলোর পাবলিশিং স্ট্যাটাস 'ইন প্রোডাকশন' সেট করা আছে)। 'টেস্টিং' পাবলিশিং স্ট্যাটাসযুক্ত অ্যাপগুলোর জন্য ফ্লোটি আগের মতোই কাজ করতে থাকবে।
যদি আপনি "In Production" পাবলিশিং স্ট্যাটাসযুক্ত কোনো প্রোজেক্টে OOB ফ্লো ব্যবহার করে থাকেন, তাহলে Google Cloud Console-এর OAuth Branding পেজে আপনার পাবলিশিং স্ট্যাটাস পর্যালোচনা করুন এবং পরবর্তী ধাপে এগিয়ে যান।
আপনার অ্যাপটি OOB ফ্লো ব্যবহার করছে কিনা তা কীভাবে নির্ধারণ করবেন
আপনার অ্যাপের করা Google OAuth অনুমোদন অনুরোধটি একটি OOB রিডাইরেক্ট URI ভ্যালু ব্যবহার করছে কিনা তা নির্ধারণ করতে আপনার অ্যাপ কোড অথবা বহির্গামী নেটওয়ার্ক কলটি (যদি আপনার অ্যাপ কোনো OAuth লাইব্রেরি ব্যবহার করে থাকে) পরীক্ষা করুন।
আপনার অ্যাপ্লিকেশন কোড পরিদর্শন করুন
redirect_uri প্যারামিটারটিতে নিম্নলিখিত মানগুলির মধ্যে কোনোটি আছে কিনা:-
redirect_uri=urn:ietf:wg:oauth:2.0:oob -
redirect_uri=urn:ietf:wg:oauth:2.0:oob:auto -
redirect_uri=oob
https://accounts.google.com/o/oauth2/v2/auth? response_type=code& scope=<SCOPES>& state=<STATE>& redirect_uri=urn:ietf:wg:oauth:2.0:oob& client_id=<CLIENT_ID>
বহির্গামী নেটওয়ার্ক কল পরিদর্শন করুন
- ওয়েব অ্যাপ্লিকেশন - ক্রোমে নেটওয়ার্ক কার্যকলাপ পরিদর্শন
- অ্যান্ড্রয়েড - নেটওয়ার্ক ইন্সপেক্টর দিয়ে নেটওয়ার্ক ট্র্যাফিক পরিদর্শন করুন
- ক্রোম অ্যাপস
- ক্রোম এক্সটেনশন পৃষ্ঠায় যান
- এক্সটেনশন পেজের উপরের ডান কোণায় থাকা ডেভেলপার মোড চেকবক্সটি চেক করুন।
- যে এক্সটেনশনটি আপনি নিরীক্ষণ করতে চান তা নির্বাচন করুন।
- এক্সটেনশন পেজের 'ভিউ পরিদর্শন' বিভাগে থাকা ' ব্যাকগ্রাউন্ড পেজ' লিঙ্কে ক্লিক করুন।
- একটি ডেভেলপার টুলস পপ-আপ খুলে যাবে, যেখানে আপনি নেটওয়ার্ক ট্যাবে নেটওয়ার্ক ট্র্যাফিক নিরীক্ষণ করতে পারবেন।
- iOS - Instruments ব্যবহার করে HTTP ট্র্যাফিক বিশ্লেষণ
- ডেস্কটপ অ্যাপ - যে অপারেটিং সিস্টেমের জন্য অ্যাপটি তৈরি করা হয়েছে, সেটির জন্য উপলব্ধ একটি নেটওয়ার্ক ক্যাপচার টুল ব্যবহার করুন।
redirect_uri প্যারামিটারটিতে নিম্নলিখিত মানগুলোর কোনোটি আছে কিনা:-
redirect_uri=urn:ietf:wg:oauth:2.0:oob -
redirect_uri=urn:ietf:wg:oauth:2.0:oob:auto -
redirect_uri=oob
https://accounts.google.com/o/oauth2/v2/auth? response_type=code& scope=<SCOPES>& state=<STATE>& redirect_uri=urn:ietf:wg:oauth:2.0:oob& client_id=<CLIENT_ID>
একটি নিরাপদ বিকল্পে স্থানান্তরিত হন
মোবাইল ক্লায়েন্ট (অ্যান্ড্রয়েড / আইওএস)
যদি আপনি দেখেন যে আপনার অ্যাপটি অ্যান্ড্রয়েড বা আইওএস OAuth ক্লায়েন্ট টাইপের সাথে OOB ফ্লো ব্যবহার করছে, তাহলে আপনার প্রস্তাবিত SDK ( অ্যান্ড্রয়েড , আইওএস ) ব্যবহার শুরু করা উচিত।
এই SDK-এর মাধ্যমে গুগল এপিআই (API) অ্যাক্সেস করা সহজ হয় এবং এটি গুগলের OAuth 2.0 অথরাইজেশন এন্ডপয়েন্টগুলোতে করা সমস্ত কল পরিচালনা করে।
নিচের ডকুমেন্টেশন লিঙ্কগুলোতে OOB রিডাইরেক্ট URI ব্যবহার না করে প্রস্তাবিত SDK-গুলো দিয়ে কীভাবে গুগল এপিআই অ্যাক্সেস করা যায়, সে সম্পর্কে তথ্য দেওয়া আছে।
অ্যান্ড্রয়েডে গুগল এপিআই অ্যাক্সেস করুন
ক্লায়েন্ট-সাইড অ্যাক্সেস
নিম্নলিখিত উদাহরণে দেখানো হয়েছে, কীভাবে প্রস্তাবিত গুগল আইডেন্টিটি সার্ভিসেস অ্যান্ড্রয়েড লাইব্রেরি ব্যবহার করে অ্যান্ড্রয়েডে ক্লায়েন্ট সাইডে গুগল এপিআই অ্যাক্সেস করা যায় ।
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 ক্লায়েন্টকে সমর্থন করার জন্য সার্ভার সাইডে গুগল এপিআই অ্যাক্সেস করতে হয়।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) কীভাবে অ্যাক্সেস করতে হয়, তা জানতে সার্ভার-সাইড অ্যাক্সেস গাইডটি পর্যালোচনা করুন।
ক্রোম অ্যাপ ক্লায়েন্ট
যদি আপনি নিশ্চিত হন যে আপনার অ্যাপটি ক্রোম অ্যাপ ক্লায়েন্টে OOB ফ্লো ব্যবহার করছে, তাহলে আপনার ক্রোম আইডেন্টিটি এপিআই (Chrome Identity API) ব্যবহারে স্থানান্তরিত হওয়া উচিত।
নিচের উদাহরণটিতে দেখানো হয়েছে কিভাবে কোনো OOB রিডাইরেক্ট URI ব্যবহার না করে সকল ব্যবহারকারীর কন্ট্যাক্ট পাওয়া যায়।
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) }); }); }); };
ওয়েব অ্যাপ্লিকেশন
যদি আপনি দেখেন যে আপনার অ্যাপটি কোনো ওয়েব অ্যাপ্লিকেশনের জন্য নির্ধারিত OOB ফ্লো ব্যবহার করছে, তাহলে আপনার আমাদের গুগল এপিআই ক্লায়েন্ট লাইব্রেরিগুলোর মধ্যে একটি ব্যবহার শুরু করা উচিত। বিভিন্ন প্রোগ্রামিং ভাষার জন্য ক্লায়েন্ট লাইব্রেরিগুলোর তালিকা এখানে দেওয়া আছে।
এই লাইব্রেরিগুলো গুগল এপিআই অ্যাক্সেস করা এবং গুগল এন্ডপয়েন্টগুলোতে করা সমস্ত কল পরিচালনা করা সহজ করে তোলে।
সার্ভার-সাইড (অফলাইন) অ্যাক্সেস
- একটি সার্ভার চালু করুন এবং অনুমোদন কোড গ্রহণ করার জন্য একটি সর্বজনীনভাবে প্রবেশযোগ্য এন্ডপয়েন্ট (রিডাইরেক্ট ইউআরআই) নির্ধারণ করুন।
- গুগল ক্লাউড কনসোলের ক্লায়েন্টস পৃষ্ঠায় রিডাইরেক্ট ইউআরআই কনফিগার করুন।
নিচের কোড স্নিপেটটিতে একটি OOB রিডাইরেক্ট URI ব্যবহার না করে সার্ভার-সাইডে কোনো ব্যবহারকারীর গুগল ড্রাইভ ফাইল তালিকাভুক্ত করার জন্য গুগল ড্রাইভ API ব্যবহারের একটি NodeJS উদাহরণ দেখানো হয়েছে।
async function main() { const server = http.createServer(async function (req, res) { if (req.url.startsWith('/oauth2callback')) { let q = url.parse(req.url, true).query; if (q.error) { console.log('Error:' + q.error); } else { // Get access and refresh tokens (if access_type is offline) let { tokens } = await oauth2Client.getToken(q.code); oauth2Client.setCredentials(tokens); // Example of using Google Drive API to list filenames in user's Drive. const drive = google.drive('v3'); drive.files.list({ auth: oauth2Client, pageSize: 10, fields: 'nextPageToken, files(id, name)', }, (err1, res1) => { // TODO(developer): Handle response / error. }); } } }
সার্ভার সাইড থেকে কীভাবে গুগল এপিআই অ্যাক্সেস করতে হয়, তা জানতে সার্ভার-সাইড ওয়েব অ্যাপ গাইডটি পর্যালোচনা করুন।
ক্লায়েন্ট-সাইড অ্যাক্সেস
নিচের জাভাস্ক্রিপ্ট কোড স্নিপেটটিতে ক্লায়েন্ট সাইডে ব্যবহারকারীর ক্যালেন্ডার ইভেন্টগুলো অ্যাক্সেস করার জন্য গুগল এপিআই ব্যবহারের একটি উদাহরণ দেখানো হয়েছে।
// initTokenClient() initializes a new token client with your // web app's client ID and the scope you need access to const client = google.accounts.oauth2.initTokenClient({ client_id: 'YOUR_GOOGLE_CLIENT_ID', scope: 'https://www.googleapis.com/auth/calendar.readonly', // callback function to handle the token response callback: (tokenResponse) => { if (tokenResponse && tokenResponse.access_token) { gapi.client.setApiKey('YOUR_API_KEY'); gapi.client.load('calendar', 'v3', listUpcomingEvents); } }, }); function listUpcomingEvents() { gapi.client.calendar.events.list(...); }
ক্লায়েন্ট সাইড থেকে কীভাবে গুগল এপিআই অ্যাক্সেস করা যায়, তা জানতে ক্লায়েন্ট-সাইড ওয়েব অ্যাপ গাইডটি পর্যালোচনা করুন।
ডেস্কটপ ক্লায়েন্ট
যদি আপনি দেখেন যে আপনার অ্যাপটি ডেস্কটপ ক্লায়েন্টে OOB ফ্লো ব্যবহার করছে, তাহলে আপনার লুপব্যাক আইপি অ্যাড্রেস ( localhost বা 127.0.0.1 ) ফ্লো ব্যবহারে মাইগ্রেট করা উচিত।