如果您過去使用 Google 登入
GoogleAuthUtil.getToken
或 Plus.API
,請遷移至最新版
Sign-In API 提高安全性,並提供更優質的使用者體驗。
從存取權杖反模式遷移
請勿將透過 GoogleAuthUtil.getToken
取得的存取權杖傳送至
將後端伺服器視為身分斷言
確保憑證已核發至後端
防止攻擊者取得存取權杖
舉例來說,如果您的 Android 程式碼如以下範例所示,請 將應用程式遷移至目前的最佳做法
在這個範例中,存取權杖要求會使用 oauth2:
加上範圍字串做為
GoogleAuthUtil.getToken
呼叫的 scope
參數
(oauth2:https://www.googleapis.com/auth/plus.login
)。
不使用使用取得的存取權杖進行驗證
GoogleAuthUtil.getToken
,請使用 ID 權杖流程或驗證碼流程。
遷移至 ID 權杖流程
如果只需要取得使用者的 ID、電子郵件地址、姓名或個人資料相片網址即可 使用 ID 權杖流程。
如要遷移至 ID 權杖流程,請進行下列變更:
Android 用戶端
- 若您要求移除「
GET_ACCOUNTS
」(聯絡人) 權限,請移除這項權限 - 使用
GoogleAuthUtil
、Plus.API
或AccountPicker.newChooseAccountIntent()
,或AccountManager.newChooseAccountIntent()
到「Auth.GOOGLE_SIGN_IN_API
」:GoogleSignInOptions.Builder.requestIdToken(...)
設定。
伺服器端
- 為 ID 權杖驗證建立新的端點
- 用戶端應用程式遷移完成後,關閉舊端點
遷移至伺服器驗證碼流程
如果您的伺服器需要存取其他 Google API,例如 Google 雲端硬碟、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
取得 ID 權杖,請遷移至新的
Sign-In API ID 權杖流程。
舉例來說,如果您的 Android 程式碼如以下範例所示,請 migrate:
在此範例中,ID 權杖要求會使用 audience:server:client_id
加上
網路伺服器的用戶端 ID,當做
GoogleAuthUtil.getToken
次通話
(audience:server:client_id:9414861317621.apps.googleusercontent.com
)。
新的 Sign-In API ID 權杖流程有下列優點:
- 輕輕一按即可登入
- 你的伺服器無需額外呼叫網路,就能取得使用者個人資料中的資訊
如要遷移至 ID 權杖流程,請進行下列變更:
Android 用戶端
- 若您要求移除「
GET_ACCOUNTS
」(聯絡人) 權限,請移除這項權限 - 使用
GoogleAuthUtil
、Plus.API
或AccountPicker.newChooseAccountIntent()
,或AccountManager.newChooseAccountIntent()
到「Auth.GOOGLE_SIGN_IN_API
」:GoogleSignInOptions.Builder.requestIdToken(...)
設定。
伺服器端
新的 Sign-In API 會核發符合 OpenID Connect 的 ID 權杖
與使用已淘汰格式的 GoogleAuthUtil.getToken
不同。
具體來說,發卡機構現在是 https://accounts.google.com
,其中的 https
結構定義。
在遷移過程中,您的伺服器需要驗證 新的 Android 用戶端和新用戶端。如要驗證兩種權杖格式,請在 與您所使用的用戶端程式庫相對應的變更 (如果有的話):
- 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.com
」和「accounts.google.com
」
從 GoogleAuthUtil 伺服器驗證碼流程遷移
如果您使用 GoogleAuthUtil
取得伺服器驗證碼,請遷移至
新版 Sign-In API 授權碼流程。
舉例來說,如果您的 Android 程式碼如以下範例所示,請 migrate:
在此範例中,伺服器驗證碼要求使用 oauth2:server:client_id
+
網路伺服器的用戶端 ID,做為scope
GoogleAuthUtil.getToken
呼叫 (oauth2:server:client_id:9414861317621.apps.googleusercontent.com
)。
新的 Sign-In API 驗證碼流程有下列優點:
- 輕輕一按即可登入
- 如果您按照下方的遷移指南操作,伺服器就能取得 ID 權杖 其中包含使用者的個人資料資訊
如要改用新驗證碼流程,請進行下列變更:
Android 用戶端
- 若您要求移除「
GET_ACCOUNTS
」(聯絡人) 權限,請移除這項權限 - 使用
GoogleAuthUtil
、Plus.API
或AccountPicker.newChooseAccountIntent()
,或AccountManager.newChooseAccountIntent()
到「Auth.GOOGLE_SIGN_IN_API
」:GoogleSignInOptions.Builder.requestServerAuthCode(...)
設定。
伺服器端
保留目前的程式碼,但指定 https://oauth2.googleapis.com/token
做為權杖伺服器端點
GoogleAuthorizationCodeTokenRequest
物件,讓您可以取得 ID 權杖
提供使用者的電子郵件地址、使用者 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); ...