आउट-ऑफ़-बैंड (OOB) फ़्लो माइग्रेशन गाइड

खास जानकारी

हमने 16 फ़रवरी, 2022 को Google OAuth के इंटरैक्शन को ज़्यादा सुरक्षित बनाने के लिए, OAuth के ज़्यादा सुरक्षित फ़्लो का इस्तेमाल करने की योजना के बारे में बताया था. इस गाइड से, आपको ज़रूरी बदलावों को समझने और OAuth के आउट-ऑफ़-बैंड (OOB) फ़्लो से, काम करने वाले विकल्पों पर अपने डेटा को माइग्रेट करने में मदद मिलती है.

यह कोशिश, Google के OAuth 2.0 ऑथराइज़ेशन एंडपॉइंट के साथ इंटरैक्ट करते समय, फ़िशिंग और ऐप्लिकेशन के इंपर्सनेशन के हमलों से सुरक्षा देने के लिए की जा रही है.

OOB क्या है?

OAuth आउट-ऑफ़-बैंड (OOB), जिसे मैन्युअल तरीके से कॉपी/पेस्ट करने के विकल्प के तौर पर भी जाना जाता है, एक पुराना फ़्लो है जिसे इंस्टॉल किए गए उन क्लाइंट के लिए बनाया गया है जिनके पास रीडायरेक्ट यूआरआई नहीं है ताकि उपयोगकर्ता के OAuth सहमति के अनुरोध को मंज़ूरी देने के बाद, क्रेडेंशियल स्वीकार किए जा सकें. OOB फ़्लो से, दूर से फ़िशिंग का खतरा होता है. इसलिए, क्लाइंट को इस समस्या से बचने के लिए, किसी दूसरे तरीके पर माइग्रेट करना होगा.

OOB फ़्लो को सभी तरह के क्लाइंट के लिए बंद किया जा रहा है. जैसे, वेब ऐप्लिकेशन, Android, iOS, यूनिवर्सल विंडोज़ प्लैटफ़ॉर्म (UWP), Chrome ऐप्लिकेशन, टीवी और & सीमित इनपुट वाले डिवाइस, डेस्कटॉप ऐप्लिकेशन.

अनुपालन से जुड़ी अहम तारीखें

  • 28 फ़रवरी, 2022 - OOB फ़्लो के लिए, OAuth के नए इस्तेमाल पर रोक
  • 5 सितंबर, 2022 - OAuth के ऐसे अनुरोधों के लिए, उपयोगकर्ताओं को चेतावनी का मैसेज दिख सकता है जो नियमों के मुताबिक नहीं हैं
  • 3 अक्टूबर, 2022 - OOB फ़्लो को, 28 फ़रवरी, 2022 से पहले बनाए गए OAuth क्लाइंट के लिए बंद कर दिया गया है
  • 31 जनवरी, 2023 - सभी मौजूदा क्लाइंट को ब्लॉक कर दिया गया है. (इनमें, छूट पाने वाले क्लाइंट भी शामिल हैं)

नियमों के मुताबिक नहीं होने वाले अनुरोधों के लिए, उपयोगकर्ताओं को गड़बड़ी का मैसेज दिखेगा. मैसेज में उपयोगकर्ताओं को बताया जाएगा कि ऐप्लिकेशन को ब्लॉक कर दिया गया है. साथ ही, इसमें वह ईमेल पता दिखेगा जिसे आपने Google Cloud Console में, OAuth सहमति स्क्रीन में रजिस्टर किया है.

माइग्रेशन की प्रोसेस पूरी करने के लिए, ये दो मुख्य चरण पूरे करने होंगे:
  1. पता करें कि आपके ऐप्लिकेशन पर इस बदलाव का असर पड़ा है या नहीं.
  2. अगर आपके ऐप्लिकेशन पर इस बदलाव का असर पड़ा है, तो किसी ज़्यादा सुरक्षित विकल्प पर माइग्रेट करें.

पता करें कि आपके ऐप्लिकेशन पर इस बदलाव का असर पड़ा है या नहीं

यह सुविधा बंद करने का नियम, सिर्फ़ प्रोडक्शन में मौजूद ऐप्लिकेशन पर लागू होता है.जैसे, ऐसे ऐप्लिकेशन जिनकी पब्लिशिंग स्थिति In Production पर सेट है. जिन ऐप्लिकेशन की पब्लिशिंग स्थिति Testing पर सेट है उनके लिए, यह फ़्लो काम करता रहेगा.

Google Cloud Console के OAuth ब्रैंडिंग पेज में जाकर, अपने ऐप्लिकेशन की पब्लिशिंग स्थिति की समीक्षा करें. अगर किसी ऐसे प्रोजेक्ट में OOB फ़्लो का इस्तेमाल किया जा रहा है जिसकी पब्लिशिंग स्थिति "In Production" पर सेट है, तो अगले चरण पर जाएं.

यह पता लगाना कि आपका ऐप्लिकेशन OOB फ़्लो का इस्तेमाल कर रहा है या नहीं

अपने ऐप्लिकेशन के कोड की जांच करें या आउटगोइंग नेटवर्क कॉल की जांच करके पता लगाएं कि आपका ऐप्लिकेशन, Google OAuth ऑथराइज़ेशन के लिए जो अनुरोध कर रहा है उसमें, OOB रीडायरेक्ट यूआरआई वैल्यू का इस्तेमाल किया जा रहा है या नहीं. अगर आपका ऐप्लिकेशन, OAuth लाइब्रेरी का इस्तेमाल कर रहा है, तो भी इसकी जांच करें.

अपने ऐप्लिकेशन के कोड की जांच करना

अपने ऐप्लिकेशन के कोड के उस सेक्शन की समीक्षा करें जहां Google 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
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>

आउटगोइंग नेटवर्क कॉल की जांच करना

नेटवर्क कॉल की जांच करने का तरीका, आपके ऐप्लिकेशन के क्लाइंट टाइप के हिसाब से अलग-अलग होगा.
नेटवर्क कॉल की जांच करते समय, Google 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
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 क्लाइंट टाइप के साथ OOB फ़्लो का इस्तेमाल कर रहा है, तो आपको सुझाए गए SDK टूल (Android, iOS) का इस्तेमाल करना चाहिए.

SDK टूल की मदद से, Google APIs को आसानी से ऐक्सेस किया जा सकता है. साथ ही, यह Google के OAuth 2.0 ऑथराइज़ेशन एंडपॉइंट के सभी कॉल को मैनेज करता है.

यहां दिए गए दस्तावेज़ों के लिंक में, OOB रीडायरेक्ट यूआरआई का इस्तेमाल किए बिना, Google APIs को ऐक्सेस करने के लिए, सुझाए गए SDK टूल का इस्तेमाल करने का तरीका बताया गया है.

Android पर Google APIs को ऐक्सेस करना

क्लाइंट-साइड ऐक्सेस

यहां दिए गए उदाहरण में, सुझाए गए Google Identity Services Android Library का इस्तेमाल करके, Android पर क्लाइंट साइड से Google APIs को ऐक्सेस करने का तरीका बताया गया है.

  List 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 APIs को ऐक्सेस करने का तरीका बताया गया है.
  List 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 APIs को ऐक्सेस करना

क्लाइंट-साइड ऐक्सेस

यहां दिए गए उदाहरण में, iOS पर क्लाइंट साइड से Google APIs को ऐक्सेस करने का तरीका बताया गया है .

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) शामिल करें. इसके अलावा, REST के लिए Objective-C के लिए Google APIs क्लाइंट लाइब्रेरी के साथ, फ़ेचर ऑथराइज़र (GTMFetcherAuthorizationProtocol) का इस्तेमाल करें.

क्लाइंट साइड से Google APIs को ऐक्सेस करने के तरीके के बारे में जानने के लिए, क्लाइंट-साइड ऐक्सेस की गाइड पढ़ें. क्लाइंट साइड से Google APIs को ऐक्सेस करने के तरीके के बारे में जानने के लिए, क्लाइंट-साइड ऐक्सेस की गाइड पढ़ें.

सर्वर-साइड (ऑफ़लाइन) ऐक्सेस
यहां दिए गए उदाहरण में, iOS क्लाइंट के लिए सर्वर साइड से Google APIs को ऐक्सेस करने का तरीका बताया गया है.
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 को ऐक्सेस करने के तरीके के बारे में जानने के लिए, सर्वर-साइड ऐक्सेस गाइड पढ़ें.

Chrome ऐप्लिकेशन क्लाइंट

अगर आपको पता चलता है कि आपका ऐप्लिकेशन, Chrome ऐप्लिकेशन क्लाइंट पर OOB फ़्लो का इस्तेमाल कर रहा है, तो आपको Chrome Identity API का इस्तेमाल करना चाहिए.

यहां दिए गए उदाहरण में, OOB रीडायरेक्ट यूआरआई का इस्तेमाल किए बिना, उपयोगकर्ता के सभी संपर्कों को पाने का तरीका बताया गया है.

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)
    });
   });
 });
};

Chrome Identity API की मदद से, उपयोगकर्ताओं की पुष्टि करने और Google के एंडपॉइंट को कॉल करने के तरीके के बारे में ज़्यादा जानने के लिए, Chrome Identity API की गाइड पढ़ें.

वेब ऐप्लिकेशन

अगर आपको पता चलता है कि आपका ऐप्लिकेशन, वेब ऐप्लिकेशन के लिए OOB फ़्लो का इस्तेमाल कर रहा है, तो आपको Google API की किसी क्लाइंट लाइब्रेरी का इस्तेमाल करना चाहिए. अलग-अलग प्रोग्रामिंग भाषाओं के लिए, Google API की क्लाइंट लाइब्रेरी की सूची देखें.

इन लाइब्रेरी की मदद से, Google APIs को आसानी से ऐक्सेस किया जा सकता है. साथ ही, ये Google के एंडपॉइंट के सभी कॉल को मैनेज करती हैं.

सर्वर-साइड (ऑफ़लाइन) ऐक्सेस
सर्वर-साइड (ऑफ़लाइन) ऐक्सेस मोड के लिए, आपको ये काम करने होंगे:
  • एक सर्वर सेट अप करें और ऑथराइज़ेशन कोड पाने के लिए, सार्वजनिक तौर पर ऐक्सेस किया जा सकने वाला एक एंडपॉइंट (the रीडायरेक्ट यूआरआई) तय करें.
  • Google Cloud Console के क्लाइंट पेज में, रीडायरेक्ट यूआरआई कॉन्फ़िगर करें

यहां दिए गए कोड स्निपेट में, NodeJS का एक उदाहरण दिखाया गया है. इसमें, OOB रीडायरेक्ट यूआरआई का इस्तेमाल किए बिना, सर्वर-साइड पर उपयोगकर्ता की Google Drive फ़ाइलों की सूची दिखाने के लिए, Google Drive API का इस्तेमाल किया गया है.

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 APIs को ऐक्सेस करने के तरीके के बारे में जानने के लिए, सर्वर-साइड वेब ऐप्लिकेशन की गाइड पढ़ें.

क्लाइंट-साइड ऐक्सेस

यहां दिए गए JavaScript के कोड स्निपेट में, क्लाइंट साइड से उपयोगकर्ता के Calendar इवेंट को ऐक्सेस करने के लिए, 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 APIs को ऐक्सेस करने के तरीके के बारे में जानने के लिए, क्लाइंट-साइड वेब ऐप्लिकेशन की गाइड पढ़ें.

डेस्कटॉप क्लाइंट

अगर आपको पता चलता है कि आपका ऐप्लिकेशन, डेस्कटॉप क्लाइंट पर OOB फ़्लो का इस्तेमाल कर रहा है, तो आपको लूपबैक आईपी पता (localhost या 127.0.0.1) फ़्लो का इस्तेमाल करना चाहिए.