【问题标题】:Google drive service accounts refresh tokenGoogle 云端硬盘服务帐户刷新令牌
【发布时间】:2013-08-14 09:50:35
【问题描述】:

我的会话每小时到期一次,我找不到有关在使用服务帐户身份验证方法时如何刷新令牌的文档。对于已安装的应用程序,我可以从 state 对象中获取 RefreshToken

AuthorizationState state = new AuthorizationState(new[]
{
    "https://www.googleapis.com/auth/drive",
    "https://www.googleapis.com/auth/drive.file",
    "https://www.googleapis.com/auth/drive.metadata.readonly",
    "https://www.googleapis.com/auth/drive.readonly"
})
{
    Callback = new Uri(NativeApplicationClient.OutOfBandCallbackUrl)
}
state = client.ProcessUserAuthorization(GetAuthorizationCode(), state);
Console.WriteLine(state.RefreshToken);

但是如何为服务帐户执行此操作?

X509Certificate2 certificate = new X509Certificate2(SERVICE_ACCOUNT_PKCS12_FILE_PATH, "mysecret", X509KeyStorageFlags.Exportable);

var provider = new AssertionFlowClient(GoogleAuthenticationServer.Description, certificate)
{
    ServiceAccountId = SERVICE_ACCOUNT_EMAIL,
    Scope = DriveService.Scopes.Drive.GetStringValue(),
    ServiceAccountUser = "myemail@mydomain.com",
};

var auth = new OAuth2Authenticator<AssertionFlowClient>(provider, AssertionFlowClient.GetState);
DriveService service = DriveService(auth);

从 Google SDK 源代码中我发现AssertionFlowClient.GetState 函数执行以下操作

    IAuthorizationState state = new AuthorizationState(provider.Scope.Split(' '));

    if (provider.RefreshToken(state, null)) {
        return state;
    } else {
        return null;
    }

看起来它确实会刷新令牌。我将此函数调用添加到我的令牌刷新计时器,但它没有帮助。一小时后我仍然继续收到Invalid credentials 异常。

【问题讨论】:

  • 您能否再澄清一下您的要求?我从上面了解到的是,你有刷新令牌,你想要的只是新的访问令牌,对吗?

标签: c# google-drive-api google-oauth google-api-client


【解决方案1】:

服务帐户不使用刷新令牌。您只需使用第一次使用的相同过程请求另一个访问令牌。请参阅 Google 的文档了解如何操作when access tokens expire。

【讨论】:

  • 谢谢。但是我该怎么做呢?我正在使用 Google 客户端 SDK,是否需要删除旧对象并为此创建一个新的 DriveService 对象?
猜你喜欢
  • 2018-12-04
  • 2016-06-01
  • 2017-08-06
  • 2013-01-04
  • 1970-01-01
  • 2014-08-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多