2012-02-29 9 views
6

Al utilizar la API de Google Docs Java con una cuenta de Google Apps, ¿es posible suplantar a un usuario y descargar un archivo?API de Google Docs: suplantar la descarga del archivo de usuario

Cuando ejecuto el programa a continuación, está claramente iniciando sesión en el dominio y suplantando al usuario porque recupera los detalles de uno de los archivos e imprime el título del archivo. Sin embargo, cuando intenta descargar el archivo, se lanza una excepción ServiceForbiddenException.

Si no es posible con la API de Java, ¿alguien sabe si es posible que mi programa escriba una solicitud HTTP para descargar el archivo utilizando la API de protocolo?

public class AuthExample { 

private static DocsService docService = new DocsService("Auth Example"); 

public static void main(String[] args) 
    throws Exception 
{ 
    String adminUser = args[0]; 
    String adminPassword = args[1]; 
    String authToken = args[2]; 
    String impersonatedUser = args[3]; 

    loginToDomain(adminUser, adminPassword, authToken); 

    URL url = new URL("https://docs.google.com/feeds/" + impersonatedUser + "/private/full"); 
    DocumentListFeed feed = docService.getFeed(url, DocumentListFeed.class); 

    DocumentListEntry entry = feed.getEntries().get(0); 

    String title = entry.getTitle().getPlainText(); 
    System.out.println(title); 

    String type = entry.getType(); 
    if (type.equals("document")) 
    { 
     String encodedAdminUser = URLEncoder.encode(adminUser); 
     String resourceId = entry.getResourceId(); 
     String resourceIdNoPrefix = resourceId.substring(resourceId.indexOf(':')+1); 

     String downloadUrl = 
       "https://docs.google.com/feeds/download/documents/Export" + 
       "?xoauth_requestor=" + encodedAdminUser + 
       "&docId=" + resourceIdNoPrefix + 
       "&exportFormat=doc"; 

     downloadFile(downloadUrl, title + ".doc"); 
    } 
} 

private static void loginToDomain(String adminUser, String adminPassword, String authToken) 
     throws OAuthException, AuthenticationException 
{ 
    String domain = adminUser.substring(adminUser.indexOf('@')+1); 

    GoogleOAuthParameters oauthParameters = new GoogleOAuthParameters(); 
    oauthParameters.setOAuthConsumerKey(domain); 
    oauthParameters.setOAuthConsumerSecret(authToken); 
    oauthParameters.setOAuthType(OAuthType.TWO_LEGGED_OAUTH); 
    oauthParameters.setScope("https://docs.google.com/feeds/ http://spreadsheets.google.com/feeds/ http://docs.googleusercontent.com/"); 

    docService.useSsl(); 
    docService.setOAuthCredentials(oauthParameters, new OAuthHmacSha1Signer()); 
    docService.setUserCredentials(adminUser, adminPassword); 
} 


// Method pasted directly from Google documentation 
public static void downloadFile(String exportUrl, String filepath) 
     throws IOException, MalformedURLException, ServiceException 
{ 
    System.out.println("Exporting document from: " + exportUrl); 

    MediaContent mc = new MediaContent(); 
    mc.setUri(exportUrl); 
    MediaSource ms = docService.getMedia(mc); 

    InputStream inStream = null; 
    FileOutputStream outStream = null; 

    try { 
     inStream = ms.getInputStream(); 
     outStream = new FileOutputStream(filepath); 

     int c; 
     while ((c = inStream.read()) != -1) { 
      outStream.write(c); 
     } 
    } finally { 
     if (inStream != null) { 
      inStream.close(); 
     } 
     if (outStream != null) { 
      outStream.flush(); 
      outStream.close(); 
     } 
    } 
} 

}

+0

corro en exactamente el mismo problema. ¿Alguien tiene información sobre ese problema? – Jerome

Respuesta

4

suplantación funcionará como está previsto si se utiliza con OAuth2 ServiceAccounts

Cuestiones relacionadas