c# - Google 云端硬盘服务帐户刷新 token

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

我的 session 每小时过期一次,并且在我使用服务帐户身份验证方法时找不到有关如何刷新 token 的文档。对于已安装的应用程序,我能够从 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;
    }

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

最佳答案

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

关于c# - Google 云端硬盘服务帐户刷新 token ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18228466/

相关文章:

google-apps-script - 如何使用 Google Apps 脚本搜索文件夹

javascript - 尝试访问 BigQuery 的 Oauth 客户端无效

c# - 如何在 C# 中转换或编写此 Javascript 数组

c# - 使用 C# Interop.Excel 从 NamesManager 中删除重复名称

javascript - 如何获取一行并将该行和文本字符串合并为一个新行

javascript - 两个 Google JS 客户端 : platform. js 与 api.js 有什么区别?

oauth - 无法创建 oauth 客户端 ID(谷歌开发者控制台)

c# - 如何在页面加载时动态更改 aspx 页面的标题

c# - VS Code Omnisharp.MsBuild.Projectmanager 无法加载程序集 System.Numerics.Vectors 4.1.3.0

Flutter - 如何使用 Google Drive API 下载公共(public)文件