Ich versuche, die oauth-API zu verwenden, um ein Google-Dienstkonto über die Java-API zu authentifizieren. Ich hoffe, damit auf Google BigQuery zugreifen zu können. Ich erhalte eine "ungültige Genehmigung", die von meinen API-Anfragen zurückgegeben wird. HierAuthentifizieren von Google API mit einem Dienstkonto mit Java-API
ist der Code, der eine Kopie eines Standardauthentifizierung Beispiel (das nicht für BigQuery war .. aber eine andere Google API):
/** Global instance of the HTTP transport. */
private static final HttpTransport HTTP_TRANSPORT = new NetHttpTransport();
/** Global instance of the JSON factory. */
private static final JsonFactory JSON_FACTORY = new JacksonFactory();
private static Bigquery bigquery;
public ServiceAccountExample() {
try {
try {
GoogleCredential credential = new GoogleCredential.Builder().setTransport(HTTP_TRANSPORT)
.setJsonFactory(JSON_FACTORY)
.setServiceAccountId(SERVICE_ACCOUNT_EMAIL)
.setServiceAccountScopes(BigqueryScopes.BIGQUERY)
.setServiceAccountPrivateKeyFromP12File(new File("GoogleBigQuery-privatekey.p12"))
//.setRefreshListeners(refreshListeners)
//.setServiceAccountUser("email.com")
.build();
credential.refreshToken();
bigquery = new Bigquery.Builder(HTTP_TRANSPORT, JSON_FACTORY, credential)
//.setApplicationName("GoogleBigQuery/1.0")
.build();
listDatasets(bigquery, "publicdata");
return;
} catch (IOException e) {
System.err.println(e.getMessage());
}
} catch (Throwable t) {
t.printStackTrace();
}
}
SERVICE_ACCOUNT_EMAIL ist die E-Mail-Adresse der Form: XXXXXXX @ developer.gserviceaccount.com
Wenn ich die credential.refreshToken() Zeile entfernen, schlägt es in den listsDatasets beim ersten Aufruf von Bigquery fehl ... Andernfalls schlägt credential.refreshToken() ... mit demselben Fehler fehl .
Akzeptiert BigQuery die Authentifizierung des Dienstkontos nicht?
Ich glaube, ich habe alles richtig über die API-Konsole gemacht. Ich habe:
- Turned-Zugriff auf die große Abfrage-API auf.
- Erstellt ein Dienstkonto auf der Registerkarte "API-Zugriff".
- Heruntergeladen mein privater Schlüssel (der aus dem obigen Code verwiesen wird).
- Mit meinem Dienstkonto Benutzer "bearbeiten" Zugriff auf der Registerkarte "Teams".
- Aktivierte Fakturierung.
Habe ich etwas verpasst? Gibt es noch etwas, was ich tun muss?
Dank ..
Danke, Michael .. Peinlich, mein Schlüssel wurde nicht richtig gelesen. Mein Code arbeitete mit einem absoluten Pfad für den Schlüssel. – Sprooose
Wo sollte der Schlüssel aufbewahrt werden? –
@AakashParashar der Schlüssel muss lokal aufbewahrt werden, damit das Skript es lesen kann, aber es sicher halten, als wäre es ein Passwort, das Zugriff auf Ihr gesamtes Cloud-Projekt bietet (was es im Wesentlichen ist) –