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

时间:2013-06-05 19:14:42

标签: c# google-oauth

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

   /// <summary>
   /// Retrieve a list of File resources.
   /// </summary>
   /// <param name="service">Drive API service instance.</param>
   /// <returns>List of File resources.</returns>
   public static List<File> retrieveAllFiles(DriveService service) {
      List<File> result = new List<File>();
      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()的调用将失败。我怎么知道它因访问令牌过期而失败,使用刷新令牌的代码是什么?我已经从here收集了一些代码(下面)以使用刷新令牌。当访问令牌到期时,是否会调用此方法?

    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;
   }

4 个答案:

答案 0 :(得分:2)

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

   if(str.length() <= 1) return str;

   String mid = str.substring(1, str.length() - 1);

   return str.charAt(str.length() - 1) + mid + str.charAt(0);  

答案 1 :(得分:1)

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

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

答案 2 :(得分:1)

何时使用刷新令牌:

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

如何使用刷新令牌:

从最基本的意义上讲:

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

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

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

希望这有帮助!

答案 3 :(得分:0)

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

How Google API V 3.0 .Net library and Google OAuth2 Handling refresh token