2015-09-03 2 views
4

Я делаю приложение командной строки java, упакованное в один JAR-файл, который использует некоторые API Google.Использование файла .p12 из пути к классам для GoogleCredential

Мне нужно настроить объект GoogleCredential из закрытого ключа «Credentials.p12».

GoogleCredential credential = new GoogleCredential.Builder() 
        .setTransport(httpTransport) 
        .setJsonFactory(jsonFactory) 
        .setServiceAccountId("[email protected]") 
        .setServiceAccountScopes(Arrays.asList(DirectoryScopes.ADMIN_DIRECTORY_GROUP, DirectoryScopes.ADMIN_DIRECTORY_USER, DirectoryScopes.ADMIN_DIRECTORY_ORGUNIT)) 
        .setServiceAccountUser(emailAccount) 
        //THE CODE BELOW IS IMPORTANT: I need to change this 
        .setServiceAccountPrivateKeyFromP12File(new File("Credentials.p12")) 
        .build(); 

     directory = new Directory.Builder(httpTransport, jsonFactory, credential) 
       .setApplicationName("My Cmd App") 
       .build(); 

Прямо сейчас я был в состоянии сделать его работу, но файл «Credentials.p12» находится за пределами упакованного файла JAR.

Как заставить его работать с помощью файла p12 изнутри JAR?

Из этого documentation единственной альтернативой, которую я могу использовать, является вариант метода, который использует объект PrivateKey. Я имею в виду использования InputStream, чтобы получить файл p12 из пути к классам:

InputStream is = this.getClass().getResourceAsStream("Credentials.p12"); 

Я абсолютно не имею ни малейшего представления о том, как сделать это.

Прежде чем вы ответите, убедитесь, что у вас есть опыт использования библиотеки Google OAuth2. И, пожалуйста, никаких хаков, подобных копированию ресурса во временный файл: единственная версия Credential.p12 должна оставаться внутри JAR по какой-то причине.

+0

Что вы думаете хорошо звучит, вы просто должны заменить FileInputStream здесь http://grepcode.com/file/repo1.maven.org/maven2/com.google.oauth-client/google- oauth-client/1.10.0-beta/com/google/api/client/auth/security/PrivateKeys.java # 82 – zapl

+0

еще одна проблема, которая у меня есть: я абсолютно не знаю, что такое псевдоним и пароль для файла p12, который google предоставляет ... плохо попытаться проверить документы позже. Обновление – CobraEnergyDrink

+0

: ответил на мой собственный вопрос, сделал некоторые копания в структуре файла p12 и использовал предложение @zapl. – CobraEnergyDrink

ответ

5

после рытья через исходный код класса GoogleCredential.Builder я понял следующее:

  • пароль для файла p12 генерируемого из консоли Google, разработчик всегда «notasecret», а также пароль для псевдонима
  • псевдоним для закрытого ключа всегда «PrivateKey»

используя следующий код для создания секретного ключа из InputStream ресурсов:

KeyStore keystore = KeyStore.getInstance("PKCS12"); 
     keystore.load(this.getClass().getClassLoader().getResourceAsStream("Credentials.p12"), "notasecret".toCharArray()); 
     PrivateKey pk = (PrivateKey)keystore.getKey("privatekey", "notasecret".toCharArray()); 

Я был в состоянии загрузить закрытый ключ в GoogleCredential Builder:

GoogleCredential credential = new GoogleCredential.Builder() 
        .setTransport(httpTransport) 
        .setJsonFactory(jsonFactory) 
        .setServiceAccountId("[email protected]") 
        .setServiceAccountScopes(Arrays.asList(DirectoryScopes.ADMIN_DIRECTORY_GROUP, DirectoryScopes.ADMIN_DIRECTORY_USER, DirectoryScopes.ADMIN_DIRECTORY_ORGUNIT)) 
        .setServiceAccountUser(emailAccount) 
        .setServiceAccountPrivateKey(pk) //<----THIS 
        .build(); 
0

Или вы можете просто указать файл ключа при создании экземпляра учетных данных.

GoogleCredential credential = new GoogleCredential.Builder() 
      .setTransport(httpTransport) 
      .setJsonFactory(JSON_FACTORY) 
      .setServiceAccountId(SERVICE_ACCOUNT_EMAIL) 
      .setServiceAccountPrivateKeyFromP12File(new File(KEY_FILE_LOCATION)) 
      .setServiceAccountScopes(AnalyticsScopes.all()) 
      .build(); 
Смежные вопросы