راهنمای انتقال جریان نشانی IP مسیریابی بازگشتی

نمای کلی

در ۱۶ فوریه ۲۰۲۲، اعلام کردیم که قصد داریم بااستفاده از جریان‌های OAuth ایمن‌تر، تعاملات Google OAuth را ایمن‌تر کنیم. این راهنما به شما کمک می‌کند تا تغییرات و مراحل لازم برای انتقال موفقیت‌آمیز از جریان نشانی IP برگشت‌به‌خود به جایگزین‌های پشتیبانی‌شده را درک کنید.

این تلاش اقدامی محافظتی دربرابر حملات رمزگیری و جعل هویت برنامه درطول تعامل با نقاط پایانی مجوز OAuth 2.0 در Google است.

جریان «نشانی IP مسیریابی بازگشتی» چیست؟

جریان نشانی IP حلقه برگشتی از استفاده از نشانی IP حلقه برگشتی یا localhost به‌عنوان مؤلفه میزبان URI تغییرمسیر که اعتبارنامه‌ها پس‌از تأیید درخواست رضایت OAuth توسط کاربر به آن ارسال می‌شوند، پشتیبانی می‌کند. این جریان دربرابر حملات مرد میانی آسیب‌پذیر است که در آن یک برنامه مخرب، با دسترسی به همان میانای حلقه برگشتی در برخی سیستم‌عامل‌ها، ممکن است پاسخ سرور مجوز را به URI تغییرمسیر داده‌شده رهگیری کند و به کد مجوز دسترسی پیدا کند.

جریان نشانی IP مسیریابی بازگشتی برای انواع کارخواه OAuth ویژه iOS،‏ Android، و Chrome درحال منسوخ شدن است اما همچنان در برنامه‌های رایانه‌ای پشتیبانی خواهد شد.

تاریخ‌های کلیدی برای رعایت خط‌مشی‌ها

  • ۱۴ مارس ۲۰۲۲ - کارخواه‌های OAuth جدید از استفاده از جریان نشانی IP برگشت‌به‌عقب مسدود شدند
  • ۱ اوت ۲۰۲۲ - ممکن است پیام هشدار سَمت کاربر برای درخواست‌های OAuth ناسازگار نمایش داده شود
  • ۳۱ اوت ۲۰۲۲ - جریان نشانی IP مسیریابی بازگشتی برای کارخواه‌های OAuth ویژه Android، برنامه Chrome، و iOS که قبل‌از ۱۴ مارس ۲۰۲۲ ایجاد شده‌اند مسدود می‌شود
  • ‫۲۱ اکتبر ۲۰۲۲ - همه مشتریان موجود مسدود می‌شوند (ازجمله مشتریان معاف‌شده)

برای درخواست‌های غیرمنطبق، پیام خطای سَمت کاربر نمایش داده خواهد شد. این پیام به کاربران اطلاع می‌دهد که برنامه مسدود شده است و ایمیل پشتیبانی را که در صفحه رضایت OAuth در کنسول Google Cloud ثبت کرده‌اید نمایش می‌دهد.

دو مرحله اصلی برای تکمیل فرایند انتقال وجود دارد:

  1. ببینید آیا تحت‌تأثیر قرار گرفته‌اید یا نه.
  2. اگر تحت تأثیر قرار گرفته‌اید، به روش جایگزین پشتیبانی‌شده‌ای مهاجرت کنید.

تعیین اینکه آیا تحت‌تأثیر قرار گرفته‌اید یا نه

نوع شناسه کارخواه 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>

بازرسی تماس شبکه خروجی

روش بازرسی تماس‌های شبکه بسته به نوع کارخواه برنامه شما متفاوت خواهد بود.

هنگام بازرسی تماس‌های شبکه، درخواست‌های ارسال‌شده به نقطه‌های پایانی مجوز 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 استفاده می‌کند، باید به استفاده از کیت‌های توسعه نرم‌افزار توصیه‌شده (Android،‏ iOS) کوچ کنید.

کیت توسعه نرم‌افزار به شما کمک می‌کند به Google APIs دسترسی پیدا کنید و همه فراخوانی‌ها به نقطه‌های پایانی مجوز OAuth 2.0 Google را مدیریت می‌کند.

پیوندهای اسناد زیر اطلاعاتی درباره نحوه استفاده از کیت‌های توسعه نرم‌افزار توصیه‌شده برای دسترسی به Google API بدون استفاده از URI تغییرمسیر نشانی IP حلقه برگشت ارائه می‌دهند.

دسترسی به Google APIs در Android

دسترسی سمت کارخواه

مثال زیر نشان می‌دهد که چگونه بااستفاده از «کتابخانه Android سرویس‌های مدیریت هویت‌سنجی Google» توصیه‌شده، به Google APIs در سمت کارخواه در 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 API در سمت سرور در 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 برای Objective-C برای REST.

راهنمای دسترسی سمت کارخواه را درباره نحوه دسترسی به Google API در سمت کارخواه مرور کنید.

دسترسی سمت سرور (آفلاین)

مثال زیر نشان می‌دهد که چگونه می‌توان به 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)
    });
   });
 });
};

برای اطلاعات بیشتر درباره نحوه دسترسی به اصالت‌سنجی کاربران و فراخوانی نقاط پایانی Google با Chrome Identity API، راهنمای Chrome Identity API را مرور کنید.