העברה מ-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

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

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

קוד Android

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

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

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

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

בצד הלקוח ב-Android

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

בצד השרת

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

במהלך ההעברה, השרת שלך צריך לאמת אסימון מזהה משני החשבונות את לקוחות 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 כדי לקבל קוד הרשאה לשרת, צריך לעבור אל תהליך חדש של קוד אימות ב-Sign-In API.

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

קוד 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, כדי לקבל אסימון מזהה עם כתובת האימייל, מזהה המשתמש ופרטי הפרופיל של המשתמש, ללא צורך שיחת רשת. נקודת הקצה (endpoint) הזו תואמת באופן מלא לאחור, והקוד שבהמשך יפעלו עבור קודי אימות שרת שאוחזרו ממכשיר Android הישן וגם ממכשיר 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);
...