我们 即将停用适用于网页的 Google 登录 JavaScript 平台库。此库将于 2023 年 3 月 31 日弃用后停止下载。请改用新版网页版 Google Identity Services。
现在,系统会禁止新创建的客户端 ID 使用旧版平台库,现有的客户端 ID 不受影响。在 2022 年 7 月 29 日之前创建的新客户端 ID 可以设置 `plugin_name` 以允许使用 Google 平台库。

从 GoogleAuthUtil 和 Plus.API 迁移

如果您之前使用 GoogleAuthUtil.getTokenPlus.API 集成了 Google 登录功能,则应迁移到最新的 Sign-In API 以增强安全性并改善用户体验。

从访问令牌反模式迁移

请勿将通过 GoogleAuthUtil.getToken 获取的访问令牌作为身份断言发送到后端服务器,因为您无法轻松验证令牌是否已发送到后端,因而很容易受到攻击者的访问令牌的攻击。

例如,如果您的 Android 代码与下面的示例类似,您应将应用迁移到当前的最佳做法。

Android 代码

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

您可以使用 ID 令牌流程或身份验证代码流程,而不要使用通过 GoogleAuthUtil.getToken 获取的访问令牌进行身份验证。

迁移到 ID 令牌流程

如果您只需要用户 ID、电子邮件地址、名称或个人资料照片网址,请使用 ID 令牌流程

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

Android 客户端

  • 根据需要请求 GET_ACCOUNTS(通讯录)权限
  • GoogleAuthUtilPlus.APIAccountPicker.newChooseAccountIntent()AccountManager.newChooseAccountIntent() 中的任何代码切换为采用 GoogleSignInOptions.Builder.requestIdToken(...) 配置的 Auth.GOOGLE_SIGN_IN_API

服务器端

迁移到服务器身份验证代码流程

如果您的服务器需要访问其他 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) 的“范围”参数。

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

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

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

Android 客户端

  • 根据需要请求 GET_ACCOUNTS(通讯录)权限
  • GoogleAuthUtilPlus.APIAccountPicker.newChooseAccountIntent()AccountManager.newChooseAccountIntent() 中的任何代码切换为采用 GoogleSignInOptions.Builder.requestIdToken(...) 配置的 Auth.GOOGLE_SIGN_IN_API

服务器端

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

在迁移过程中,您的服务器需要验证新旧 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 令牌,其中包含用户的电子邮件、用户 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);
...