从 GoogleAuthUtil 和 Plus.API 迁移

如果您过去使用 GoogleAuthUtil.getTokenPlus.API,您应迁移到最新的 Sign-In API,可提高安全性和用户体验。

从访问令牌反模式进行迁移

您不应将通过 GoogleAuthUtil.getToken 获取的访问令牌发送给 因为您无法轻松验证 该令牌已发送到您的后端,因此很容易被 获取令牌

例如,如果您的 Android 代码如以下示例所示,您应该 以便应用遵循现行最佳实践

Android 代码

在此示例中,访问令牌请求使用 oauth2: 和范围字符串作为 用于 GoogleAuthUtil.getToken 调用的 scope 参数 (oauth2:https://www.googleapis.com/auth/plus.login)。

无需使用从 Google Cloud 获取的访问令牌进行身份验证 GoogleAuthUtil.getToken,请使用 ID 令牌流程或身份验证代码流程。

迁移到 ID 令牌流程

如果您只需要用户的 ID、电子邮件地址、姓名或个人资料照片网址, 请按照 ID 令牌流程操作。

如需迁移到 ID 令牌流程,请进行以下更改:

Android 客户端

  • 应请求移除 GET_ACCOUNTS(通讯录)权限
  • 使用 GoogleAuthUtilPlus.APIAccountPicker.newChooseAccountIntent()AccountManager.newChooseAccountIntent()Auth.GOOGLE_SIGN_IN_APIGoogleSignInOptions.Builder.requestIdToken(...) 配置。

服务器端

迁移到服务器授权代码流程

如果您的服务器需要访问其他 Google API(例如 Google 云端硬盘、YouTube、 或通讯录,请使用服务器授权代码流程

如需迁移到服务器授权代码流程,请进行以下更改:

Android 客户端

  • 应请求移除 GET_ACCOUNTS(通讯录)权限
  • 使用 GoogleAuthUtilPlus.APIAccountPicker.newChooseAccountIntent()AccountManager.newChooseAccountIntent()Auth.GOOGLE_SIGN_IN_APIGoogleSignInOptions.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:

Android 代码

在此示例中,ID 令牌请求使用 audience:server:client_id 加上 您网络服务器的客户端 ID 作为 GoogleAuthUtil.getToken 次通话 (audience:server:client_id:9414861317621.apps.googleusercontent.com)。

新的 Sign-In API ID 令牌流程具有以下优势:

  • 简化的一键式登录体验
  • 您的服务器无需额外网络调用即可获取用户个人资料信息

如需迁移到 ID 令牌流程,请进行以下更改:

Android 客户端

  • 应请求移除 GET_ACCOUNTS(通讯录)权限
  • 使用 GoogleAuthUtilPlus.APIAccountPicker.newChooseAccountIntent()AccountManager.newChooseAccountIntent()Auth.GOOGLE_SIGN_IN_APIGoogleSignInOptions.Builder.requestIdToken(...) 配置。

服务器端

新版 Sign-In API 会颁发符合 OpenID Connect 的 ID 令牌 与使用已弃用格式的 GoogleAuthUtil.getToken 不同。 具体而言,发卡机构现在为 https://accounts.google.com,具有 https 架构。

在迁移过程中,您的服务器需要验证来自二者的 ID 令牌 新旧 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.comaccounts.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)。

新的 Sign-In API 身份验证代码流程具有以下优势:

  • 简化的一键式登录体验
  • 如果您按照下面的迁移指南进行操作,您的服务器可以获取 ID 令牌 在您进行授权代码交换时包含用户个人资料信息

如需迁移到新的身份验证代码流程,请进行以下更改:

Android 客户端

  • 应请求移除 GET_ACCOUNTS(通讯录)权限
  • 使用 GoogleAuthUtilPlus.APIAccountPicker.newChooseAccountIntent()AccountManager.newChooseAccountIntent()Auth.GOOGLE_SIGN_IN_APIGoogleSignInOptions.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);
...