Google OAuth2:何时以及如何使用刷新令牌

我有一个已安装的c#app,其代码可以获取授权代码并将其交换为访问令牌。 我正在存储刷新令牌。 我知道在某些时候我需要使用它来获取新的访问令牌。 我们假设我定期调用以下方法来监控已与我的云端硬盘帐户共享的文件。

///  /// Retrieve a list of File resources. ///  /// Drive API service instance. /// List of File resources. public static List retrieveAllFiles(DriveService service) { List result = new List(); FilesResource.ListRequest request = service.Files.List(); request.Q = "sharedWithMe and trashed=false"; do { try { FileList files = request.Fetch(); result.AddRange(files.Items); request.PageToken = files.NextPageToken; } catch (Exception e) { Console.WriteLine("An error occurred: " + e.Message); request.PageToken = null; } } while (!String.IsNullOrEmpty(request.PageToken)); return result; } } 

我假设在某些时候对service.Files.List()的调用将失败。 我如何知道由于访问令牌过期而导致失败以及使用刷新令牌的代码是什么? 我已经从这里收集了一些代码(下面)以使用刷新令牌。 访问令牌到期时是否会调用此方法?

  private static IAuthorizationState GetAuthorization(NativeApplicationClient arg) { // If we already have a RefreshToken, use that if (!string.IsNullOrEmpty(RefreshToken)) { state.RefreshToken = RefreshToken; if (arg.RefreshToken(state)) { mTextBox.Text = "RF: " + RefreshToken; return state; } } // authCode is a TextBox on the form var result = arg.ProcessUserAuthorization(mTextBox.Text, state); RefreshToken = state.RefreshToken; return result; } 

如果有人在刷新AccessToken时仍有问题,这可能有助于您找到解决方案:

  Google.GData.Client.RequestSettings settings = new RequestSettings(""); Google.GData.Client.OAuth2Parameters parameters = new OAuth2Parameters() { ClientId = "", ClientSecret = "", AccessToken = "", //really necessary? RedirectUri = "urn:ietf:wg:oauth:2.0:oob", RefreshToken = "", AccessType = "offline", TokenType = "refresh", Scope = "https://www.google.com/m8/feeds/" //Change to needed scopes, I used this for ContactAPI }; try { Google.GData.Client.OAuthUtil.RefreshAccessToken(parameters); } catch (Exception ex) { MessageBox.Show(ex.Message); } 

访问令牌将在1小时后过期 – 在此之后,当您针对Google API拨打电话时,您将开始收到“401 Invalid Credentials”错误。

我不熟悉.NET Google API客户端库 – Java和Python库会在发生这种情况时自动请求新的访问令牌,具体取决于您创建DriveService对象的方式。 我希望.NET库具有类似的语义。

何时使用刷新令牌:

根据我的理解,当您不希望每次启动时对应用程序进行身份validation时,都会使用刷新令牌。 这对于应用程序开发期间的调试非常有用(因为手动身份validation可能会在一段时间后变得烦人)。

如何使用刷新令牌:

在最基本的意义上:

 public static GOAuth2RequestFactory RefreshAuthenticate(){ OAuth2Parameters parameters = new OAuth2Parameters(){ RefreshToken = "", AccessToken = "", ClientId = "", ClientSecret = "", Scope = "https://spreadsheets.google.com/feeds https://docs.google.com/feeds", AccessType = "offline", TokenType = "refresh" }; string authUrl = OAuthUtil.CreateOAuth2AuthorizationUrl(parameters); return new GOAuth2RequestFactory(null, "", parameters); } 

您可以在其他代码中使用此方法与服务,也许这样

 GOAuth2RequestFactory requestFactory = RefreshAuthenticate(); SpreadsheetsService service = new SpreadsheetsService(""); service.RequestFactory = requestFactory; 

希望这可以帮助!

花了两天的时间来确定如何使用刷新令牌来使用和更新访问令牌。 我的答案发布在另一个post中:

Google API V 3.0 .Net库和Google OAuth2如何处理刷新令牌