public void Authenticate(RestClient client, RestRequest request) { if (authFlow != AuthFlow.Obtained) { var restclient = new RestClient(GetHost(client.BaseUrl)); RestRequest authRequest = null; switch (authFlow) { case AuthFlow.ObtainAccessTokenPending: authRequest = GetAuthRequest("client_credentials") .AddParameter("client_id", ClientId) .AddParameter("client_secret", ClientSecret); break; case AuthFlow.RefreshAccessTokenPending: authRequest = GetAuthRequest("refresh_token") .AddParameter("refresh_token", authData?.RefreshToken); break; default: throw new Exception($"Wrong OAuth2 flow"); } var authResponse = restclient.Execute(authRequest); authData = AuthData.Parse(authResponse.Content); authFlow = AuthFlow.Obtained; } if (authData.HasError) { throw new Exception($"Authentication error: {authData.Error}", new Exception(authData.ErrorDescription)); } request.AddHeader("Authorization", AuthorizationHeaderValue); }