Доступ к сервису через java google api

Я пытаюсь получить доступ к API управления AdSense, используя java google-api. Однако у меня возникли проблемы с аутентификацией oauth2. Согласно документу, следующего кода должно быть достаточно:

public static GoogleCredential getCredential() 
   throws GeneralSecurityException, IOException {
    File file = new File("key.p12");
    return new GoogleCredential.Builder().setTransport(HTTP_TRANSPORT).setJsonFactory(JSON_FACTORY)
            .setServiceAccountId(SERVICE_ACCOUNT_ID)
            .setServiceAccountScopes(AdSenseScopes.ADSENSE)
            .setServiceAccountPrivateKeyFromP12File(file)
            .setServiceAccountUser(ACCOUNT_USER)
            .build();
}

Однако учетные данные всегда возвращают значение accessToken null, и я не могу выполнить какую-либо операцию. Я получаю плохой запрос:

Exception in thread "main" java.lang.RuntimeException:   com.google.api.client.auth.oauth2.TokenResponseException: 400 Bad Request
{
  "error" : "invalid_grant"
}

Мой клиентский код:

private static AdSense initializeAdsense() throws Exception {
    // Authorization.
    Credential credential = getCredential();        
    String token = credential.getAccessToken();
    System.out.println(token);
    AdSense adsense = new AdSense.Builder(new NetHttpTransport(), JSON_FACTORY, credential).setApplicationName("Google-AdSenseSample/1.2").build();
    return adsense;
}

public static Accounts run(AdSense adsense, int maxPageSize) throws Exception {
    System.out.println("=================================================================");
    System.out.println("Listing all AdSense accounts");
    System.out.println("=================================================================");

    // Retrieve account list in pages and display data as we receive it.
    String pageToken = null;
    Accounts accounts = null;
    do {
        accounts = adsense.accounts().list().setMaxResults(maxPageSize).setPageToken(pageToken).execute();

        if ((accounts.getItems() != null) && !accounts.getItems().isEmpty()) {
            for (Account account : accounts.getItems()) {
                System.out.printf("Account with ID \"%s\" and name \"%s\" was found.\n", account.getId(), account.getName());
            }
        } else {
            System.out.println("No accounts found.");
        }

        pageToken = accounts.getNextPageToken();
    } while (pageToken != null);

    System.out.println();
    return accounts;
}

public static void test() throws Exception {
    AdSense adsense = initializeAdsense();
    run(adsense, 30);
}

Вопрос, в конце концов, что не так?

Отредактировано: Может быть, я просто не могу этого сделать.

Я боюсь, что доступ к API управления AdSense через аутентификацию сервисного аккаунта не поддерживается, так как это защищенная информация пользователя.

https://groups.google.com/forum/#!msg/adsense-api/j-gQsp_fE94/CrOPhRLv4WUJ


person rdllopes    schedule 18.12.2012    source источник


Ответы (1)


SERVICE_ACCOUNT_ID должен быть адресом электронной почты вашей учетной записи службы ([email protected]) и не задавать ACCOUNT_USER.

person bancsy    schedule 20.12.2012
comment
Возможно, это был правильный ответ, я уже пробовал это. В этом случае я получаю: Exception in thread "main" java.lang.RuntimeException: com.google.api.client.googleapis.json.GoogleJsonResponseException: 403 Forbidden { "code" : 403, "errors" : [ { "domain" : "global", "message" : "User does not have an AdSense account.", "reason" : "noAdSenseAccount" } ], "message" : "User does not have an AdSense account." } at Test.main(Test.java:28) - person rdllopes; 20.12.2012