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

खास जानकारी

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

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

ओओबी क्या है?

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

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

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

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

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

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

यह पता लगाना कि क्या आप पर इसका असर पड़ा है

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

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

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

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

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

अपने ऐप्लिकेशन कोड के उस सेक्शन की समीक्षा करें जहां 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
ओओबी रीडायरेक्ट फ़्लो का अनुरोध, यहां दिए गए अनुरोध की तरह दिखेगा:
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
ओओबी रीडायरेक्ट फ़्लो का अनुरोध, यहां दिए गए अनुरोध की तरह दिखेगा:
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 ऑथराइज़ेशन एंडपॉइंट पर किए जाने वाले सभी कॉल को मैनेज करता है.

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

Android पर Google API ऐक्सेस करना

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

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

  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 API को ऐक्सेस करने का तरीका बताया गया है.
  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 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 ACCESS_TOKEN) या REST के लिए, Objective-C के लिए Google APIs क्लाइंट लाइब्रेरी के साथ फ़ेचर ऑथराइज़र (GTMFetcherAuthorizationProtocol) का इस्तेमाल करें.

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

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

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

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

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

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

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

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

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