העברה מ-GoogleAuthUtil ומ-Plus.API

אם שילבתם בעבר את הכניסה באמצעות חשבון Google באמצעות GoogleAuthUtil.getToken או Plus.API, עליכם לעבור ל-API החדש לכניסה כדי לשפר את האבטחה ואת חוויית המשתמש.

העברה מתבנית נגד אסימון גישה

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

לדוגמה, אם הקוד של Android שלכם נראה כמו בדוגמה שבהמשך, עליכם להעביר את האפליקציה לשיטות המומלצות הנוכחיות.

קוד Android

בדוגמה, בקשות לאסימון גישה משתמשות ב-oauth2: בתוספת מחרוזת היקף בתור הפרמטר scope עבור הקריאה GoogleAuthUtil.getToken (oauth2:https://www.googleapis.com/auth/plus.login).

במקום לבצע אימות באמצעות אסימון גישה שנרכש באמצעות GoogleAuthUtil.getToken, צריך להשתמש בתהליך של האסימון המזהה או בתהליך של קוד ההרשאה.

מעבר לתהליך של אסימון המזהה

אם כל מה שצריך הוא המזהה, כתובת האימייל, השם או כתובת ה-URL של תמונת הפרופיל של המשתמש, תוכלו להשתמש בתהליך של אסימון המזהה.

כדי לעבור לתהליך של אסימון המזהה, מבצעים את השינויים הבאים:

בצד הלקוח ב-Android

  • יש להסיר את ההרשאה לGET_ACCOUNTS (אנשי קשר) אם מבקשים אותה
  • אפשר להחליף כל קוד באמצעות GoogleAuthUtil, Plus.API, AccountPicker.newChooseAccountIntent() או AccountManager.newChooseAccountIntent() ל-Auth.GOOGLE_SIGN_IN_API באמצעות ההגדרות האישיות GoogleSignInOptions.Builder.requestIdToken(...).

בצד השרת

  • צריך ליצור נקודת קצה חדשה עבור אימות של אסימון מזהה
  • השבתה של נקודת הקצה הישנה אחרי ההעברה של אפליקציות הלקוח

מעבר לתהליך של קוד אימות השרת

אם השרת צריך לגשת לממשקי API אחרים של Google, כמו Google Drive, YouTube או אנשי קשר, צריך להשתמש בתהליך הקוד לאימות השרת.

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

בצד הלקוח ב-Android

  • יש להסיר את ההרשאה לGET_ACCOUNTS (אנשי קשר) אם מבקשים אותה
  • אפשר להחליף כל קוד באמצעות GoogleAuthUtil, Plus.API, AccountPicker.newChooseAccountIntent() או AccountManager.newChooseAccountIntent() ל-Auth.GOOGLE_SIGN_IN_API באמצעות ההגדרות האישיות GoogleSignInOptions.Builder.requestServerAuthCode(...).

בצד השרת

עדיין אפשר לשתף את לוגיקת הגישה ל-API בין נקודת הקצה הישנה לחדשה. לדוגמה:

GoogleTokenResponse tokenResponse = new GoogleAuthorizationCodeTokenRequest(...);
String accessToken = tokenResponse.getAccessToken();
String refreshToken = tokenResponse.getRefreshToken();
Long expiresInSeconds = tokenResponse.getExpiresInSeconds();

// Shared by your old and new implementation, old endpoint can pass null for refreshToken
private void driveAccess(String refreshToken, String accessToken, Long expiresInSeconds) {
   GoogleCredential credential = new GoogleCredential.Builder()
           .setTransPort(...)
           ...
           .build();
   credential.setAccessToken(accessToken);
   credential.setExpiresInSeconds(expiresInSeconds);
   credential.setRefreshToken(refreshToken);
}

העברה מתהליך העבודה של אסימון GoogleAuthUtil ID

אם אתם משתמשים ב-GoogleAuthUtil כדי לקבל אסימונים מזהים, אתם צריכים לעבור לתהליך החדש של אסימון מזהה ב-API לכניסה.

לדוגמה, אם הקוד של Android נראה כמו בדוגמה הבאה, עליכם לבצע העברה:

קוד Android

בדוגמה, בקשות לאסימונים מזהים משתמשות ב-audience:server:client_id ובמזהה הלקוח של שרת האינטרנט שלכם כפרמטר 'scope' בקריאה ל-GoogleAuthUtil.getToken (audience:server:client_id:9414861317621.apps.googleusercontent.com).

יש כמה יתרונות לתהליך החדש של אסימון מזהה ב-API לכניסה לחשבון:

  • חוויית כניסה נוחה ופשוטה יותר
  • השרת יכול לקבל את פרטי הפרופיל של המשתמש ללא בקשה נוספת לרשת

כדי לעבור לתהליך של אסימון המזהה, מבצעים את השינויים הבאים:

בצד הלקוח ב-Android

  • יש להסיר את ההרשאה לGET_ACCOUNTS (אנשי קשר) אם מבקשים אותה
  • אפשר להחליף כל קוד באמצעות GoogleAuthUtil, Plus.API, AccountPicker.newChooseAccountIntent() או AccountManager.newChooseAccountIntent() ל-Auth.GOOGLE_SIGN_IN_API באמצעות ההגדרות האישיות GoogleSignInOptions.Builder.requestIdToken(...).

בצד השרת

ה-API החדש לכניסה מנפיק אסימונים מזהים שתואמים למפרט של OpenID Connect, בניגוד ל-GoogleAuthUtil.getToken, שמשתמש בפורמט שהוצא משימוש. באופן ספציפי, המנפיק הוא עכשיו https://accounts.google.com, עם סכימה https.

בתהליך ההעברה, השרת צריך לאמת את אסימון המזהה גם מלקוחות Android הישנים וגם מהחדשים. כדי לאמת את שני הפורמטים של האסימון, מבצעים את השינוי שמתאים לספריית הלקוח שבה אתם משתמשים (אם משתמשים בספרייה):

  • Java (ספריות לקוח של Google APIs): עליך לשדרג לגרסה 1.21.0 ואילך
  • PHP (ספריות לקוח של Google APIs): אם אתם משתמשים בגרסה 1, יש לשדרג ל-1.1.6 ואילך. אם אתם משתמשים בגרסה 2, יש לשדרג ל-2.0.0-RC1 ואילך
  • Node.js: שדרוג ל-0.9.7 ואילך
  • Python או הטמעות משלכם: מקבלים את שני המנפיקים הבאים: https://accounts.google.com וגם accounts.google.com

העברה מזרימת קוד ההרשאה של שרת GoogleAuthUtil

אם אתם משתמשים ב-GoogleAuthUtil כדי לקבל קוד אימות של שרת, עליכם לעבור לתהליך הקוד של ההרשאה החדש לכניסה באמצעות ה-API לכניסה.

לדוגמה, אם הקוד של Android נראה כמו בדוגמה הבאה, עליכם לבצע העברה:

קוד Android

בדוגמה, בקשות לקוד אימות שרת משתמשות ב-oauth2:server:client_id + מזהה הלקוח של שרת האינטרנט שלכם כפרמטר scope עבור הקריאה ל-GoogleAuthUtil.getToken (oauth2:server:client_id:9414861317621.apps.googleusercontent.com).

התהליך החדש של אימות באמצעות API לכניסה כולל כמה יתרונות:

  • חוויית כניסה נוחה ופשוטה יותר
  • אם פועלים לפי מדריך ההעברה שבהמשך, השרת יכול לקבל אסימון מזהה שמכיל את פרטי הפרופיל של המשתמש כשמבצעים החלפה של קוד ההרשאה

כדי לעבור לתהליך החדש של קוד ההרשאה צריך לבצע את השינויים הבאים:

בצד הלקוח ב-Android

  • יש להסיר את ההרשאה לGET_ACCOUNTS (אנשי קשר) אם מבקשים אותה
  • אפשר להחליף כל קוד באמצעות GoogleAuthUtil, Plus.API, AccountPicker.newChooseAccountIntent() או AccountManager.newChooseAccountIntent() ל-Auth.GOOGLE_SIGN_IN_API באמצעות ההגדרות האישיות GoogleSignInOptions.Builder.requestServerAuthCode(...).

בצד השרת

לשמור את הקוד הנוכחי, אבל לציין את https://oauth2.googleapis.com/token כנקודת הקצה של שרת האסימון כשיוצרים את האובייקט GoogleAuthorizationCodeTokenRequest, כדי לקבל אסימון מזהה עם כתובת האימייל, מזהה המשתמש ופרטי הפרופיל של המשתמש ללא צורך בקריאת רשת נוספת. נקודת הקצה הזו תואמת לחלוטין לאחור, והקוד שלמטה יפעל לקודי אימות של שרת שאוחזרו גם מיישום הלקוח הישן וגם מיישום החדש של לקוח Android.

GoogleTokenResponse tokenResponse = new GoogleAuthorizationCodeTokenRequest(
                transport,
                jsonFactory,
                // Use below for tokenServerEncodedUrl parameter
                "https://oauth2.googleapis.com/token",
                clientSecrets.getDetails().getClientId(),
                clientSecrets.getDetails().getClientSecret(),
                authCode,
                REDIRECT_URI)
               .execute();

...

// You can also get an ID token from auth code exchange.
GoogleIdToken googleIdToken = tokenResponse.parseIdToken();
GoogleIdTokenVerifier verifier = new GoogleIdTokenVerifier.Builder(transport, jsonFactory)
        .setAudience(Arrays.asList(SERVER_CLIENT_ID))
        .setIssuer("https://accounts.google.com")
        .build();
// Refer to ID token documentation to see how to get data from idToken object.
GoogleIdToken idToken = verifier.verify(idTokenString);
...