我正在尝试实现一个将谷歌客户端登录(网页)与服务器端验证和查询用户数据(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密钥或服务帐户)?
ID Token表示身份验证,而不是授权。因此,您将无法仅使用ID Token访问Google API。
为了从服务器端向GoogleAPI发出请求,请在客户端执行以下操作。
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进行交换的密钥。
您可能倾向于同时实现身份验证和授权,但谷歌的建议是将它们分开,并根据需要请求权限(增量授权)。保留当前代码并添加上面+处理code
的服务器端与access_token进行交换。
详细文档:https://developers.google.com/identity/sign-in/web/server-side-flow