我的设定

后端:使用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文档。

10-06 08:43
查看更多