Google Web 登录和查询用户数据的 API
Google APIs for Web sign in and query user data
我正在尝试实施一个将客户端(网页)登录 Google 与服务器端验证和查询用户数据(Java 服务器)相结合的过程。
我做了什么:
在 Google 开发人员控制台中,添加了一个 OAuth 2.0 客户端 ID 凭据。
实现了网页端登录,登录成功后获取ID token
使用后端服务器实现身份验证,如下所述:
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
我正在尝试实施一个将客户端(网页)登录 Google 与服务器端验证和查询用户数据(Java 服务器)相结合的过程。
我做了什么:
在 Google 开发人员控制台中,添加了一个 OAuth 2.0 客户端 ID 凭据。
实现了网页端登录,登录成功后获取ID token
使用后端服务器实现身份验证,如下所述: 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