セッションは 1 時間ごとに期限切れになり、サービス アカウント認証方法を使用しているときにトークンを更新する方法に関するドキュメントが見つかりません。インストール済みのアプリケーションの場合、オブジェクトRefreshToken
から取得できますstate
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);
AssertionFlowClient.GetState
Google SDKソースコードから、関数が次のことを実行することがわかりました
IAuthorizationState state = new AuthorizationState(provider.Scope.Split(' '));
if (provider.RefreshToken(state, null)) {
return state;
} else {
return null;
}
トークンの更新を行うようです。この関数呼び出しをトークン リフレッシュ タイマーに追加しましたが、役に立ちません。Invalid credentials
1時間経っても例外が発生し続けます。