如果您过去使用
GoogleAuthUtil.getToken
或 Plus.API
,您应迁移到最新的
Sign-In API,可提高安全性和用户体验。
从访问令牌反模式进行迁移
您不应将通过 GoogleAuthUtil.getToken
获取的访问令牌发送给
因为您无法轻松验证
该令牌已发送到您的后端,因此很容易被
获取令牌
例如,如果您的 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
(通讯录)权限 - 使用
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
架构。
在迁移过程中,您的服务器需要验证来自二者的 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.com
和accounts.google.com
从 GoogleAuthUtil 服务器授权代码流程迁移
如果您使用 GoogleAuthUtil
获取服务器授权代码,则应迁移至
新的 Sign-In API 身份验证代码流程。
例如,如果您的 Android 代码如下例所示,您应该 migrate:
在此示例中,服务器身份验证代码请求使用 oauth2:server:client_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); ...