Google Docs:无法在 C# 中使用管理访问/模拟(禁止 403)导出/下载用户的文档

Posted

技术标签:

【中文标题】Google Docs:无法在 C# 中使用管理访问/模拟(禁止 403)导出/下载用户的文档【英文标题】:Google Docs: Cannot export/download user's document using administrative access/impersonation (forbidden 403) in C# 【发布时间】:2012-06-09 00:38:01 【问题描述】:

我整天都在为此头疼,在 Google 上进行了大量搜索,但无济于事。我正在编写一个将用户的所有 Google Docs 文件下载到本地磁盘的应用程序。我必须为多个用户执行此操作,并且只提供一个管理员帐户(通过模拟使用)。该问题仅适用于模拟用户尚未创作/共享的文档。在所有情况下,获取标题信息都可以正常工作(无论作者和共享设置如何)。下载由模拟帐户创作的文件也可以正常工作。但是,下载由其他用户创作的文件会失败,并出现 HTTP 401 或 403(权限被拒绝)。有人可以告诉我我做错了什么吗?下面是代码的精简版本。谢谢!

    using System.IO;
using Google.GData.Documents;
using Google.GData.Client;
using Google.GData.Extensions;
using Google.Documents;


void impersonateAndGetAllUsersDocs()

    string applicationName = "myapp";
    string username = "admin@domain.com";
    string password = "adminPassword";
    string accountToImpersonate = "someOtherUser@domain.com";

    DocRequest = new DocumentsRequest(new RequestSettings(applicationName, username, password));

    DocumentsListQuery docQuery = new DocumentsListQuery();
    docQuery.Uri = new Uri(docQuery.Uri.ToString().Replace("/default/", "/" + accountToImpersonate + "/"));

    AtomFeed docFeed = DocRequest.Service.Query(query);
    //process every document in the feed
    foreach (AtomEntry docEntry in docFeed.Entries)
    
        //this line works for all docs (irrespective of who the author is)
        string title = docEntry.Title.Text;

        Document doc = new Document()
        
            AtomEntry = docEntry;
        ;

        //the next line throws an exception with HTTP 401 or 403 (permission) if the author is not the impersonated account
        Stream queryStream = DocRequest.Download(doc, Document.DownloadType.html)

        //do something with the stream, such as write to local disk

        //all done, close the stream
        if (queryStream != null)
            queryStream.Close();
    

【问题讨论】:

【参考方案1】:

冒充其他用户的正确方法是使用 2-legged OAuth 并将 xoauth_requestor_id 参数添加到 uri 以指定要为其请求数据的用户。

根据文档中的完整示例,这可以通过 .NET 客户端库轻松完成:

https://developers.google.com/gdata/docs/auth/oauth#2LeggedOAuth

【讨论】:

克劳迪奥 - 非常感谢您的帮助。我能够进行身份验证,但现在获取流会返回异常。任何的想法? gDataRecirectException.message =执行导致在 Google.GData.Client.GDataGAuthRequest.Execute(Int32 retryCounter) 在 Google.GData.Client.GDataRequest.Execute() 的 google.com/accounts/… 在 Google.GData.Client.GDataGAuthRequest.Execute( ) PS,这是一个电子表格,我包装了 DocumentService: GOAuthRequestFactory requestFactory = new GOAuthRequestFactory("writely", applicationName); requestFactory.ConsumerKey = CLIENT_ID; requestFactory.ConsumerSecret = CLIENT_SECRET; //1- 初始化文档 DocRequest = new DocumentsRequest(new RequestSettings(applicationName)); DocRequest.Service = new DocumentsService(applicationName); DocRequest.Service.RequestFactory = requestFactory; 要下载任何类型的文档,包括电子表格,您必须确保该应用已获得以下 OAuth 范围的授权:https://docs.google.com/feeds/https://docs.googleusercontent.com/https://spreadsheets.google.com/feeds/ 谢谢克劳迪奥。不幸的是,我在 auth 参数上设置了范围,但仍然收到重定向异常。知道如何处理此异常,或者是否还有其他需要做的事情? Auth 1.0 似乎不支持“重定向 URL”。不确定这是不是问题...谢谢! 您应该在控制面板中明确授权您的应用在您需要的范围内使用 2-legged OAuth。检查support.google.com/a/bin/answer.py?hl=en&answer=162106 以获取说明

以上是关于Google Docs:无法在 C# 中使用管理访问/模拟(禁止 403)导出/下载用户的文档的主要内容,如果未能解决你的问题,请参考以下文章

如何将 Google Cloud Platform Pub/Sub 消息推送到 C# 桌面应用程序

grpc c# .net 使用

Google Docs Viewer 偶尔无法在 iframe 中加载内容

从 C# 以编程方式进行 Firebase 身份验证用户管理

无法使用 Google Directory API Admin SDK 列出用户

无法从 C# 中的 google api 令牌验证器获取数据