简短的问题是这是否可能,如果可能,如何?
大纲
我有一个 .NET 应用程序,它当前使用服务帐户通过 Google Drive API 访问 Google Apps 域中的信息。这可以很好地使用google-api-dotnet-client 库和代码,与此处示例中所示的相同行- 这是目前我正在做的一个非常好的基本示例。
我现在想做的是扩展它,以及使用“新”google-api-dotnet-client 库提供的那些 API,它使用旧的“GData”库,如旧google-gdata 库提供的那样,特别是电子表格 API(也许还会有更多)。
问题
这就是困难出现的地方。正如上面第一段中的第二个链接所证明的那样,以前的图书馆完全符合我的要求 - 以及我自己做的事实。但是......虽然第二个库已更新为支持 OAuth 2.0 以及 OAuth 1.0 和其他较旧的身份验证技术,但它不允许 - 据我从广泛的谷歌搜索和跟踪错误中得知 - 允许“代表我所有用户的服务帐户”我需要的操作。
我的问题是我是否遗漏了一些可以让我做我想做的事情的东西(可能是很难找到或没有记录的东西)。如果做不到这一点,有什么办法可以强制这种行为并使这两个库并排运行?
理想的解决方案
理想情况下,我希望通过某种方式让Google.GData.Spreadsheets.SpreadsheetsService
实例能够利用Google.Apis.Authentication.Auth2Authenticator<AssertionFlowClient>
我已经在使用的实例......不知何故。这样的巫术是可能的吗?我错过了显而易见的事情吗?
如果做不到这一点,我很乐意以旧库可以处理的某种方式再次完成整个 OAuth2“断言流客户端”的舞蹈。
帮助?
其他想法
我已经考虑过——并且暂时拒绝了——从头开始并编写自己的库来实现这一点的选择。这有两个原因:
- gdata 库已经存在,并且由许多可能比我聪明的人开发。我没有那么自大,我相信我可以做得更好。
- 我不确定这些旧 API 是否支持/允许使用带有服务帐户的 OAuth2 方法。
我一直希望避免但可能不得不根据这里的答案回退的另一种方法是使用 2-legged OAuth 1.0 作为其中的一部分。我不希望这样做,因为应用程序的某些部分依赖于一种旧的身份验证方法,而其他部分则以一种不错的新方法来做,这对我来说是错误的。还有更多的问题......
更新
我已经考虑了将 GDataRequestFactory 和 GDataRequest 子类化的可能性,这样我就可以创建自己的请求工厂,并使用Google.Apis.Authentication.Auth2Authenticator<AssertionFlowClient>
(好吧,Google.Apis.Authentication.IAuthenticator
无论如何的实例)的实例,它可以在请求被调用之前介入以验证请求。但是...... GDataRequest 的构造函数是内部的,这阻止了我。
看起来这不是故意的。