Me gustaría suplantar a un usuario y agregar archivos a los usuarios de Google Drive en su nombre desde un proceso de servidor. He configurar una cuenta de servicio y se puede acceder correctamente a la unidad como la cuenta de servicio de la adición y la lista de archivos, etc., utilizando el siguiente código:OAuth Google API para Java no puede suplantar usuario
/** 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();
public static void main(String[] args) {
try {
GoogleCredential credential =
new GoogleCredential.Builder().setTransport(HTTP_TRANSPORT)
.setJsonFactory(JSON_FACTORY)
.setServiceAccountId("[email protected]")
.setServiceAccountScopes(DriveScopes.DRIVE)
.setServiceAccountPrivateKeyFromP12File(new File("c:/junk/key.p12"))
.build();
Drive drive = new Drive.Builder(HTTP_TRANSPORT, JSON_FACTORY, credential).build();
drive.files().list().execute();
} catch (Exception e) {
e.printStackTrace();
}
Esto funciona, sin embargo sólo devuelve los archivos que se asocian a lo que supongo está asociado con la unidad de cuentas de servicio (?).
Según el JavaDoc, GoogleCredential también se puede utilizar para hacerse pasar por un usuario mediante la adición de la cuenta del usuario dirección de correo electrónico del servicio de la siguiente manera:
GoogleCredential credential =
new GoogleCredential.Builder().setTransport(HTTP_TRANSPORT)
.setJsonFactory(JSON_FACTORY)
.setServiceAccountId("[email protected]")
.setServiceAccountScopes(DriveScopes.DRIVE)
.setServiceAccountPrivateKeyFromP12File(new File("c:/junk/key.p12"))
.setServiceAccountUser("[email protected]") //<-- impersonate user a
.build();
Sin embargo, cuando se ejecuta este código, la excepción siguiente:
com.google.api.client.auth.oauth2.TokenResponseException: 400 Bad Request
{
"error" : "access_denied"
}
at com.google.api.client.auth.oauth2.TokenResponseException.from(TokenResponseException.java:103)
at com.google.api.client.auth.oauth2.TokenRequest.executeUnparsed(TokenRequest.java:303)
at com.google.api.client.auth.oauth2.TokenRequest.execute(TokenRequest.java:323)
at com.google.api.client.googleapis.auth.oauth2.GoogleCredential.executeRefreshToken(GoogleCredential.java:340)
at com.google.api.client.auth.oauth2.Credential.refreshToken(Credential.java:508)
at com.google.api.client.auth.oauth2.Credential.intercept(Credential.java:260)
at com.google.api.client.http.HttpRequest.execute(HttpRequest.java:796)
at com.google.api.client.googleapis.json.GoogleJsonResponseException.execute(GoogleJsonResponseException.java:198)
at com.google.api.client.googleapis.services.GoogleClient.executeUnparsed(GoogleClient.java:237)
at com.google.api.client.http.json.JsonHttpRequest.executeUnparsed(JsonHttpRequest.java:207)
at com.google.api.services.drive.Drive$Files$List.execute(Drive.java:1071)
¿Falta un paso o configuración?
Gracias, David
¿Cómo otorgaste acceso a la cuenta de servicio para suplantar usuarios en tu dominio? ¿Agregó el ID del cliente y los ámbitos adecuados en la sección OAuth del panel de control de Google Apps? - http://support.google.com/a/bin/answer.py?hl=es&answer=162106 –
Sí, esa fue la pieza que falta, gracias por la respuesta Encontré mi respuesta de una pregunta similar. – David