دليل نقل تدفق عنوان IP الاستماع إلى صوتك

نظرة عامة

في 16 شباط (فبراير) 2022، أعلنّا عن خطط لجعل التفاعلات مع Google OAuth أكثر أمانًا من خلال استخدام مسارات OAuth أكثر أمانًا. يساعدك هذا الدليل في فهم التغييرات والخطوات اللازمة للانتقال بنجاح من مسار عنوان IP الخاص بالاسترجاع إلى البدائل المتوافقة.

هذه الجهود هي إجراء وقائي ضد هجمات التصيّد الاحتيالي وانتحال هوية التطبيقات أثناء التفاعل مع نقاط نهاية التفويض في بروتوكول OAuth 2.0 من Google.

ما هي عملية عنوان IP للاسترجاع؟

يتيح مسار عنوان IP للحلقة الداخلية استخدام عنوان IP للحلقة الداخلية أو localhost كعنصر مضيف في معرّف URI لإعادة التوجيه الذي يتم إرسال بيانات الاعتماد إليه بعد موافقة المستخدم على طلب الموافقة على OAuth. يكون مسار العمل هذا عرضة لهجمات الوسيط، حيث يمكن لتطبيق ضار الوصول إلى واجهة العودة نفسها على بعض أنظمة التشغيل، ما يتيح له اعتراض الرد من خادم التفويض إلى معرّف الموارد المنتظم (URI) لإعادة التوجيه المحدّد والوصول إلى رمز التفويض.

سيتم إيقاف مسار عنوان IP الاستماع إلى صوتك نهائيًا لأنواع العملاء الذين يستخدمون بروتوكول OAuth على أجهزة iOS وAndroid وتطبيق Chrome، ولكن سيظل متاحًا على تطبيقات سطح المكتب.

تواريخ الامتثال الرئيسية

  • 14 مارس 2022: حظر عملاء OAuth الجدد من استخدام مسار عنوان IP‏ Loopback
  • 1 آب (أغسطس) 2022: قد يتم عرض رسالة تحذيرية للمستخدمين بشأن طلبات OAuth غير المتوافقة
  • ‫31 أغسطس 2022: تم حظر مسار عنوان IP الاستماع إلى صوتك لعملاء OAuth الأصليين على Android وتطبيقات Chrome وiOS الذين تم إنشاؤهم قبل 14 مارس 2022
  • ‫21 أكتوبر 2022 - تم حظر جميع العملاء الحاليين (بما في ذلك العملاء المعفون)

سيتم عرض رسالة خطأ للمستخدمين بشأن الطلبات غير المتوافقة. ستوضّح الرسالة للمستخدمين أنّه تم حظر التطبيق، مع عرض عنوان البريد الإلكتروني المخصّص للدعم الذي سجّلته في شاشة طلب الموافقة المتعلّقة ببروتوكول OAuth في Google API Console.

هناك خطوتان رئيسيتان يجب إكمالهما لإتمام عملية نقل البيانات:
  1. تحديد ما إذا كنت متأثرًا بهذا التغيير
  2. يُرجى نقل البيانات إلى طريقة أخرى متوافقة إذا كنت متأثرًا بهذا التغيير.

تحديد ما إذا كنت متأثرًا

مراجعة نوع معرّف عميل OAuth

انتقِل إلى Clients page في Google Cloud Console واطّلِع على نوع معرّف عميل OAuth ضمن قسم معرّفات عميل OAuth 2.0. سيكون أحد ما يلي: تطبيق ويب أو Android أو iOS أو منصة Windows العالمية (UWP) أو تطبيق Chrome أو أجهزة التلفزيون والأجهزة ذات الإدخال المحدود أو تطبيق سطح المكتب.

انتقِل إلى الخطوة التالية إذا كان نوع العميل هو Android أو تطبيق Chrome أو iOS وكنت تستخدم مسار عنوان IP الاستماع إلى صوتك.

ليس عليك اتّخاذ أي إجراء بشأن هذا الإيقاف النهائي إذا كنت تستخدم مسار عنوان IP الاستماع إلى صوتك على عميل OAuth لتطبيق على الكمبيوتر المكتبي، لأنّه سيظل متاحًا مع هذا النوع من عملاء OAuth.

كيفية تحديد ما إذا كان تطبيقك يستخدم مسار عنوان IP الخاص بالشبكة المحلية

افحص رمز تطبيقك أو طلب الشبكة الصادر (في حال كان تطبيقك يستخدم مكتبة OAuth) لتحديد ما إذا كان طلب التفويض الذي يرسله تطبيقك إلى Google OAuth يستخدم قيم معرّف URI لإعادة التوجيه إلى عنوان IP محلي.

فحص رمز التطبيق

راجِع قسم رمز التطبيق الذي تجري فيه عمليات طلب إلى نقاط نهاية التفويض في Google 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
سيبدو طلب نموذج لعملية إعادة توجيه عنوان IP للاسترجاع على النحو التالي:
https://accounts.google.com/o/oauth2/v2/auth?
redirect_uri=http://localhost:3000&
response_type=code&
scope=<SCOPES>&
state=<STATE>&
client_id=<CLIENT_ID>

فحص مكالمة الشبكة الصادرة

تختلف طريقة فحص طلبات الشبكة حسب نوع تطبيق العميل.
أثناء فحص طلبات الشبكة، ابحث عن الطلبات المُرسَلة إلى نقاط نهاية التفويض في Google 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
سيبدو طلب إعادة التوجيه إلى عنوان IP للاسترجاع على النحو التالي:
https://accounts.google.com/o/oauth2/v2/auth?
redirect_uri=http://localhost:3000&
response_type=code&
scope=<SCOPES>&
state=<STATE>&
client_id=<CLIENT_ID>

نقل البيانات إلى طريقة بديلة متوافقة

برامج العملاء على الأجهزة الجوّالة (Android / iOS)

إذا تبيّن لك أنّ تطبيقك يستخدم مسار عنوان IP للحلقة الداخلية مع نوع عميل OAuth على Android أو iOS، عليك الانتقال إلى استخدام حِزم تطوير البرامج (SDK) المقترَحة (Android وiOS).

يسهّل حزمة SDK الوصول إلى Google APIs ويتعامل مع جميع طلبات البيانات من نقاط نهاية التفويض في بروتوكول OAuth 2.0 من Google.

تقدّم روابط المستندات أدناه معلومات حول كيفية استخدام حِزم SDK المقترَحة للوصول إلى واجهات Google API بدون استخدام معرّف موارد منتظم (URI) لإعادة التوجيه وعنوان IP حلقي.

الوصول إلى واجهات Google API على Android

إذن الوصول من جهة العميل

يوضّح المثال التالي كيفية الوصول إلى Google APIs على جانب العميل على Android باستخدام مكتبة Google Identity Services Android المقترَحة.

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

مرِّر authorizationResult إلى الطريقة المحدّدة لحفظ المحتوى في مجلد Drive الخاص بالمستخدم. يحتوي authorizationResult على الطريقة getAccessToken() التي تعرض رمز الدخول.

الوصول من جهة الخادم (بلا إنترنت)
يوضّح المثال التالي كيفية الوصول إلى واجهات Google API من جهة الخادم على Android.
  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() التي تعرض رمز التفويض الذي يمكنك إرساله إلى الخلفية للحصول على رمز دخول ورمز مميز لإعادة التحميل.

الوصول إلى واجهات Google API في تطبيق iOS

إذن الوصول من جهة العميل

يوضّح المثال أدناه كيفية الوصول إلى Google APIs من جهة العميل على 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()
}

استخدِم رمز الدخول لاستدعاء واجهة برمجة التطبيقات، إما عن طريق تضمين رمز الدخول في عنوان طلب REST أو gRPC (Authorization: Bearer ACCESS_TOKEN)، أو باستخدام أداة التحقّق من أذونات fetcher (GTMFetcherAuthorizationProtocol) مع مكتبة برامج Google APIs للغة Objective-C الخاصة بطلبات REST.

راجِع دليل الوصول من جهة العميل لمعرفة كيفية الوصول إلى واجهات Google APIs من جهة العميل. حول كيفية الوصول إلى واجهات Google APIs من جهة العميل.

الوصول من جهة الخادم (بلا إنترنت)
يوضّح المثال أدناه كيفية الوصول إلى واجهات Google APIs من جهة الخادم لتوفير الدعم لعميل 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 من جهة الخادم.

عميل تطبيق Chrome

إذا تبيّن لك أنّ تطبيقك يستخدم مسار عنوان IP الاستماع إلى صوتك على عميل تطبيق Chrome، عليك الانتقال إلى استخدام Chrome Identity API.

يوضّح المثال أدناه كيفية الحصول على جميع جهات اتصال المستخدم بدون استخدام معرّف الموارد المنتظم لإعادة التوجيه لعنوان IP الخاص بالاسترجاع.

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.