Pregunta

Me gustaría imponer un usuario y agregar archivos a los usuarios de Google Drive en su nombre desde un proceso de servidor.He configurado una cuenta de servicio y puedo acceder a la unidad con éxito como la cuenta de servicio Agregar y listar archivos, etc. Uso del siguiente código:

  /** 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("XXXXX@developer.gserviceaccount.com")
                  .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, solo devuelve los archivos asociados a lo que asumo que está asociado con la unidad de cuentas de servicio (?).

Según el Javadoc, GoogleCrencial también se puede usar para imponer a un usuario agregando la dirección de correo electrónico de los usuarios de la cuenta de servicio de la siguiente manera:

        GoogleCredential credential = 
                new GoogleCredential.Builder().setTransport(HTTP_TRANSPORT)
                  .setJsonFactory(JSON_FACTORY)
                  .setServiceAccountId("XXXXX@developer.gserviceaccount.com")
                  .setServiceAccountScopes(DriveScopes.DRIVE)
                  .setServiceAccountPrivateKeyFromP12File(new File("c:/junk/key.p12"))
                  .setServiceAccountUser("usera@domain.com") //<-- impersonate user a
                  .build();

Sin embargo, al ejecutar este código, se lanza la siguiente excepción:

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)

¿Estoy perdiendo un paso o configuración de configuración?

gracias, David

¿Fue útil?

Solución

Encontré una pregunta similar a la mía: ¿Puede un Administrador de administración de Google Apps administrar los archivos de los usuarios con la unidad SDK? a la mía que me ha ayudado a descubrir 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 Administrar acceso a cliente API.Esto parece ser válido para la API de GDATA y no en la nueva API de Google Drive.Al agregar la identificación del cliente, como se sugiere en la otra pregunta y otorgar acceso al ámbito de la unidad, ahora puedo pasar por completo a un usuario.

Otros consejos

Obtenga su administrador para agregar los ámbitos a xxxxx.apps.googleusercontent.com a través del panel de administración:

Añadido lo siguiente para trabajar en hojas de cálculo:


https://www.googleapis.com/auth/drive https://docs.google.com/feeds
https://spreadshets.google.com/feeds

Delegado OAUTH Permisos Permisos alcance

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top