2016-10-25 5 views
0

Я работаю над проектом, использующим API реселлера Google Apps (Found here).API Google Reseller, получающий сообщение GoogleJsonResponseException: 403 Запрещено

Я столкнулся с Запрещенным Исключением 403.

кода (большинство его происхождение от Google Codelab Пример Here:.

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: Manage Subscriptions, что

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

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

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

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

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

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

+0

Я рассмотрю это, спасибо – Tristan

+0

Я снова посмотрел на свой код, заметив, что я не отправляю customerAuthToken с запросом API. Это необходимо, когда я использую учетную запись службы (которая олицетворяет супер-администратора домена)? – Tristan

+0

Для получения подробной информации об учетных записях служб вы можете ознакомиться с [Использование OAuth 2.0 для приложений сервера и сервера] (https://developers.google.com/identity/protocols/OAuth2ServiceAccount). – Teyam

Смежные вопросы