Estoy intentando utilizar la API de Oauth para autenticar una cuenta de servicio de Google a través de la API de Java. Espero utilizarlo para acceder a Google Bigquery. Recibo una "subvención inválida" devuelta por mis solicitudes de API.Autenticar la API de Google con una cuenta de servicio con la API de Java
Aquí está el código, que es una copia de un ejemplo básico de autenticación (que no era para bigquery .. pero otra API de Google):
/** 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 es la dirección de correo electrónico de la forma: XXXXXXX @ developer.gserviceaccount.com
Si elimino la línea credential.refreshToken(), falla en los listsDatasets en la primera llamada a Bigquery ... De lo contrario, falla en credential.refreshToken() .. con el mismo error .
¿BigQuery no acepta la autenticación de cuenta de servicio?
Creo que he hecho todo correctamente a través de la consola API. Tengo:
- Se ha activado el acceso a la API Big Query en.
- Creó una cuenta de servicio en la pestaña "Acceso a la API".
- Descargado mi clave privada (que se referencia desde el código anterior).
- Dado que el usuario de mi cuenta de servicio "puede editar" el acceso en la pestaña "Equipos".
- Facturación habilitada.
¿He perdido algo? ¿Hay algo más que deba hacer?
Gracias ..
Gracias, Michael ... De manera vergonzosa, mi clave no se leía correctamente. Mi código funcionaba con una ruta absoluta para la clave. – Sprooose
¿Dónde se guarda la llave? –
@AakashParashar la clave debe guardarse localmente para que el script la lea, pero mantenla segura, como si fuera una contraseña que proporcionaba acceso a todo tu proyecto en la nube (que esencialmente es) –