Google Reseller API получает GoogleJsonResponseException: 403 запрещено

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

Я сталкиваюсь с 403 Запретным Исключением.

Код (в основном это из примера 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.

1 ответ

Решение

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

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

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

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

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

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

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

Другие вопросы по тегам