מדריך להעברת כתובת IP מסוג הלולאה החוזרת (loopback)

סקירה כללית

ב-16 בפברואר 2022 הודענו על תוכניות לשיפור הבטיחות של האינטראקציות עם Google OAuth באמצעות תהליכי OAuth מאובטחים יותר. המדריך הזה יעזור לכם להבין את השינויים הנדרשים ואת השלבים לביצוע העברה מוצלחת מזרימה של כתובת IP של לולאה חוזרת (loopback) לחלופות נתמכות.

המאמץ הזה הוא אמצעי הגנה מפני מתקפות פישינג ומתחזות לאפליקציות במהלך אינטראקציות עם נקודות הקצה של הרשאות OAuth 2.0 של Google.

מהו תהליך ההעברה של כתובת IP מסוג הלולאה החוזרת (loop)?

התהליך של כתובת ה-IP של הלולאה החוזרת תומך בשימוש בכתובת IP של לולאה חוזרת או ב-localhost כרכיב המארח של ה-URI להפניה אוטומטית, שאליו נשלחים פרטי הכניסה אחרי שמשתמש מאשר בקשת הסכמה ל-OAuth. התהליך הזה חשוף להתקפות אדם בתווך, שבהן אפליקציה זדונית שמשתמשת באותו ממשק לולאה חוזרת במערכות הפעלה מסוימות עלולה ליירט את התגובה משרת ההרשאה ל-URI להפניה האוטומטית שצוין, ולקבל גישה לקוד ההרשאה.

תהליך כתובת ה-IP של הלולאה החוזרת (loopback) יוצא משימוש בסוגי לקוחות OAuth המקוריים ל-iOS, ל-Android ול-Chrome, אבל התמיכה בו תמשיך באפליקציות למחשב.

תאריכי תאימות חשובים

  • 14 במרץ 2022 – לקוחות OAuth חדשים חסומים משימוש בזרימה של כתובת ה-IP ב-Loopback
  • 1 באוגוסט 2022 – יכול להיות שתוצג הודעת אזהרה למשתמשים לגבי בקשות OAuth לא תואמות
  • 31 באוגוסט 2022 – תעבורת כתובות ה-IP של הלולאה החוזרת (loopback) תיחסם ללקוחות OAuth מובנים ל-Android, לאפליקציית Chrome ול-iOS שנוצרו לפני 14 במרץ 2022
  • 21 באוקטובר 2022 – כל הלקוחות הקיימים ייחסמו (כולל לקוחות פטורים)

לגבי בקשות שלא עומדות בדרישות, תוצג הודעת שגיאה למשתמשים. ההודעה תודיע למשתמשים שהאפליקציה חסומה, ותציג את כתובת האימייל לתמיכה שרשמת במסך ההסכמה ל-OAuth במסוף Google API.

יש שני שלבים עיקריים שצריך להשלים כדי להשלים את תהליך ההעברה:
  1. בודקים אם אתם מושפעים מהבעיה.
  2. אם אתם מושפעים מהשינוי, עליכם לעבור לחלופה נתמכת.

איך בודקים אם החשבון שלכם מושפע מהשינוי

בדיקת סוג מזהה הלקוח ב-OAuth

עוברים אל הקטע בקטע ומציגים את סוג מזהה הלקוח ב-OAuth בקטע מזהי לקוח ב-OAuth 2.0. הוא יכול להיות אחד מהאפשרויות הבאות: אפליקציית אינטרנט, Android, iOS, Universal Windows Platform‏ (UWP), אפליקציית Chrome, טלוויזיות ומכשירי קלט מוגבלים, אפליקציה למחשב.

אם סוג הלקוח הוא Android, אפליקציית Chrome או iOS ואתם משתמשים בתהליך של כתובת ה-IP של הלולאה החוזרת (loopback), ממשיכים לשלב הבא.

אם אתם משתמשים בתהליך של כתובת ה-IP של הלולאה החוזרת (loopback) בלקוח OAuth של אפליקציה למחשב, אין צורך לבצע שום פעולה שקשורה להוצאה משימוש הזו, כי השימוש באותו סוג של לקוח OAuth ימשיך להיות נתמך.

איך בודקים אם האפליקציה משתמשת בזרימה של כתובת ה-IP של הלולאה החוזרת

בודקים את קוד האפליקציה או את קריאת הרשת היוצאת (אם האפליקציה משתמשת בספריית OAuth) כדי לקבוע אם בקשת ההרשאה של Google OAuth שהאפליקציה שולחת כוללת ערכים של URI להפניה אוטומטית חזרה (loopback).

בדיקת קוד האפליקציה

בודקים את הקטע בקוד האפליקציה שבו מבצעים קריאות ל נקודות קצה של הרשאה ב-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 ל-loopback עם סוג לקוח OAuth ל-Android או ל-iOS, עליכם לעבור לשימוש ב-SDK המומלצים (Android,‏ iOS).

ה-SDK מאפשר גישה קלה ל-Google APIs ומטפל בכל הקריאות לנקודות הקצה של הרשאות OAuth 2.0 של Google.

בקישורים הבאים למסמכי העזרה מוסבר איך להשתמש ב-SDK המומלצים כדי לגשת לממשקי Google API בלי להשתמש ב-URI להפניה אוטומטית לכתובת IP של לולאה חוזרת.

גישה ל-Google APIs ב-Android

גישה מצד הלקוח

בדוגמה הבאה מוסבר איך לגשת ל-Google APIs בצד הלקוח ב-Android באמצעות ספריית Android המומלצת של Google Identity Services.

  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 API בצד הלקוח ב-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()
}

משתמשים באסימון הגישה כדי לקרוא ל-API, על ידי הכללת אסימון הגישה בכותרת של בקשת REST או gRPC (Authorization: Bearer ACCESS_TOKEN), או על ידי שימוש במאמת של האחזור (GTMFetcherAuthorizationProtocol) עם ספריית הלקוח של Google APIs ל-Objective-C ל-REST.

במדריך הזה מוסבר איך לגשת לממשקי Google API בצד הלקוח. איך לגשת לממשקי 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 API בצד השרת.

לקוח של אפליקציית Chrome

אם קבעת שהאפליקציה שלך משתמשת בתהליך של כתובת ה-IP של הלולאה החוזרת (loopback) בלקוח של אפליקציית 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 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.