我正在尝试实施一个将客户端(网页)上的Google登录与服务器端验证和查询用户数据(Java服务器)相结合的流程。
我做了什么:
在Google开发者控制台中,添加了OAuth 2.0客户端ID凭据。
在网页上实施了登录,并在成功登录后获得了ID令牌。
使用后端服务器实现身份验证,如下所述: 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密钥或服务帐户)?
答案 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