2017-01-05 3 views
19

Ich habe eine einfache Test-App eingerichtet, um mit Googles Natural Language API zu interagieren. I created a service account, und heruntergeladen die JSON-Anmeldeinformationen. Ich bin auf einem lokalen Entwicklungscomputer ausgeführt, also setze ich die GOOGLE_APPLICATION_CREDENTIALS Umgebungsvariable auf die JSON-Datei verweisen. Um klar zu sein, funktioniert das: die App führt erfolgreich einige API-Aufrufe aus und zeigt die Ergebnisse an.Google API-Authentifizierung in Java ohne Umgebungsvariable

Ich möchte die Abhängigkeit von der Umgebungsvariablen entfernen. Wie kann ich den bekannten Speicherort der JSON-Datei (oder eines anderen Ansatzes) in der Anwendung verwenden, um die LanguageServiceClient mit diesen Anmeldeinformationen zu erstellen?

Antwort

3

Sie registrieren können, wie das ist:

DatastoreOptions options = DatastoreOptions.newBuilder() 
    .setProjectId(PROJECT_ID) 
    .setAuthCredentials(AuthCredentials.createForJson(
    new FileInputStream(PATH_TO_JSON_KEY))).build(); 

diese Hilfe tut?

+0

Was ich brauche ein 'LanguageServiceClient' ist. Können Sie mich von "DatastoreOptions" zu "LanguageServiceClient" bringen? –

2

Wir verwenden ein Dienstkonto + GoogleCredential.Builder - (Beachten Sie, dass in diesem Beispiel eine Anmeldedatei im Format p12 verwendet wird); Beispiel folgt:

private GoogleCredential authorize() throws IOException, GeneralSecurityException 
{ 
    return new GoogleCredential.Builder() 
    .setTransport(HTTP_TRANSPORT) 
    .setJsonFactory(JSON_FACTORY) 
    .setServiceAccountId(serviceAccount) 
    .setServiceAccountScopes(SCOPES) 
    .setServiceAccountUser(serviceAccountUser) 
    // variable p12File is a String w/ path to the .p12 file name 
    .setServiceAccountPrivateKeyFromP12File(new java.io.File(p12File)) 
     .build(); 
} 
+0

Danke Steve. Kannst du mich von 'GoogleCredential' nach' LanguageServiceClient' bringen? Ich sehe nur nicht, wie man einen 'LanguageServiceClient' mit etwas anderem als den Standard-Anmeldeinformationen der Anwendung über die Umgebungsvariable' GOOGLE_APPLICATION_CREDENTIALS' erzeugt. –

+0

Die Dokumente für den Sprachservice-Client beziehen sich auf einen CredentialsProvider (auf den LanguageServiceSettings). Ich kann nicht alles über meinen Kopf hinweg zusammenfassen, aber ich vermute, dass Sie möglicherweise einen Credentials-Provider erstellen müssen, der Ihre Credentials "bereitstellt" (und sehen Sie die Methode, die ich für ein Beispiel zum Erhalt eines Credentials veröffentlicht habe). Das ist meine beste Schätzung nur von einem Blick. –

1

Dies sieht aus wie ein älterer Thread, aber teilen unsere Erkenntnisse für das, was es wert ist.

Dieses Beispiel ist für den Google ImageAnnotatorClient, aber ich bin mir ziemlich sicher, dass es für LanguageServiceClient sehr ähnlich ist.

Old-School-Google-Bibliotheken (P12-Datei-Ära) verwenden GoogleCredential vs. die neuen GoogleCredentials. Sie sehen sich sehr ähnlich. Ich habe in der Type-Hierarchie einen FixedCredentialsProvider gefunden, der den Trick zu lösen scheint.

Dies funktionierte für uns, wir haben die Google Vision API mit einer vorhandenen P12-Datei ohne Umgebungsvariable ausgeführt. Es sieht so aus, als ob Google möchte, dass wir von diesem Weg abwandern und diesen Ansatz nicht langfristig empfehlen.

// old-school Google Authentication 
HttpTransport httpTransport = GoogleNetHttpTransport.newTrustedTransport(); 
JsonFactory jsonFactory = JacksonFactory.getDefaultInstance(); 

// Spring code 
String pemFile = "yourPemFile.p12"; 
Resource r = new ClassPathResource(pemFile); 
String serviceAccountEmail = "[email protected]"; 

// com.google.api.client.googleapis.auth.oauth2.GoogleCredential.Builder 
Builder credentialBuilder = new GoogleCredential.Builder() 
      .setTransport(httpTransport) 
      .setJsonFactory(jsonFactory) 
      .setServiceAccountId(serviceAccountEmail) 
      .setServiceAccountPrivateKeyFromP12File(r.getFile()); 

// Cloud API endpoints, make sure that the API is enabled 
Collection<String> scopes = Collections.singleton("https://www.googleapis.com/auth/cloud-vision"); 
GoogleCredential credential = credentialBuilder 
      .setServiceAccountScopes(scopes).build(); 

// copy over key values, note the additional "s", set some expiry 
// com.google.auth.oauth2.GoogleCredentials 
GoogleCredentials sac = ServiceAccountCredentials.newBuilder() 
      .setPrivateKey(gc.getServiceAccountPrivateKey()) 
      .setPrivateKeyId(gc.getServiceAccountPrivateKeyId()) 
      .setClientEmail(gc.getServiceAccountId()) 
      .setScopes(scopes) 
      .setAccessToken(new AccessToken(gc.getAccessToken(), new LocalDate().plusYears(1).toDate())) 
      .build(); 

// Latest generation Google libs, GoogleCredentials extends Credentials 
CredentialsProvider cp = FixedCredentialsProvider.create(sac); 
ImageAnnotatorSettings settings = ImageAnnotatorSettings.newBuilder().setCredentialsProvider(cp).build(); 
ImageAnnotatorClient googleApi = ImageAnnotatorClient.create(settings); 
1

Anraten von tokyohans Antwort über Folgen, kann ich bestätigen, das für LanguageServiceClient funktioniert:

// old-school Google Authentication  
    GoogleCredential credential = null; 
    credential = GoogleCredential.fromStream(new FileInputStream("google.json")); 

    Collection<String> scopes = Collections.singleton("https://www.googleapis.com/auth/cloud-language"); 

    if (credential.createScopedRequired()) { 
      credential = credential.createScoped(scopes); 
    } 

    // copy over key values, note the additional "s", set some expiry 
    // com.google.auth.oauth2.GoogleCredentials 
    GoogleCredentials sac = ServiceAccountCredentials.newBuilder() 
       .setPrivateKey(credential.getServiceAccountPrivateKey()) 
       .setPrivateKeyId(credential.getServiceAccountPrivateKeyId()) 
       .setClientEmail(credential.getServiceAccountId()) 
       .setScopes(scopes) 
       .setAccessToken(new AccessToken(credential.getAccessToken(), new LocalDate().plusYears(1).toDate())) 
       .build(); 

    // Latest generation Google libs, GoogleCredentials extends Credentials 
    CredentialsProvider cp = FixedCredentialsProvider.create(sac); 
    LanguageServiceSettings settings = (LanguageServiceSettings) LanguageServiceSettings.newBuilder().setCredentialsProvider(cp).build(); 
    return LanguageServiceClient.create(settings); 
Verwandte Themen