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# 桌面应用程序
Google Docs Viewer 偶尔无法在 iframe 中加载内容
从 C# 以编程方式进行 Firebase 身份验证用户管理