我正在使用带有服务帐户的Google云端硬盘API(C#),如
所述https://developers.google.com/drive/delegation
我可以使用DriveService对象,但是在1小时后,它出现异常错误:“远程服务器返回错误:(401)未经授权。”
我知道,通过将“access_type”设置为“离线”,我们可以解决此问题,但我无法为DriveService对象设置此属性。
有谁知道如何刷新此Google云端硬盘服务对象?
提前致谢
答案 0 :(得分:3)
服务帐户附带私钥 - 这是他们在用户驱动的同意流程中返回的刷新令牌的道德等效/超集。
当用户同意离线访问时(通过Web服务器或类似的OAuth流),将返回刷新令牌,可以随时为访问令牌交换刷新令牌(以及客户端密钥)。
以同样的方式,可以使用服务帐户私钥来签署断言,该断言也可以替换为访问令牌 - 这对于没有用户接受同意屏幕或您正在执行工作的情况很有用代表您组织中的其他用户。
获得访问令牌后,它将以相同的方式处理 - 并且预计在1小时后过期,此时需要请求新的访问令牌,对于服务帐户,这意味着创建和签署新的访问令牌断言。
通常会注意到访问令牌已过期并请求新的令牌由Google客户端库为您处理 - 尽管我不熟悉C#版本。如果你可以共享你的代码来创建有用的DriveService对象。
答案 1 :(得分:1)
当您设置离线访问模式时,您的应用会在用户首次登录时获取刷新令牌。
access_type :: 表示您的应用程序是否需要访问Google API 用户不在浏览器中。此参数默认为在线。 如果您的应用程序需要在用户访问时刷新访问令牌 不在浏览器中,然后使用离线。这将导致你的 应用程序第一次获取刷新令牌的应用程序 为用户交换授权码。
一旦当前访问令牌过期,您稍后将使用此刷新令牌获取新的访问令牌。基本上,您的应用随后会使用刷新令牌和您的客户端凭据点击令牌交换端点(POST到https://accounts.google.com/o/oauth2/token) - 谷歌然后向您发出(刷新令牌+访问令牌)对。
有关进一步说明,请参阅this link。
编辑 - 我检查了服务帐户文档,找到了一个示例C#应用程序,它也提取并使用刷新令牌。看到它here。我希望这个有帮助。