סקירה כללית
ב-16 בפברואר 2022 הודענו על תוכניות להפוך את האינטראקציות של Google OAuth לבטוחות יותר באמצעות תהליכי OAuth מאובטחים יותר. המדריך הזה יעזור לכם להבין את השינויים והשלבים הנדרשים כדי לעבור בהצלחה מתהליך כתובת ה-IP של הלולאה החוזרת לחלופות נתמכות.
המאמץ הזה הוא אמצעי הגנה מפני מתקפות פישינג והתחזות לאפליקציות במהלך אינטראקציות עם נקודות הקצה של Google לאימות באמצעות OAuth 2.0.
מהו תהליך כתובת ה-IP מסוג הלולאה החוזרת (loop)?
תהליך כתובת ה-IP של לולאת המשוב תומך בשימוש בכתובת IP של לולאת משוב או ב-localhost בתור רכיב המארח של כתובת ה-URI להפניה אוטומטית, שאליה נשלחים פרטי הכניסה אחרי שמשתמש מאשר בקשת הסכמה של OAuth.
התהליך הזה חשוף להתקפות אדם בתווך, שבהן אפליקציה זדונית שניגשת לאותו ממשק לולאה חוזרת במערכות הפעלה מסוימות, יכולה ליירט את התגובה משרת ההרשאות ל-URI הנתון להפניה אוטומטית ולקבל גישה לקוד ההרשאה.
תהליך כתובת ה-IP של הלולאה החוזרת (loopback) יוצא משימוש בסוגי האפליקציות ל-iOS, ל-Android ול-Chrome OAuth, אבל נמשיך לתמוך בו באפליקציות למחשב.
תאריכים חשובים לעמידה בדרישות
- 14 במרץ 2022 – לקוחות OAuth חדשים לא יוכלו להשתמש בתהליך של כתובת IP מסוג Loopback
- 1 באוגוסט 2022 – יכול להיות שתוצג למשתמשים הודעת אזהרה בבקשות OAuth שלא עומדות בדרישות
- 31 באוגוסט 2022 – תהליך כתובת ה-IP של הלולאה החוזרת (loopback) נחסם ללקוחות OAuth ב-Android, באפליקציית Chrome וב-iOS שנוצרו לפני 14 במרץ 2022
- 21 באוקטובר 2022 – כל הלקוחות הקיימים נחסמים (כולל לקוחות פטורים)
בבקשות שלא עומדות בדרישות תוצג הודעת שגיאה למשתמשים. ההודעה תבהיר למשתמשים שהאפליקציה חסומה, ותציג את כתובת האימייל לתמיכה שרשמתם במסך ההסכמה של OAuth במסוף Google Cloud.
כדי להשלים את תהליך ההעברה, צריך לבצע שני שלבים עיקריים:
- איך בודקים אם הבעיה משפיעה על האתר שלכם.
- אם אתם מושפעים מהשינוי, עברו לחלופה נתמכת.
איך בודקים אם הבעיה משפיעה עליכם
בדיקת סוג האפליקציה ב-OAuth
נכנסים לדף Clients במסוף Google Cloud ובודקים את סוג האפליקציה בקטע OAuth 2.0 Client IDs. הוא יהיה אחד מהבאים: אפליקציית אינטרנט, Android, iOS, פלטפורמת Windows אוניברסלית (UWP), אפליקציית Chrome, טלוויזיות ומכשירים עם קלט מוגבל, אפליקציה למחשב.
אם סוג האפליקציה הוא Android, אפליקציית Chrome או iOS, ואתם משתמשים בתהליך של כתובת ה-IP של הלולאה החוזרת (loopback), המשיכו לשלב הבא.
אם אתם משתמשים בתהליך של כתובת IP של לולאה חזרה (loopback) בלקוח OAuth של אפליקציה למחשב, אתם לא צריכים לעשות שום דבר בקשר להוצאה משימוש, כי נמשיך לתמוך בשימוש בסוג הזה של אפליקציית OAuth.
איך בודקים אם האפליקציה משתמשת בתהליך של כתובת IP מסוג לולאה חזרה (loopback)
בודקים את קוד האפליקציה או את הקריאה היוצאת לרשת (אם האפליקציה משתמשת בספריית 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 – בדיקת התנועה ברשת באמצעות Network Inspector
- אפליקציות 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 API בלי להשתמש בכתובת URI להפניה אוטומטית של כתובת IP של לולאה חזרה.
גישה ל-Google APIs ב-Android
גישה מצד הלקוח
בדוגמה הבאה מוסבר איך לגשת לממשקי Google API בצד הלקוח ב-Android באמצעות ספריית Android המומלצת של Google Identity Services.
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 יש את ה-method 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 יש את ה-method 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() }
משתמשים באסימון הגישה כדי לשלוח קריאה ל-API, על ידי הכללת אסימון הגישה בכותרת של בקשת REST או gRPC (Authorization: Bearer <var>ACCESS_TOKEN</var>), או על ידי שימוש במאשר של ה-fetcher (GTMFetcherAuthorizationProtocol) עם ספריית הלקוח של Google APIs ל-Objective-C ל-REST.
במדריך לגישה בצד הלקוח מוסבר איך לגשת ל-Google APIs בצד הלקוח.
גישה בצד השרת (אופליין)
בדוגמה הבאה מוסבר איך לגשת לממשקי Google API בצד השרת כדי לתמוך בלקוח 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 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 מוסבר איך לאמת משתמשים ולקרוא לנקודות קצה (endpoint) של Google באמצעות Chrome Identity API.