如何通过.NET中的Google Drive SDK使用刷新令牌生成访问令牌?

时间:2012-07-12 18:51:36

标签: .net google-drive-api

我有一个使用Google Drive访问用户文件的.NET应用程序。我能够获得授权代码,并且我能够通过AccessToken和RefreshToken交换授权代码。问题是我无法刷新访问令牌,并在一小时后过期。

与此问题类似:How to generate access token using refresh token through google drive API?,除了我在.NET中工作(使用Google.APIs ... DLL)。

我知道这一点:https://developers.google.com/accounts/docs/OAuth2InstalledApp#refresh但是,我期待IAuthorizationState或OAuth2Authenticator对象中提供某种方法,以允许我刷新访问令牌。

请指教。谢谢。

请注意,使用此代码我可以获得访问令牌。只是我希望此代码在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;        
        }
    }

2 个答案:

答案 0 :(得分:8)

我研究了一个更合适的样本:GoogleApisSample的Tasks.WinForms.NoteMgr ......然后我找到了解决方案。

解决方案在下面的代码中。它的关键部分是调用 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; 
    }`

答案 1 :(得分:0)

如果您使用的是.NET客户端库(http://code.google.com/p/google-api-dotnet-client/),则无需进行此操作。使用您第一次检索的刷新令牌时,库将自动为您请求新的访问令牌。