אם שילבתם בעבר את 'כניסה באמצעות חשבון Google' באמצעות GoogleAuthUtil.getToken
או Plus.API
, מומלץ לעבור לממשק Sign-In API העדכני ביותר כדי לשפר את האבטחה ואת חוויית המשתמש.
מעבר ממודל אסימון גישה לא תקין
אין לשלוח אסימוני גישה שהתקבלו באמצעות GoogleAuthUtil.getToken
לשרת הקצה העורפי כטענת נכוֹנוּת של זהות, כי אי אפשר לאמת בקלות שהאסימון הונפק לקצה העורפי, וכך אתם חשופים להוספה של אסימון גישה על ידי תוקף.
לדוגמה, אם הקוד של 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 בין נקודות הקצה (endpoints) הישנות לבין החדשות. לדוגמה:
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
כדי לקבל אסימונים מזהים, עליכם לעבור לתהליך החדש של אסימון מזהה ב-Sign-In API.
לדוגמה, אם הקוד של Android נראה כמו הדוגמה הבאה, צריך לבצע את ההעברה:
בדוגמה, בבקשות לטוקן מזהה נעשה שימוש ב-audience:server:client_id
ובמזהה הלקוח של שרת האינטרנט בתור הפרמטר 'היקף' בקריאה 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
.
במהלך תהליך ההעברה, השרת צריך לאמת את אסימון המזהה גם מהלקוחות הישנים וגם מהלקוחות החדשים של 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 שלכם נראה כמו בדוגמה הבאה, צריך לבצע העברה:
בדוגמה, בבקשות לקוד אימות השרת נעשה שימוש ב-oauth2:server:client_id
+ מזהה הלקוח של שרת האינטרנט בתור הפרמטר scope
בקריאה GoogleAuthUtil.getToken
(oauth2: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.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); ...