我們即將 停用 Google 登入 Google Web Designer 網頁版程式庫。但 2023 年 3 月 31 日的淘汰日期過後即無法下載。請改用新版網頁版 Google 身分識別服務。
根據預設,新建立的用戶端 ID 現在會遭到封鎖,無法使用舊版平台程式庫,現有的用戶端 ID 則不受影響。凡是在 2022 年 7 月 29 日前建立的用戶端 ID,都可以設定 ‘plugin_name` 來啟用 Google Platform 程式庫。

從 GoogleAuthUtil 和 Plus.API 遷移

如果您先前使用 GoogleAuthUtil.getTokenPlus.API 整合 Google Sign-In,則應遷移至最新的 Sign-In API 以提升安全性,並改善使用者體驗。

從存取權杖禁止模式遷移

您不應使用透過 GoogleAuthUtil.getToken 取得的存取憑證將憑證識別為後端,因為您無法輕易確認憑證是否已傳送至後端,導致攻擊者無法插入存取憑證。

舉例來說,如果您的 Android 程式碼看起來如下方範例,則請將應用程式遷移至目前的最佳做法。

Android 程式碼

在範例中,存取憑證憑證使用 oauth2: 加上範圍字串,做為 GoogleAuthUtil.getToken 呼叫 (oauth2:https://www.googleapis.com/auth/plus.login) 的 scope 參數。

與其透過 GoogleAuthUtil.getToken 取得的存取憑證進行驗證,您可以使用 ID 憑證流程或驗證碼流程。

遷移至 ID 權杖流程

如果您只需要使用者 ID、電子郵件地址、名稱或個人資料相片網址,請使用 ID 憑證流程

如要遷移到 ID 憑證流程,請進行下列變更:

Android 用戶端

  • 要求移除「GET_ACCOUNTS」(聯絡人) 權限
  • 使用 GoogleAuthUtilPlus.APIAccountPicker.newChooseAccountIntent()AccountManager.newChooseAccountIntent() 將任何程式碼切換為使用 GoogleSignInOptions.Builder.requestIdToken(...) 設定的 Auth.GOOGLE_SIGN_IN_API

伺服器端

  • ID 憑證驗證建立新端點
  • 遷移用戶端應用程式後,關閉舊的端點

遷移至伺服器驗證流程

如果您的伺服器需要存取其他 Google API (例如 Google 雲端硬碟、YouTube 或聯絡人),請使用伺服器驗證代碼流程

如要遷移至伺服器驗證碼流程,請進行下列變更:

Android 用戶端

  • 要求移除「GET_ACCOUNTS」(聯絡人) 權限
  • 使用 GoogleAuthUtilPlus.APIAccountPicker.newChooseAccountIntent()AccountManager.newChooseAccountIntent() 將任何程式碼切換為使用 GoogleSignInOptions.Builder.requestServerAuthCode(...) 設定的 Auth.GOOGLE_SIGN_IN_API

伺服器端

不過,您仍然可以在新端點和新端點之間共用 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 來取得 ID 憑證,則應遷移至新的 Sign-In API ID 憑證流程

舉例來說,如果您的 Android 程式碼看起來像下列範例,則應遷移:

Android 程式碼

在範例中,ID 憑證要求使用 audience:server:client_id 加上網路伺服器的用戶端 ID,做為 GoogleAuthUtil.getToken 呼叫 (audience:server:client_id:9414861317621.apps.googleusercontent.com) 的「scope」參數。

新版 Sign-In API ID 憑證流程具備下列優點:

  • 簡單一鍵的登入體驗
  • 您的伺服器不必額外進行網路呼叫,就能取得使用者個人資料資訊

如要遷移到 ID 憑證流程,請進行下列變更:

Android 用戶端

  • 要求移除「GET_ACCOUNTS」(聯絡人) 權限
  • 使用 GoogleAuthUtilPlus.APIAccountPicker.newChooseAccountIntent()AccountManager.newChooseAccountIntent() 將任何程式碼切換為使用 GoogleSignInOptions.Builder.requestIdToken(...) 設定的 Auth.GOOGLE_SIGN_IN_API

伺服器端

新的 Sign-In API 會核發符合 OpenID Connect 規格的 ID 符記,與使用已淘汰格式的 GoogleAuthUtil.getToken 不同。 具體來說,核發單位現在是 https://accounts.google.com 且採用 https 結構定義。

在遷移過程中,您的伺服器必須驗證新舊 Android 用戶端的 ID 憑證。如要驗證憑證的兩種格式,請依據您使用的用戶端程式庫,進行對應的變更:

  • Java (Google API 用戶端程式庫):升級至 1.21.0 或更新版本
  • PHP (Google API 用戶端程式庫):如果您使用的是 v1,請升級至 1.1.6 以上版本;如果您使用的是 v2,請升級至 2.0.0-RC1 以上版本
  • Node.js:升級到 0.9.7 或更高版本
  • Python 或您自己的實作:接受以下兩種核發機構:https://accounts.google.comaccounts.google.com

從 GoogleAuthUtil 伺服器驗證流程遷移

如果您使用 GoogleAuthUtil 來取得伺服器驗證碼,則應遷移至新的 Sign-In API 驗證流程流程

舉例來說,如果您的 Android 程式碼看起來像下列範例,則應遷移:

Android 程式碼

在本範例中,伺服器驗證程式碼要求使用 oauth2:server:client_id + 網路伺服器的用戶端 ID 做為 GoogleAuthUtil.getToken 呼叫 (oauth2:server:client_id:9414861317621.apps.googleusercontent.com) 的 scope 參數。

新版 Sign-In API 驗證碼流程的優點如下:

  • 簡單一鍵的登入體驗
  • 如果您按照下方的遷移指南操作,則當您執行驗證碼交換作業時,您的伺服器即可取得含有使用者個人資訊的 ID 憑證。

如要遷移到新的驗證碼流程,請進行下列變更:

Android 用戶端

  • 要求移除「GET_ACCOUNTS」(聯絡人) 權限
  • 使用 GoogleAuthUtilPlus.APIAccountPicker.newChooseAccountIntent()AccountManager.newChooseAccountIntent() 將任何程式碼切換為使用 GoogleSignInOptions.Builder.requestServerAuthCode(...) 設定的 Auth.GOOGLE_SIGN_IN_API

伺服器端

保留目前的程式碼,但在建構 GoogleAuthorizationCodeTokenRequest 物件時將 https://oauth2.googleapis.com/token 指定為憑證伺服器端點,這樣您就能取得使用者的電子郵件、使用者 ID 和設定檔資訊,而不需要其他網路呼叫。這個端點完全回溯相容,以下程式碼適用於從新舊 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);
...