खास जानकारी
हमने 16 फ़रवरी, 2022 को ऐलान किया था कि हम Google OAuth इंटरैक्शन को ज़्यादा सुरक्षित बनाने के लिए, OAuth के ज़्यादा सुरक्षित फ़्लो का इस्तेमाल करेंगे. इस गाइड से, आपको ज़रूरी बदलावों को समझने और OAuth आउट-ऑफ़-बैंड (OOB) फ़्लो से, इसके लिए उपलब्ध अन्य विकल्पों पर माइग्रेट करने में मदद मिलती है.
यह Google के OAuth 2.0 ऑथराइज़ेशन एंडपॉइंट के साथ इंटरैक्शन के दौरान, फ़िशिंग और ऐप्लिकेशन के नाम पर धोखाधड़ी करने वाले हमलों से सुरक्षा देने के लिए किया गया है.
OOB क्या है?
OAuth आउट-ऑफ़-बैंड (OOB) को मैन्युअल तरीके से कॉपी करके चिपकाने का विकल्प भी कहा जाता है. यह एक लेगसी फ़्लो है, जिसे इंस्टॉल किए गए उन क्लाइंट के लिए बनाया गया है जिनके पास रीडायरेक्ट यूआरआई नहीं है. इस यूआरआई की मदद से, उपयोगकर्ता की ओर से OAuth की सहमति का अनुरोध स्वीकार किए जाने के बाद, क्रेडेंशियल स्वीकार किए जाते हैं. ओओबी फ़्लो में, रिमोट फ़िशिंग का खतरा होता है. इसलिए, क्लाइंट को इस खतरे से बचने के लिए, किसी दूसरे तरीके का इस्तेमाल करना चाहिए.
OOB फ़्लो को सभी तरह के ऐप्लिकेशन के लिए बंद किया जा रहा है. जैसे, वेब ऐप्लिकेशन, Android, iOS, यूनिवर्सल Windows प्लैटफ़ॉर्म (UWP), Chrome ऐप्लिकेशन, टीवी और सीमित इनपुट वाले डिवाइस, डेस्कटॉप ऐप्लिकेशन.
नीति का पालन करने की अहम तारीखें
- 28 फ़रवरी, 2022 - ओओबी फ़्लो के लिए, OAuth के नए इस्तेमाल पर रोक लगा दी गई है
- 5 सितंबर, 2022 - नीति का पालन न करने वाले OAuth अनुरोधों के लिए, उपयोगकर्ताओं को चेतावनी वाला मैसेज दिख सकता है
- 3 अक्टूबर, 2022 - 28 फ़रवरी, 2022 से पहले बनाए गए OAuth क्लाइंट के लिए, OOB फ़्लो को बंद कर दिया गया है
- 31 जनवरी, 2023 - सभी मौजूदा क्लाइंट ब्लॉक कर दिए जाएंगे. इनमें वे क्लाइंट भी शामिल हैं जिन्हें छूट मिली है
नीति का पालन न करने वाले अनुरोधों के लिए, इस्तेमाल करने वाले लोगों को गड़बड़ी का मैसेज दिखेगा. इस मैसेज से उपयोगकर्ताओं को पता चलेगा कि ऐप्लिकेशन को ब्लॉक कर दिया गया है. साथ ही, उन्हें सहायता के लिए वह ईमेल पता दिखेगा जिसे आपने Google Cloud Console में OAuth के लिए सहमति देने वाली स्क्रीन पर रजिस्टर किया है.
माइग्रेशन की प्रोसेस को पूरा करने के लिए, दो मुख्य चरण हैं:
- यह पता लगाना कि आपके खाते पर असर पड़ा है या नहीं.
- अगर आपको इस बदलाव से असर पड़ा है, तो ज़्यादा सुरक्षित विकल्प पर माइग्रेट करें.
यह पता लगाना कि क्या आपके खाते पर असर पड़ा है
यह बदलाव सिर्फ़ प्रोडक्शन ऐप्लिकेशन पर लागू होता है.इसका मतलब है कि ऐसे ऐप्लिकेशन जिनकी पब्लिशिंग स्थिति प्रोडक्शन में पर सेट है. यह फ़्लो, टेस्टिंग पब्लिशिंग स्टेटस वाले ऐप्लिकेशन के लिए काम करता रहेगा.
Google Cloud Console के OAuth ब्रैंडिंग पेज पर जाकर, पब्लिश करने की स्थिति देखें. अगर किसी प्रोजेक्ट में "प्रोडक्शन में" पब्लिश करने की स्थिति के साथ OOB फ़्लो का इस्तेमाल किया जा रहा है, तो अगले चरण पर जाएं.
यह कैसे तय करें कि आपका ऐप्लिकेशन, ओओबी फ़्लो का इस्तेमाल कर रहा है या नहीं
अपने ऐप्लिकेशन कोड या आउटगोइंग नेटवर्क कॉल (अगर आपका ऐप्लिकेशन OAuth लाइब्रेरी का इस्तेमाल कर रहा है) की जांच करें. इससे यह पता लगाया जा सकता है कि आपका ऐप्लिकेशन, Google OAuth अनुमति के अनुरोध के लिए, OOB रीडायरेक्ट यूआरआई वैल्यू का इस्तेमाल कर रहा है या नहीं.
अपने ऐप्लिकेशन कोड की जांच करना
अपने ऐप्लिकेशन कोड के उस सेक्शन की समीक्षा करें जहां से Google OAuth ऑथराइज़ेशन एंडपॉइंट को कॉल किया जा रहा है. साथ ही, यह पता लगाएं कि redirect_uri पैरामीटर की इनमें से कोई वैल्यू है या नहीं:
redirect_uri=urn:ietf:wg:oauth:2.0:oobredirect_uri=urn:ietf:wg:oauth:2.0:oob:autoredirect_uri=oob
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>
आउटगोइंग नेटवर्क कॉल की जांच करना
नेटवर्क कॉल की जांच करने का तरीका, आपके ऐप्लिकेशन के टाइप के हिसाब से अलग-अलग होगा.
- वेब ऐप्लिकेशन - Chrome पर नेटवर्क पर की जाने वाली गतिविधि की जांच करना
- Android - नेटवर्क इंस्पेक्टर की मदद से नेटवर्क ट्रैफ़िक की जांच करना
- Chrome ऐप्लिकेशन
- Chrome एक्सटेंशन पेज पर जाएं
- एक्सटेंशन पेज के सबसे ऊपर दाएं कोने में मौजूद, डेवलपर मोड चेकबॉक्स को चुनें
- वह एक्सटेंशन चुनें जिस पर आपको नज़र रखनी है
- एक्सटेंशन पेज के व्यू की जांच करें सेक्शन में, बैकग्राउंड पेज लिंक पर क्लिक करें
- इसके बाद, डेवलपर टूल डायलॉग बॉक्स खुलेगा. इसमें नेटवर्क टैब में जाकर, नेटवर्क ट्रैफ़िक को मॉनिटर किया जा सकता है
- iOS - इंस्ट्रुमेंट की मदद से एचटीटीपी ट्रैफ़िक का विश्लेषण करना
- डेस्कटॉप ऐप्लिकेशन - उस ऑपरेटिंग सिस्टम के लिए उपलब्ध नेटवर्क कैप्चर टूल का इस्तेमाल करें जिसके लिए ऐप्लिकेशन को डेवलप किया गया था
नेटवर्क कॉल की जांच करते समय, Google OAuth के ऑथराइज़ेशन एंडपॉइंट पर भेजे गए अनुरोधों को देखें. साथ ही, यह पता लगाएं कि redirect_uri पैरामीटर में इनमें से कोई वैल्यू है या नहीं:
redirect_uri=urn:ietf:wg:oauth:2.0:oobredirect_uri=urn:ietf:wg:oauth:2.0:oob:autoredirect_uri=oob
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>
किसी सुरक्षित विकल्प पर माइग्रेट करें
मोबाइल क्लाइंट (Android और iOS)
अगर आपको पता चलता है कि आपका ऐप्लिकेशन, Android या iOS OAuth ऐप्लिकेशन टाइप के साथ ओओबी फ़्लो का इस्तेमाल कर रहा है, तो आपको सुझाए गए SDK टूल (Android, iOS) पर माइग्रेट करना चाहिए.
एसडीके की मदद से, Google API को ऐक्सेस किया जा सकता है. साथ ही, यह Google के OAuth 2.0 ऑथराइज़ेशन एंडपॉइंट पर किए जाने वाले सभी कॉल को मैनेज करता है.
यहां दिए गए दस्तावेज़ के लिंक में, सुझाए गए एसडीके इस्तेमाल करने का तरीका बताया गया है. इनकी मदद से, ओओबी रीडायरेक्ट यूआरआई का इस्तेमाल किए बिना Google API को ऐक्सेस किया जा सकता है.
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));
उपयोगकर्ता के Drive फ़ोल्डर में कॉन्टेंट सेव करने के लिए, तय किए गए तरीके में 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() }
एपीआई को कॉल करने के लिए, ऐक्सेस टोकन का इस्तेमाल करें. इसके लिए, ऐक्सेस टोकन को REST या gRPC अनुरोध (Authorization: Bearer <var>ACCESS_TOKEN</var>) के हेडर में शामिल करें या Objective-C के लिए Google API क्लाइंट लाइब्रेरी के साथ फ़ेचर ऑथराइज़र (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 ऐप्लिकेशन क्लाइंट पर ओओबी फ़्लो का इस्तेमाल कर रहा है, तो आपको Chrome Identity API का इस्तेमाल करना चाहिए.
यहां दिए गए उदाहरण में, OOB रीडायरेक्ट यूआरआई का इस्तेमाल किए बिना, उपयोगकर्ता के सभी संपर्कों को पाने का तरीका बताया गया है.
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 की गाइड देखें.
वेब ऐप्लिकेशन
अगर आपको पता चलता है कि आपका ऐप्लिकेशन किसी वेब ऐप्लिकेशन के लिए ओओबी फ़्लो का इस्तेमाल कर रहा है, तो आपको हमारी Google API क्लाइंट लाइब्रेरी में से किसी एक का इस्तेमाल करना चाहिए. अलग-अलग प्रोग्रामिंग भाषाओं के लिए, Google API क्लाइंट लाइब्रेरी की सूची देखें.
लाइब्रेरी, Google API को ऐक्सेस करना आसान बनाती हैं. साथ ही, Google एंडपॉइंट पर किए जाने वाले सभी कॉल को मैनेज करती हैं.
सर्वर-साइड (ऑफ़लाइन) ऐक्सेस
सर्वर-साइड (ऑफ़लाइन) ऐक्सेस मोड के लिए, आपको ये काम करने होंगे :
- एक सर्वर सेट अप करें और ऑथराइज़ेशन कोड पाने के लिए, सार्वजनिक तौर पर ऐक्सेस किया जा सकने वाला एंडपॉइंट (रीडायरेक्ट यूआरआई) तय करें.
- Google Cloud Console के Clients पेज पर जाकर, रीडायरेक्ट यूआरआई को कॉन्फ़िगर करें
यहां दिए गए कोड स्निपेट में, Google Drive API का इस्तेमाल करने का NodeJS उदाहरण दिखाया गया है. इसमें, OOB रीडायरेक्ट यूआरआई का इस्तेमाल किए बिना, सर्वर-साइड पर उपयोगकर्ता की Google Drive फ़ाइलों की सूची बनाई गई है.
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. }); } } }
सर्वर साइड से Google API को ऐक्सेस करने के तरीके के बारे में जानने के लिए, सर्वर साइड वेब ऐप्लिकेशन गाइड देखें.
क्लाइंट-साइड ऐक्सेस
JavaScript में मौजूद यह कोड स्निपेट, Google API का इस्तेमाल करने का उदाहरण दिखाता है. इससे क्लाइंट साइड पर, उपयोगकर्ता के कैलेंडर इवेंट ऐक्सेस किए जा सकते हैं.
// 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(...); }
क्लाइंट साइड से Google API को ऐक्सेस करने के तरीके के बारे में जानने के लिए, क्लाइंट-साइड वेब ऐप्लिकेशन गाइड पढ़ें.
डेस्कटॉप क्लाइंट
अगर आपको पता चलता है कि आपका ऐप्लिकेशन किसी डेस्कटॉप क्लाइंट पर ओओबी फ़्लो का इस्तेमाल कर रहा है, तो आपको लूपबैक आईपी पते (localhost या 127.0.0.1) फ़्लो का इस्तेमाल करना चाहिए.