نظرة عامة
في 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 للاسترجاع
- 1 أغسطس 2022: قد تظهر رسالة تحذير موجّهة للمستخدمين بشأن طلبات OAuth غير المتوافقة
- 31 أغسطس 2022: حظر مسار عنوان IP الاستماع إلى صوتك لعملاء OAuth على أجهزة Android وتطبيق Chrome وأجهزة iOS الذين تم إنشاؤهم قبل 14 مارس 2022
- 21 أكتوبر 2022: سيتم حظر جميع العملاء الحاليين (بما في ذلك العملاء المستثنون)
ستظهر رسالة خطأ موجّهة للمستخدمين في حال إرسال طلبات غير متوافقة. ستُعلم الرسالة المستخدمين بأنّ التطبيق محظور، وستعرض عنوان البريد الإلكتروني المخصّص للدعم الذي سجّلته في شاشة طلب الموافقة المتعلّقة ببروتوكول OAuth في Google Cloud Console.
هناك خطوتان رئيسيتان يجب إكمالهما لإتمام عملية نقل البيانات:
- تحديد ما إذا كنت متأثرًا بهذه المشكلة
- يُرجى نقل البيانات إلى طريقة أخرى متوافقة إذا تأثرت بهذا التغيير.
تحديد ما إذا كنت متأثرًا
مراجعة نوع تطبيق OAuth
انتقِل إلى صفحة "العملاء" في Google Cloud Console واطّلِع على نوع تطبيق OAuth ضمن قسم معرّفات عملاء OAuth 2.0. سيكون أحد الخيارات التالية: تطبيق ويب أو Android أو iOS أو منصة Windows العالمية (UWP) أو تطبيق Chrome أو أجهزة التلفزيون والأجهزة ذات الإدخال المحدود أو تطبيق متوافق مع الكمبيوتر المكتبي.
انتقِل إلى الخطوة التالية إذا كان نوع تطبيقك هو Android أو تطبيق Chrome أو iOS وكنت تستخدم مسار عنوان IP الاستماع إلى صوتك.
ليس عليك اتخاذ أي إجراء بشأن هذا الإيقاف النهائي إذا كنت تستخدم مسار عنوان IP للاسترجاع في عميل OAuth لتطبيق متوافق مع الكمبيوتر المكتبي، لأنّنا سنواصل إتاحة استخدام هذا النوع من تطبيقات OAuth.
كيفية تحديد ما إذا كان تطبيقك يستخدم مسار عنوان IP للاسترجاع
افحص رمز تطبيقك أو طلب الشبكة الصادر (في حال كان تطبيقك يستخدم مكتبة OAuth) لتحديد ما إذا كان طلب التفويض الذي يرسله تطبيقك عبر Google OAuth يستخدم قيم عناوين URI لإعادة التوجيه عبر الاسترجاع.
فحص الرمز البرمجي للتطبيق
راجِع قسم الرمز البرمجي للتطبيق الذي تُجري فيه طلبات إلى نقاط نهاية التفويض في 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>
فحص طلب الشبكة الصادر
ستختلف طريقة فحص طلبات الشبكة حسب نوع تطبيقك.
- تطبيق ويب: فحص نشاط الشبكة على Chrome
- Android: فحص حركة بيانات الشبكة باستخدام "أداة فحص الشبكة"
- تطبيقات Chrome
- انتقِل إلى صفحة إضافات Chrome
- ضَع علامة في مربّع الاختيار وضع مطوّر البرامج في أعلى يسار صفحة الإضافة.
- اختَر الإضافة التي تريد مراقبتها
- انقر على رابط صفحة الخلفية في قسم فحص طرق العرض في صفحة الإضافة
- سيظهر مربّع حوار أدوات المطوّرين حيث يمكنك مراقبة حركة بيانات الشبكة في علامة التبويب "الشبكة"
- iOS: تحليل عدد زيارات HTTP باستخدام Instruments
- التطبيقات المتوافقة مع الكمبيوتر المكتبي: استخدِم أداة لتسجيل بيانات الشبكة متاحة لنظام التشغيل الذي تم تطوير التطبيق من أجله
أثناء فحص طلبات الشبكة، ابحث عن الطلبات المُرسَلة إلى نقاط نهاية التفويض في 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 APIs بدون استخدام عنوان URI لإعادة التوجيه لعنوان IP للاسترجاع.
الوصول إلى Google APIs على Android
الوصول من جهة العميل
يوضّح المثال التالي كيفية الوصول إلى Google APIs من جهة العميل على أجهزة Android باستخدام مكتبة Google Identity Services Android المقترَحة.
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));
مرِّر authorizationResult إلى الطريقة المحدّدة لحفظ المحتوى في
مجلد Drive الخاص بالمستخدم. يحتوي authorizationResult على طريقة getAccessToken() التي تُنتج رمز الدخول.
الوصول من جهة الخادم (بلا إنترنت)
يوضّح المثال التالي كيفية الوصول إلى Google APIs من جهة الخادم على أجهزة Android.
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() التي تعرض رمز التفويض الذي يمكنك إرساله إلى الخلفية للحصول على رمز مميز للدخول ورمز مميز لإعادة التحميل.
الوصول إلى Google APIs في تطبيق 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 <var>ACCESS_TOKEN</var>)، أو باستخدام أداة التفويض (GTMFetcherAuthorizationProtocol) مع مكتبة عملاء Google APIs للغة Objective-C لـ REST.
راجِع دليل الوصول من جهة العميل لمعرفة كيفية الوصول إلى 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 APIs من جهة الخادم.
برنامج لتطبيق Chrome
إذا تبيّن لك أنّ تطبيقك يستخدم مسار عنوان IP الاستماع إلى صوتك على عميل تطبيق Chrome، عليك الانتقال إلى استخدام Chrome Identity API.
يوضّح المثال التالي كيفية الحصول على جميع جهات اتصال المستخدم بدون استخدام عنوان URI لإعادة التوجيه لعنوان IP للاسترجاع.
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.