大纲:
我有一个.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“assertion flow client”过程,以某种旧库可以处理的方式。
需要帮忙吗?
其他想法
我已经考虑过,但暂时拒绝了从头开始编写自己的库来实现这一目标的选项。原因有两个:
- gdata库已经存在,并且由许多比我聪明的人开发。我并不傲慢到认为我能做得更好。
- 我不确定使用服务账户的OAuth2方法是否在这些旧API上受支持/允许。
备选方案是我一直希望避免但可能不得不回退的方法,即对某些部分使用2-legged OAuth 1.0。我不想这样做,因为让应用程序的某些部分依赖于一个旧的授权方法,而其他部分则采用新的授权方法,感觉很奇怪。而且出错的可能性就更大了...
更新
我考虑了子类化 GDataRequestFactory 和 GDataRequest 的可能性,以便创建自己的请求工厂并将其实例传递给 Google.Apis.Authentication.Auth2Authenticator<AssertionFlowClient>
(或者至少是一个实现了 Google.Apis.Authentication.IAuthenticator
接口的类),从而在调用请求之前进行身份验证。但是... GDataRequest 的构造函数是内部的,这使我无法进行操作。
看起来真的不太可能实现这个目标。