使用服务帐户OAuth2消费customerLicense App Marketplace时出错

时间:2014-01-28 15:57:59

标签: google-apps google-oauth google-api-java-client google-api-client google-apps-marketplace

我想出了如何解决这个问题。

首先,我的服务帐户实施:

// Build service account credential.
    GoogleCredential credential = new GoogleCredential.Builder().setTransport(httpTransport)
        .setJsonFactory(JSON_FACTORY)
        .setServiceAccountId(SERVICE_ACCOUNT_EMAIL)
        .setServiceAccountScopes(Collections.singleton("https://www.googleapis.com/auth/appsmarketplace.license"))
        .setServiceAccountPrivateKeyFromP12File(new File("/path/to/mykey/key.p12"))
//            .setServiceAccountUser("NOT SET THIS LINE")
        .build();

        License build = new License.Builder(httpTransport, JSON_FACTORY, credential).setApplicationName("My Application").build();
    Licenses execute = build.customerLicense().get("9999999999", "domain.test.com").execute();

此License Builder对象是我自己基于新的google-api-client 1.17及更高版本的实现。如果有人可以建议我如何与社区其他人分享,我将很乐意这样做。

最佳,


我发布了另一个帖子Google Apps Marketplace API customerLicense with OAuth2,解释了我使用OAuth2服务帐户策略使用此API的意图。

我已尝试过各种方法和官方图书馆,但我总是得到无效的OAuth标题消息或未公开

我将详细说明风景和尝试的内容:

  1. 我和Google App Marketplace使用服务帐户OAuth2,因为所有任务都在后台执行。
  2. 此API项目也有服务帐户密钥和客户端Web帐户密钥。
  3. 我发布的应用仅限于我的域名,因为我还在开发中。所以我为我的域安装了App。
  4. 此时,如果我使用API​​项目ID和客户ID(即域名)查询客户许可证,我必须查看我的域名的APP许可证。
  5. 我使用此jars https://developers.google.com/google-apps/marketplace/v2/developers_guide来访问License API。
  6. 这是我的代码:

    String appName = "MY APP"; AppsMarketService service = new AppsMarketService(); service.appId = "NUMBER_APP_ID"; service.appName = appName; service.endpoint = "https://www.googleapis.com/appsmarket/v2/"; service.consumerKey = service.appId + ".apps.googleusercontent.com"; service.consumerSecret = "CLIENT_SECRET_FROM_WEB_OAUTH2_API_PROJECT"; service.authorize();

  7. 如果我使用此代码,我会被禁止403.

  8. 如果我从我的API项目网站OAuth2更改了前缀clientId的appId,我会获得200但身体无法使用。
  9. 我已将范围添加到我的应用https://www.googleapis.com/auth/appsmarketplace.license,我仍然得到相同的结果。
  10. 我也尝试过使用服务帐户握手从Admin用户获取访问令牌,然后使用该Oauth2访问令牌访问API许可证并获得相同的结果无效的OAuth令牌
  11. 我的问题是:

    1. 有没有办法使用服务帐户密钥访问此API,考虑到服务帐户密钥中没有消费者密钥,只有客户端ID和私钥文件?
    2. 是否有任何更新的库可以将其与OAuth2一起使用,因为我看到所有这些库都使用带有两条腿认证的OAuth1?
    3. 如果有人可以帮助我,那会很棒,因为我们正在尝试根据Google请求将我们的7个Google App旧市场应用程序从OAuth1迁移到OAuth2,但如果我们无法查询,我们的实施中会遇到一些漏洞哪些域名已安装我们的应用程序。

      最佳,

1 个答案:

答案 0 :(得分:0)

除了OAuth2 lib之外,不需要任何其他库。你可以使用urlfetch来证明这一点。

...
import com.google.api.client.googleapis.auth.oauth2.GoogleCredential;
import com.google.api.client.http.HttpTransport;
import com.google.api.client.http.javanet.NetHttpTransport;
import com.google.api.client.json.JsonFactory;
import com.google.api.client.json.jackson2.JacksonFactory;
import com.google.appengine.api.urlfetch.FetchOptions.Builder;
import com.google.appengine.api.urlfetch.HTTPHeader;
import com.google.appengine.api.urlfetch.HTTPMethod;
import com.google.appengine.api.urlfetch.HTTPRequest;
import com.google.appengine.api.urlfetch.HTTPResponse;
import com.google.appengine.api.urlfetch.URLFetchServiceFactory;

...

String SERVICE_ACCOUNT_EMAIL = "...@developer.gserviceaccount.com";
String P12 = "...-privatekey.p12";
// appid is the same id that you have in the google cloud project that has the Google Apps Marketplace API and SDK enabled
String appid = "";

GoogleCredential credential = new GoogleCredential.Builder()
  .setTransport(new NetHttpTransport())
  .setJsonFactory(new JacksonFactory())
  .setServiceAccountId(SERVICE_ACCOUNT_EMAIL)
  .setServiceAccountScopes(Collections.singleton("https://www.googleapis.com/auth/appsmarketplace.license"))
  .setServiceAccountPrivateKeyFromP12File(new File(P12))
  .build();

credential.refreshToken();
String token = credential.getAccessToken();

URL url = new URL("https://www.googleapis.com/appsmarket/v2/licenseNotification/"+appid);

HTTPRequest request = new HTTPRequest(url, HTTPMethod.GET, Builder.allowTruncate());
request.setHeader(new HTTPHeader("Authorization", "Bearer "+token));

HTTPResponse response = URLFetchServiceFactory.getURLFetchService().fetch(request);

您需要安装OAuth2包才能实现此目的。在eclipse中,谷歌>添加Google Apis。