2016-10-25 29 views
0

Google Apps販売代理店API(Found here)を使用するプロジェクトで作業しています。Google Reseller APIがGoogleJsonResponseExceptionを取得しています:403 Forbidden

私は403 Forbidden Exceptionを実行しています。

コード(Googleのコードラボ例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 "禁止された"エラーを返します。

問題を解決するには、データにアクセスできる認証済みユーザーが要求を承認する必要があることを確認してください。やはりReseller API: Authorizing

で注意:リセラーのAPIの許可を付与するユーザーは、ドメインのスーパー管理者である必要があります。

さらに、Token expirationには、付与されたトークンがもはや機能しなくなる可能性を予測するコードを記述することが提案されています。トークンが次のいずれかの理由で機能しなくなる可能性があります。

  • ユーザーがアクセスを取り消しました。
  • トークンは6か月間使用されていません。
  • ユーザーがパスワードを変更し、トークンにGmailスコープが含まれています。
  • ユーザーアカウントが特定の数のトークン要求を超えました。

希望に役立ちます!

+0

私はこの点を検討します – Tristan

+0

私は自分のコードをもう一度見てきました。私はcustomerAuthTokenをAPIにリクエストして送信していないことに気付きました。サービスアカウントを使用している(ドメインスーパー管理者になりすましている)ときに必要ですか? – Tristan

+0

サービスアカウントに関する詳細については、[サーバアプリケーションへのOAuth 2.0の使用](https://developers.google.com/identity/protocols/OAuth2ServiceAccount)を参照してください。 – Teyam