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

نمای کلی

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

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

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

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

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

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

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

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

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

مثال زیر نشان می‌دهد که چگونه بااستفاده از «کتابخانه Android سرویس‌های مدیریت هویت‌سنجی Google» توصیه‌شده، در سمت کارخواه در Android به Google APIs دسترسی پیدا کنید.

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

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

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

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