我的设定
后端:使用Endpoint内置身份验证的带有Google Cloud Endpoints的Google App Engine(Java)
前端:AngularJS Web应用程序
问题
我需要为我的用户获取Google+个人资料。关键字“我”通常可用于获取当前用户的Google+个人资料,但是由于Google Cloud Endpoints中的所有身份验证都是在后台进行的,因此我仍然看不到要获取凭据或令牌的信息当前用户。您所得到的都是com.google.appengine.api.users.User
对象。
使用Google Cloud Endpoint的内置身份验证时,是否可以通过任何方式获取用户凭据或访问令牌?
注意:Google+个人资料ID与Google帐户ID不同。
可能的解决方案
我可以仅将Google+ JS客户端与关键字“ me”一起使用,并让用户发送其Google+ ID,然后将其存储并与他们的Google帐户ID绑定在一起,但这是非常不安全的,因为用户可能会破解发送任何Google+帐户的ID。
最佳答案
使用Google Cloud Endpoint的内置身份验证时,可以获取用户访问令牌。
如下所示,将参数HttpServletRequest request
添加到您的Google Cloud端点。这将使您获得原始请求。
然后,您需要检索名为Authentication的标头。这将获得一个Bearer访问令牌,该令牌将允许您构建凭据以模拟已认证的用户。
接下来,您将使用该Bearer访问令牌来构建com.google.api.client.googleapis.auth.oauth2.GoogleCredential
对象。您将需要此来构建Plus服务。
使用Plus构建器使用刚刚创建的凭证来构建Plus服务对象。
样例代码
@ApiMethod(path = "myPath")
public void myEndpoint(HttpServletRequest request, ParmOne paramOne, ...) throws OAuthRequestException {
if (user == null) {
throw new OAuthRequestException("Authentication error!");
}
GoogleCredential credentialAsUser = new GoogleCredential().setAccessToken(request.getHeader("Authorization").substring(7)); // Start string at index position 7 to remove prefix "Bearer" from token.
Plus plus = new Plus.Builder(new UrlFetchTransport(), new JacksonFactory(), credentialAsUser).setApplicationName("my-app").build();
Person profile = plus.people().get("me").execute();
}
文献资料
可以在here中找到Google Plus客户端的Java文档。
可以在here中找到有关创建Google凭据的说明的Java文档。