我们停止了谷歌登录在JavaScript平台的图书馆网络。对于认证和用户登录,使用新的谷歌身份服务的SDK两种网络Android的替代

从GoogleAuthUtil和Plus.API迁移

如果您以前使用GoogleAuthUtil.getTokenPlus.API与Google Sign-In集成,则应迁移到最新的Sign-In API,以提高安全性和更好的用户体验。

从访问令牌反模式迁移

您不应该将通过GoogleAuthUtil.getToken获得的访问令牌作为身份声明发送到后端服务器,因为您无法轻松地验证令牌是否已发布到后端,从而容易受到攻击者的访问令牌的插入。

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

Android代码

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

代替使用通过GoogleAuthUtil.getToken获取的访问令牌进行身份验证,请使用ID令牌流或auth代码流。

迁移到ID令牌流

如果您只需要用户的ID,电子邮件地址,名称或个人资料图片URL,则使用ID令牌流

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

Android客户端

  • 如果您请求,请删除GET_ACCOUNTS (联系人)权限
  • Auth.GOOGLE_SIGN_IN_APIGoogleSignInOptions.Builder.requestIdToken(...) GoogleAuthUtilPlus.APIAccountPicker.newChooseAccountIntent()AccountManager.newChooseAccountIntent() Auth.GOOGLE_SIGN_IN_APIGoogleSignInOptions.Builder.requestIdToken(...)

服务器端

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

如果您的服务器需要访问其他Google API,例如Google Drive,Youtube或Contacts,请使用服务器身份验证代码流

要迁移到服务器身份验证代码流,请进行以下更改:

Android客户端

  • 如果您要求删除GET_ACCOUNTS (联系人)权限
  • Auth.GOOGLE_SIGN_IN_APIGoogleSignInOptions.Builder.requestServerAuthCode(...) 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代码类似于以下示例,则应进行迁移:

Android代码

在此示例中,ID令牌请求使用audience:server:client_id加上您的Web服务器的客户端ID作为GoogleAuthUtil.getToken调用( audience:server:client_id:9414861317621.apps.googleusercontent.com )的“作用域”参数。

新的登录API ID令牌流具有以下优点:

  • 一键式简化登录体验
  • 您的服务器可以获取用户配置文件信息,而无需额外的网络呼叫

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

Android客户端

  • 如果您请求,请删除GET_ACCOUNTS (联系人)权限
  • Auth.GOOGLE_SIGN_IN_APIGoogleSignInOptions.Builder.requestIdToken(...) GoogleAuthUtilPlus.APIAccountPicker.newChooseAccountIntent()AccountManager.newChooseAccountIntent() Auth.GOOGLE_SIGN_IN_APIGoogleSignInOptions.Builder.requestIdToken(...)

服务器端

与使用不推荐使用的格式的GoogleAuthUtil.getToken不同,新的Sign-In API发出符合OpenID Connect规范的ID令牌。特别是,发行人现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.com : https://accounts.google.comaccounts.google.com

从GoogleAuthUtil服务器身份验证代码流迁移

如果您使用GoogleAuthUtil获取服务器身份验证代码,则应迁移到新的Sign-In API身份验证代码流

例如,如果您的Android代码类似于以下示例,则应进行迁移:

Android代码

在该示例中,服务器身份验证代码请求使用oauth2:server:client_id +您的Web服务器的客户端ID作为GoogleAuthUtil.getToken调用( oauth2:server:client_id:9414861317621.apps.googleusercontent.com )的scope参数。

新的登录API身份验证代码流具有以下优点:

  • 一键式简化登录体验
  • 如果您遵循以下迁移指南,则在执行身份验证代码交换时,您的服务器可以获得包含用户个人资料信息的ID令牌

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

Android客户端

  • 如果您请求,请删除GET_ACCOUNTS (联系人)权限
  • 使用GoogleSignInOptions.Builder.requestServerAuthCode(...)配置将使用GoogleAuthUtilPlus.APIAccountPicker.newChooseAccountIntent()AccountManager.newChooseAccountIntent()任何代码切换到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);
...