我能够使用我在身份验证后获得的凭据对Google云端硬盘进行身份验证和执行操作,但此令牌已存在很长时间。它说expours-in:3600所以它应该在1小时内到期但是当我在一个月之后尝试它它使用那个令牌并且它起作用了。
我的要求是在身份验证之后,无论正在执行的任务是否完成,如果用户再次启动程序,它应该再次向用户请求身份验证。所以基本上我不想让令牌存储在客户的系统中。 Expires-in对我来说不起作用,因为令牌被刷新并且不再要求验证。
下面是我正在使用的代码:
credential = GoogleWebAuthorizationBroker.AuthorizeAsync(
new ClientSecrets
{
ClientId = "<myid>.apps.googleusercontent.com",
ClientSecret = "<Mysecret>"
},
new[] { DriveService.Scope.Drive },
"user",
CancellationToken.None).Result;
// Create the service using the client credentials.
DriveService service = new DriveService(new BaseClientService.Initializer()
{
HttpClientInitializer = credential,
ApplicationName = "sampleapp"
});
*****some task performed*********
现在在此之后&#34;一些任务&#34;我希望令牌被销毁。
请帮忙。
答案 0 :(得分:8)
从今天早些时候刚刚发布的版本1.8.2(http://google-api-dotnet-client.blogspot.com/2014/05/announcing-release-of-182.html)开始,我们支持令牌撤销。它撤销令牌并从数据存储中删除它。
您需要做的就是:
await credential.RevokeTokenAsync(CancellationToken.None);
就这么简单。
更新: 有关.NET的Google API客户端库中令牌撤销的更多信息,请参阅以下博文:http://peleyal.blogspot.com/2014/06/182-is-here.html
答案 1 :(得分:0)
您再次被问到用户的原因是因为您传递了刷新令牌,您只是不知道它。
当我这样做时,我使用以下代码:
credential = GoogleWebAuthorizationBroker.AuthorizeAsync(
new ClientSecrets
{
ClientId = "<myid>.apps.googleusercontent.com",
ClientSecret = "<Mysecret>"
},
new[] { DriveService.Scope.Drive },
"user",
CancellationToken.None,
FileDataStore("Drive.Auth.Store")).Result;
然后会发生一个文件,我的刷新令牌存储在名为%AppData%
的用户Drive.auth.store
目录中。
{
"access_token":"ya29.IgA23NyW3rF0xxoAAACFPgYzOm9Bm1Vixr-ti9crN5LvEr0W_gjtUQWOCy9QHw",
"token_type":"Bearer",
"expires_in":3600,
"refresh_token":"1/OGUwUcl92Abo-7LAsuC0tsp_FWxhOW_freUyKncNalI",
"Issued":"2014-05-26T20:34:07.447+02:00"
}
现在你的代码稍有不同,你不发送FileDataStore("Drive.Auth.Store")
。我以前没试过发送它所以我不得不测试它。默认GoogleWebAuthorizationBroker.AuthorizeAsync
似乎为您存储刷新令牌,就像您使用FileDataStore
一样。该名称似乎是默认Tasks.Auth.Store
。
所以发生的事情是,每次用户运行您的应用程序时,Client lib都会自动为您加载该文件。
如何修复它:
丑陋的方式是随机更改"User"
(时间戳等),如果不同则会自动提示再次进行身份验证。你需要检查%appdata%
中的文件我不知道它是否会在每次运行你的应用程序时创建一个新文件,或者它是否会过度使用旧文件。在用户PC上继续创建垃圾文件可能不是一个好主意。
好方法。创建自己的Idatastore实现,但不保存它。您可以在底部找到一个非常基本的Google Oauth C#示例,称为存储刷新令牌,不要将其存储在任何地方。