Google Reseller API получает GoogleJsonResponseException: 403 Forbidden

Я работаю над проектом, в котором используется API реселлера Google Apps (Найти здесь).

Я сталкиваюсь с 403 Forbidden Exception.

Код (большая часть взята из примера Google Codelab здесь< /а>:

try {
        try {

        Reseller service = GoogleResellerApiUtil.getResellerService();

        Customer customerRecord = service.customers().get("acme.com").execute(); //crashes here
    // "acme.com" is also used in the example from Google
        System.out.println(customerRecord.toString());


    } catch (GoogleJsonResponseException e) {
        e.printStackTrace();
    }

И это класс, который я использую для подключения к API. Я предоставил файл p12, и он использует учетную запись службы, при вызове API он выдает себя за одного из суперадминистраторов, поэтому ему должно быть разрешено совершать все вызовы.

На данный момент я использую только область чтения.

public class GoogleResellerApiUtil {
    /** HTTP_TRANSPORT */
    private static final HttpTransport HTTP_TRANSPORT = new NetHttpTransport();

    /** JSON Factory*/
    private static final JsonFactory JSON_FACTORY = new JacksonFactory();

    /** Service Account Email */
    public static final String SERVICE_ACCOUNT_EMAIL = "****@appspot.gserviceaccount.com";

    /** P12 File Location */
    public static final String PRIVATE_KEY_FILE = "WEB-INF/key.p12";

    /** Reseller Admin Account to impersonate */
    public static final String RESELLER_ADMIN = "**.**@**.com";

    /** Scopes */
    public static final List<String> SCOPES = Arrays.asList(ResellerScopes.APPS_ORDER_READONLY);

    /** Application name. */
    private static final String APPLICATION_NAME = "**-subscription-portal";

    /** Logger */
    private final static Logger LOGGER =
        Logger.getLogger(GoogleResellerApiUtil.class.getName());



    public static GoogleCredential getCredentials() throws IOException {

        GoogleCredential credentials = null;

        try {
            credentials = new GoogleCredential.Builder()
                .setTransport(HTTP_TRANSPORT)
                .setJsonFactory(JSON_FACTORY)
                .setServiceAccountId(SERVICE_ACCOUNT_EMAIL)
                .setServiceAccountScopes(SCOPES)
                .setServiceAccountUser(RESELLER_ADMIN)
                .setServiceAccountPrivateKeyFromP12File(new File(PRIVATE_KEY_FILE))
                .build();
        } catch (GeneralSecurityException e) {
            e.printStackTrace();
        }

        System.out.println("credential has been build, returning credential "); //this gets printed, so I think the credentials are valid?
    return credentials;
}

    /**
     * Build and return an authorized Reseller client service.
     * @return an authorized Reseller client service
     * @throws IOException
     */
    public static Reseller getResellerService() throws Exception {
        Credential credential = getCredentials();
        return new Reseller.Builder(
            HTTP_TRANSPORT, JSON_FACTORY, credential)
            .setApplicationName(APPLICATION_NAME)
            .build();
    }
}

Но при звонке получаю следующее сообщение об ошибке:

com.google.api.client.googleapis.json.GoogleJsonResponseException: 403 OK
{
  "code" : 403,
  "errors" : [ {
    "domain" : "global",
    "message" : "Forbidden",
    "reason" : "forbidden"
  } ],
  "message" : "Forbidden"
}
at com.google.api.client.googleapis.json.GoogleJsonResponseException.from(GoogleJsonResponseException.java:146)
etc. etc. etc.

person Tristan    schedule 25.10.2016    source источник


Ответы (1)


В документе Reseller API: управление подписками указано, что

Примечание. Если customerAuthToken недействителен или срок его действия истек, ответ API возвращает ошибку 403 "Forbidden".

Чтобы решить эту проблему, убедитесь, что запросы должны быть авторизованы аутентифицированным пользователем, имеющим доступ к данным. Как также отмечено в разделе Reseller API: авторизация.

Примечание. Пользователь, дающий разрешение на использование Reseller API, должен быть суперадминистратором домена.

Кроме того, в разделе Срок действия маркера было предложено записать код в предвидеть возможность того, что предоставленный токен может больше не работать. Токен может перестать работать по одной из следующих причин:

  • Пользователь отозвал доступ.
  • Токен не использовался в течение шести месяцев.
  • Пользователь изменил пароли, а токен содержит области действия Gmail.
  • Учетная запись пользователя превысила определенное количество запросов токена.

Надеюсь, это поможет!

person Teyam    schedule 26.10.2016
comment
Я снова посмотрел на свой код и заметил, что не отправляю customerAuthToken с запросом к API. Требуется ли это, когда я использую учетную запись службы (то есть выдаю себя за суперадминистратора домена)? - person Tristan; 27.10.2016
comment
Подробную информацию об учетных записях служб можно найти в разделе Использование OAuth 2.0 для межсерверных приложений. . - person Teyam; 27.10.2016
comment
@Tristan, вам удалось решить проблему с помощью служебной учетной записи, не могли бы вы поделиться исправлением? - person Axel; 18.10.2020