問題描述
我有一個使用 Google Drive 訪問用戶文件的 .NET 應用程序.我能夠獲得授權碼,并且我已經能夠通過 AccessToken 和 RefreshToken 交換授權碼.問題是我無法刷新訪問令牌,并且它會在一小時后過期.
I have a .NET application that is using Google Drive to access the user's file. I am able to get the authorization code, and I have been able to exchange the authorization code by the AccessToken and the RefreshToken. The issue is that I cannot refresh the access token, and it expires after an hour.
類似于這個問題:如何通過 google drive API 使用刷新令牌生成訪問令牌? 除了我在 .NET 中工作(使用 Google.API... DLL).
Similar to this question: How to generate access token using refresh token through google drive API? except that I am working in .NET (using the Google.APIs... DLLs).
我知道這一點:https://developers.google.com/accounts/docs/OAuth2InstalledApp#refresh 但是,我期望 IAuthorizationState 或 OAuth2Authenticator 對象中提供某種方法來允許我刷新訪問令牌.
I am aware of this: https://developers.google.com/accounts/docs/OAuth2InstalledApp#refresh however, I am expecting some sort of method available in the IAuthorizationState or OAuth2Authenticator object to allow me refresh the access token.
請指教.謝謝.
請注意,使用此代碼我可以獲得訪問令牌.只是我希望這段代碼在 Google API 中.
Please note that using this code I am able to get the Access Token. It is just that I am expecting this code to be inside the Google API.
public class OAuth2AccessTokenReponse
{
public string access_token;
public int expires_in;
public string token_type;
}
public static string refreshAccessToken()
{
using (System.Net.WebClient client = new System.Net.WebClient())
{
byte[] response = client.UploadValues("https://accounts.google.com/o/oauth2/token", new System.Collections.Specialized.NameValueCollection(){
{"client_id", ClientID},
{"client_secret", ClientSecret},
{"refresh_token", "XXXXX"},
{"grant_type", "refresh_token"}
});
string sresponse = System.Text.Encoding.Default.GetString(response);
OAuth2AccessTokenReponse o = (OAuth2AccessTokenReponse) Newtonsoft.Json.JsonConvert.DeserializeObject(sresponse, typeof(OAuth2AccessTokenReponse));
return o.access_token;
}
}
推薦答案
我研究了一個更合適的示例:GoogleApisSample 的 Tasks.WinForms.NoteMgr... 并找到了解決方案.
I studied a more suitable sample: the Tasks.WinForms.NoteMgr of the GoogleApisSample... and with it I found the solution.
解決方案在下面的代碼中.它的關鍵部分是調用 arg.RefreshToken(state);
The solution is in the code below. The key part of it is calling arg.RefreshToken(state);
謝謝.
public static Authentication.IAuthenticator UseSavedAuthorization()
{
var provider = new NativeApplicationClient(GoogleAuthenticationServer.Description);
provider.ClientIdentifier = ClientID;
provider.ClientSecret = ClientSecret;
OAuth2Authenticator<NativeApplicationClient> auth = new OAuth2Authenticator<NativeApplicationClient>(provider, getState);
auth.LoadAccessToken();
return auth;
}
public static IAuthorizationState getState(NativeApplicationClient arg)
{
IAuthorizationState state = new AuthorizationState(new[] { TasksService.Scopes.Tasks.GetStringValue(),
DriveService.Scopes.DriveFile.GetStringValue() , DriveService.Scopes.Drive.GetStringValue()
});
state.Callback = new Uri(NativeApplicationClient.OutOfBandCallbackUrl);
state.RefreshToken = "<refresh token previously saved>";
arg.RefreshToken(state);
return state;
}`
這篇關于如何通過 .NET 中的 Google Drive SDK 使用刷新令牌生成訪問令牌?的文章就介紹到這了,希望我們推薦的答案對大家有所幫助,也希望大家多多支持html5模板網!