title: Request new access token and resubmit the api request
body: <p>I am using the Refit library with my Xamarin forms project to send API requests. It works great, but have an issue when the access token expires.</p>
  
  <p>When the access token expires, I get an 401 error from the server, as expected. I then make a call to the Identity Server to issue a new access token, but I am having difficulty in resubmitting the API request. I still get unauthorised error.  Appreciate some help.</p>
  
  <p>I have created an AuthenticatedHttpClientHandler class to handle the token.</p>
  
  <pre><code>public class AuthenticatedHttpClientHandler : HttpClientHandler
  {
      private readonly string _token;
  
      public AuthenticatedHttpClientHandler(string token ) 
      {
          _token = token;       
      }
  
      protected override async Task&lt;HttpResponseMessage&gt; SendAsync(HttpRequestMessage request, CancellationToken cancellationToken)
      {
          var auth = request.Headers.Authorization;
          if (auth != null &amp;&amp; !string.IsNullOrWhiteSpace(_token))
          {
              request.Headers.Authorization = new AuthenticationHeaderValue(auth.Scheme, _token);
          }
          else
          {
              request.Headers.Remove("Authorization");
          }
          var result = await base.SendAsync(request, cancellationToken).ConfigureAwait(false);
          if (result.StatusCode == System.Net.HttpStatusCode.Unauthorized )
          {
              IdSrvApiService idsrvApiService = new IdSrvApiService();
              RefreshTokenService refreshTokneService = new RefreshTokenService(idsrvApiService);
  
              if( Settings.RefreshToken != ""){
                  var newToken = await refreshTokneService.RefreshAccessToken(Priority.Background).ConfigureAwait(false);
                  TokenHelper.CacheToken(newToken);
                  request.Headers.Authorization = new AuthenticationHeaderValue(auth.Scheme, Settings.AccessToken);
                  return await base.SendAsync(request, cancellationToken).ConfigureAwait(false);
              }
              else
              {
                  return result;
              }
          }
          else
          {
              return result;
          }
      }
  }
  </code></pre>