Google Web 登录和查询用户数据的 API

Google APIs for Web sign in and query user data

我正在尝试实施一个将客户端(网页)登录 Google 与服务器端验证和查询用户数据(Java 服务器)相结合的过程。

我做了什么:

  1. 在 Google 开发人员控制台中,添加了一个 OAuth 2.0 客户端 ID 凭据。

  2. 实现了网页端登录,登录成功后获取ID token

  3. 使用后端服务器实现身份验证,如下所述: https://developers.google.com/identity/sign-in/web/backend-auth。这部分也有效,我可以验证身份验证并获取用户的电子邮件地址。

我现在需要做的是获取用户的个人资料信息,即姓名和访问应用程序文件夹,以存储相关应用程序数据。

这是我的服务器端代码。我标记了需要帮助的部分:

GoogleIdTokenVerifier verifier = new GoogleIdTokenVerifier.Builder(HTTP_TRANSPORT, JSON_FACTORY)
.setAudience(Arrays.asList(service.getClientId()))
.build();

GoogleIdToken idToken = null;
try {
    idToken = verifier.verify(token); // token is the ID token received from the client
} catch (GeneralSecurityException e) {
    e.printStackTrace();
} catch (IOException e) {
    e.printStackTrace();
}
if (idToken != null) {
    GoogleIdToken.Payload payload = idToken.getPayload();
    payload.getEmail() <== This works

    /*
    Here I need to query Google API per the available application scopes: profile, app storage etc.
    */
}

现阶段可以使用API吗?如果没有,我可以在这里请求访问令牌吗?我应该使用客户端 ID 还是需要不同类型的凭据(例如 API 密钥或服务帐户)?

ID Token代表的是认证,不是授权。因此,您将无法仅使用 ID 令牌访问 Google API。

为了从服务器端向 Google API 发出请求,请在客户端执行以下操作。

var auth2 = gapi.auth2.getAuthInstance();
auth2.grantOfflineAccess({
  scope: 'SCOPES_COMES_HERE'
}).then(function(resp) {
  // send `resp.code` to server to exchange it with
  // credentials (access_token, refresh_token
});

code是与access_token交换的密钥。

您可能倾向于同时实施身份验证和授权,但Google的建议是将它们分开并在需要时请求权限(增量授权)。保留当前代码并添加上面+处理 code 的服务器端以与 access_token.

交换

详细文档:https://developers.google.com/identity/sign-in/web/server-side-flow