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

时间:2015-12-06 13:58:22

标签: google-api google-api-java-client google-signin

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

我做了什么:

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

  2. 在网页上实施了登录,并在成功登录后获得了ID令牌。

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

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

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

    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密钥或服务帐户)?

1 个答案:

答案 0 :(得分:1)

ID令牌代表身份验证,而不是授权。因此,您只能使用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