【问题标题】:How to refresh Google Service account which expires after 1 hour?如何刷新 1 小时后过期的 Google 服务帐户?
【发布时间】:2013-05-15 13:49:42
【问题描述】:

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

中所述

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

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

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

提前致谢

【问题讨论】:

    标签: oauth-2.0 google-drive-api google-oauth


    【解决方案1】:

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

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

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

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

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

    【讨论】:

    • 感谢 aeijdenberg....我正在使用放置在 @developers.google.com/drive/… 的代码,我们需要刷新身份验证对象。我正在使用 provider.RefreshToken(((OAuth2Authenticator)OAuthenticator).State );....在它到期之前它对我有用。再次感谢
    【解决方案2】:

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

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

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

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

    【讨论】:

    • 感谢 Divyanshm....但是我没有使用 Google OAuth2.0 身份验证..我正在为域用户使用 Google 服务帐户身份验证....我找到了类似的东西... .. provider.RefreshToken(auth.State);......这将刷新 DriveService 对象......但是在服务帐户身份验证中是否有任何自动刷新的东西......比如 access_type=离线?
    • 添加了一些我能找到的更多信息。希望对您有所帮助。
    • 找不到页面:\
    猜你喜欢
    • 2014-08-17
    • 1970-01-01
    • 2023-02-08
    • 2019-03-06
    • 1970-01-01
    • 2020-10-05
    • 2019-03-20
    • 2022-11-08
    • 2021-04-24
    相关资源
    最近更新 更多