2012-02-29 11 views
6

GoogleドキュメントのJava APIをGoogle Appsアカウントで使用すると、ユーザーを偽装してファイルをダウンロードすることは可能ですか?GoogleドキュメントAPI - 偽装ユーザーファイルのダウンロード

以下のプログラムを実行すると、明らかにドメインにログオンし、ファイルの詳細を取得してファイルのタイトルを出力するため、ユーザーをなりすまします。ただし、ファイルをダウンロードしようとすると、ServiceForbiddenExceptionがスローされます。

Java APIでは不可能な場合は、自分のプログラムがプロトコルAPIを使用してファイルをダウンロードするためのHTTP要求を書き込むことができるかどうかを知っていますか?意図したとおりに

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

でのOAuth2を使用する場合、私は正確に同じ問題に実行していきます。誰かがその問題についての情報を持っていますか? – Jerome

答えて

4

偽装を使用すると、ServiceAccounts

関連する問題