public static async Task <string> GetTokenEndpointAsync(this TokenHandlerOptions options, HttpClient authorityHttpClient)
        {
            if (options.TokenEndpoint.IsPresent())
            {
                return(options.TokenEndpoint);
            }

            var endpoint = await authorityHttpClient.GetTokenEndpointFromDiscoveryDocument(options).ConfigureAwait(false);

            return(endpoint);
        }
        public static async Task <string> GetTokenEndpointFromDiscoveryDocument(this HttpClient authorityHttpClient, TokenHandlerOptions options)
        {
            var discoveryRequest = new DiscoveryDocumentRequest
            {
                Address = options.Authority,
                Policy  = options.DiscoveryPolicy,
            };
            var discoveryResponse = await authorityHttpClient.GetDiscoveryDocumentAsync(discoveryRequest).ConfigureAwait(false);

            if (discoveryResponse.IsError)
            {
                if (discoveryResponse.ErrorType == ResponseErrorType.Http)
                {
                    throw new InvalidOperationException($"Discovery endpoint {discoveryRequest.Address} is unavailable: {discoveryResponse.Error}");
                }
                if (discoveryResponse.ErrorType == ResponseErrorType.PolicyViolation)
                {
                    throw new InvalidOperationException($"Policy error while contacting the discovery endpoint {discoveryRequest.Address}: {discoveryResponse.Error}");
                }
                if (discoveryResponse.ErrorType == ResponseErrorType.Exception)
                {
                    throw new InvalidOperationException($"Error parsing discovery document from {discoveryRequest.Address}: {discoveryResponse.Error}");
                }
            }

            return(discoveryResponse.TokenEndpoint);
        }