Need to read a Domo dataset using C#

I am having trouble getting an access token to work in C#. I am writing an application, and I need to update an office list using the data in one of my Domo datasets.

I have created client and secret IDs and post to "https://api.domo.com/oauth/token". I have tried several grant types and included/excluded a scope. The response is always unauthorized.

StatusCode: 401, ReasonPhrase: 'Unauthorized', Version: 1.1,…


var tokenUrl = "https://api.domo.com/oauth/token";
var values = new Dictionary<string, string>
{
{ "grant_type", "client_credentials" },
{ "scope", "data" },
{ "client_id", clientId },
{ "client_secret", clientSecret }
};

var content = new FormUrlEncodedContent(values);



HttpResponseMessage response = client.PostAsync(tokenUrl, content).Result;
if (!response.IsSuccessStatusCode)
{
throw new Exception($"Failed to get access token: {response.ReasonPhrase}");
}

I just need to read a single dataset in Domo, using C#. Or VB.net…I'll convert code if needed. I haven't had trouble using Python. But that doesn't translate to C#.

** Was this post helpful? Click Agree or Like below. **
** Did this solve your problem? Accept it as a solution! **

Best Answer

  • GrantSmith
    GrantSmith Coach
    Answer ✓

    It looks like you're not passing in an Authorization Header.

    Here's some sample code I've used in the past which may be helpful:

    using System;
    using System.Net.Http;
    using System.Net.Http.Headers;
    using System.Text;
    using System.Threading.Tasks;
    
    class Program
    {
        private static readonly string ClientId = "YOUR_CLIENT_ID";
        private static readonly string ClientSecret = "YOUR_CLIENT_SECRET";
        private static readonly string DomoAuthUrl = "https://api.domo.com/oauth/token";
        
        static async Task Main(string[] args)
        {
            string token = await GetDomoOAuthToken();
            Console.WriteLine($"OAuth Token: {token}");
        }
    
        private static async Task<string> GetDomoOAuthToken()
        {
            using (HttpClient client = new HttpClient())
            {
                // Construct the authorization header
                string authHeader = Convert.ToBase64String(Encoding.ASCII.GetBytes($"{ClientId}:{ClientSecret}"));
                client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Basic", authHeader);
    
                // Prepare the request content
                HttpContent content = new StringContent("grant_type=client_credentials", Encoding.UTF8, "application/x-www-form-urlencoded");
    
                // Make the POST request
                HttpResponseMessage response = await client.PostAsync(DomoAuthUrl, content);
    
                // Ensure the request was successful
                response.EnsureSuccessStatusCode();
    
                // Parse and return the token from the response
                string responseContent = await response.Content.ReadAsStringAsync();
                dynamic jsonResponse = Newtonsoft.Json.JsonConvert.DeserializeObject(responseContent);
                return jsonResponse.access_token;
            }
        }
    }
    

    **Was this post helpful? Click Agree or Like below**
    **Did this solve your problem? Accept it as a solution!**

Answers

  • GrantSmith
    GrantSmith Coach
    Answer ✓

    It looks like you're not passing in an Authorization Header.

    Here's some sample code I've used in the past which may be helpful:

    using System;
    using System.Net.Http;
    using System.Net.Http.Headers;
    using System.Text;
    using System.Threading.Tasks;
    
    class Program
    {
        private static readonly string ClientId = "YOUR_CLIENT_ID";
        private static readonly string ClientSecret = "YOUR_CLIENT_SECRET";
        private static readonly string DomoAuthUrl = "https://api.domo.com/oauth/token";
        
        static async Task Main(string[] args)
        {
            string token = await GetDomoOAuthToken();
            Console.WriteLine($"OAuth Token: {token}");
        }
    
        private static async Task<string> GetDomoOAuthToken()
        {
            using (HttpClient client = new HttpClient())
            {
                // Construct the authorization header
                string authHeader = Convert.ToBase64String(Encoding.ASCII.GetBytes($"{ClientId}:{ClientSecret}"));
                client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Basic", authHeader);
    
                // Prepare the request content
                HttpContent content = new StringContent("grant_type=client_credentials", Encoding.UTF8, "application/x-www-form-urlencoded");
    
                // Make the POST request
                HttpResponseMessage response = await client.PostAsync(DomoAuthUrl, content);
    
                // Ensure the request was successful
                response.EnsureSuccessStatusCode();
    
                // Parse and return the token from the response
                string responseContent = await response.Content.ReadAsStringAsync();
                dynamic jsonResponse = Newtonsoft.Json.JsonConvert.DeserializeObject(responseContent);
                return jsonResponse.access_token;
            }
        }
    }
    

    **Was this post helpful? Click Agree or Like below**
    **Did this solve your problem? Accept it as a solution!**
  • That works. Thank you @GrantSmith .

    ** Was this post helpful? Click Agree or Like below. **
    ** Did this solve your problem? Accept it as a solution! **