3

我在 Android 上使用 Google Play 服务来访问 Google APIs 和 Google Cloud Endpoints。我还可以使用来自 Google Play 服务的令牌访问 appengine User api。这可能吗?此链接中有一些 OAuth 的示例代码,但有点模糊。我可以在标头中传递 oauth 令牌并使用以下代码获取用户吗?

    User user = null;
    try {
        OAuthService oauth = OAuthServiceFactory.getOAuthService();
        user = oauth.getCurrentUser();

    } catch (OAuthRequestException e) {
        // The consumer made an invalid OAuth request, used an access token that was
        // revoked, or did not provide OAuth information.
        // ...
    }
4

1 回答 1

6

您可以,但这种方法不会像您所处的场景那样安全:

  • 为 Google API 使用特定于服务的范围
  • 直接访问 Endpoints API

您可以使用 Google Play 服务来获取您想要使用的范围的令牌。由于您对在UsersApp Engine 上使用 API 感兴趣,因此您需要以下userinfo.email范围:

String mScope = "https://www.googleapis.com/auth/userinfo.email";
try {
    token = GoogleAuthUtil.getToken(mActivity, mEmail, mScope);
} catch {
    ...
}

通过 Authorization 标头将其发送到 App Engine:

Authorization: Bearer your_token

然后,使用OAuthAPI,您可以获得一个User对象:

String mScope = "https://www.googleapis.com/auth/userinfo.email";
User user = null;
try {
  OAuthService oauth = OAuthServiceFactory.getOAuthService();
  user = oauth.getCurrentUser(mScope);
} catch (OAuthRequestException e) {
  // The consumer made an invalid OAuth request, used an access token that was
  // revoked, or did not provide OAuth information.
  // ...
}

但是,一般来说你不想这样做!userinfo.email如果您以这种方式保护您的应用程序,另一个用户可以编写一个应用程序,请求您对您的范围授予权限。一旦授予,他们需要做的就是获取令牌并将其传递给您的应用程序,它们就会像您一样出现。端点和其他 Google API 有额外的逻辑来防止这种行为,这就是为什么你最好使用其中一种方法。

于 2012-11-21T21:08:23.127 回答