2012-07-26 15 views
8

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

+1

¿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 –

+0

Sí, esa fue la pieza que falta, gracias por la respuesta Encontré mi respuesta de una pregunta similar. – David

Respuesta

6

he encontrado una pregunta similar a la mía: Can a Google Apps Admin manage users files with Drive SDK? a la mía que ha ayudado a averiguar la respuesta.

La documentación de cPanel es un poco engañosa ya que se refiere a habilitar la clave del consumidor y luego agregar el dominio a la pantalla de acceso del cliente Administrar API. Esto parece ser válido para la api de gdata y no para la nueva API de Google Drive. Al agregar la identificación del cliente como se sugiere en la otra pregunta y otorgar acceso al alcance de Drive, ahora puedo suplantar a un usuario.

+2

¿El ID de cliente se ve así xxxxxxxx.apps.googleusercontent.com Si no, ¿dónde puedo encontrar el ID de cliente? – DavidVdd

+1

La ID del cliente se puede encontrar en la API de la consola (https://code.google.com/apis/console/) – VoltaicShock

Cuestiones relacionadas