1

我正在使用带有服务帐户的 Google Drive API(C#),如中所述

https://developers.google.com/drive/delegation

我可以使用 DriveService 对象,但 1 小时后,它会出现异常错误:“远程服务器返回错误:(401)未经授权。”

我知道,通过将“access_type”设置为“offline”,我们可以解决这个问题,但我无法为 DriveService 对象设置这个属性。
有谁知道如何刷新这个 Google Drive Service 对象?

提前致谢

4

2 回答 2

3

服务帐户带有一个私钥 - 这是它们的道德等价物/超集刷新令牌作为用户驱动的同意流返回的结果。

当用户同意离线访问(通过 Web 服务器或类似的 OAuth 流)时,会返回一个刷新令牌,该令牌可以随时交换(连同客户端密码)以获得访问令牌。

以同样的方式,服务帐户私钥可用于签署断言,该断言也可以交换为访问令牌 - 这对于没有用户接受同意屏幕或您代表执行工作的情况很有用您组织中的其他用户。

一旦您获得访问令牌,它就会以相同的方式处理 - 预计会在 1 小时后过期,此时需要请求新的访问令牌,这对于服务帐户来说意味着创建和签署新的断言。

通常注意到访问令牌已过期并请求新的令牌由 Google 客户端库为您处理 - 尽管我不熟悉 C# 版本。如果您可以共享创建 DriveService 对象的代码,那将很有帮助。

于 2013-05-24T00:35:11.913 回答
1

当您设置离线访问模式时,您的应用会在用户第一次登录时获得一个刷新令牌。

access_type :: 表示当用户不在浏览器时,您的应用程序是否需要访问 Google API。该参数默认为在线。如果您的应用程序需要在用户不在浏览器时刷新访问令牌,请使用脱机。这将导致您的应用程序在您的应用程序第一次为用户交换授权码时获得刷新令牌。

一旦当前访问令牌过期,您稍后将使用此刷新令牌获取新的访问令牌。基本上,您的应用程序将使用刷新令牌和您的客户端凭据点击令牌交换端点(POST 到https://accounts.google.com/o/oauth2/token ) - 然后谷歌发出一个(刷新令牌 + 访问令牌) 与您配对。
有关进一步说明,请参阅此链接

编辑-
我检查了服务帐户文档,发现了一个示例 C# 应用程序,它也获取和使用刷新令牌。在这里看到它。
我希望这个有帮助。

于 2013-05-15T14:05:55.653 回答