2012-02-29 18 views
6

Sử dụng API Java của Google Documents bằng tài khoản Google Apps, có thể mạo danh người dùng và tải xuống tệp không?API Google Documents - Tệp người dùng mạo danh Tải xuống

Khi tôi chạy chương trình bên dưới, rõ ràng là đang đăng nhập vào miền và mạo danh người dùng vì nó truy xuất chi tiết của một trong các tệp và in ra tên tệp. Tuy nhiên, khi nó cố tải xuống tệp, ServiceForbiddenException bị ném.

Nếu không thể thực hiện được với API Java, có ai biết liệu chương trình của tôi có thể viết yêu cầu HTTP để tải xuống tệp bằng API giao thức không?

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

tôi chạy trong cùng một vấn đề chính xác. Có ai có thông tin về vấn đề đó không? – Jerome

Trả lời

4

Mạo danh sẽ làm việc như dự định nếu bạn sử dụng OAuth2 với ServiceAccounts