Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

HttpClient and setting Authorization headers

I'm trying to make a simple request to the Basecamp API, I'm following the instructions provided adding in a sample user agent and my credentials yet I keep getting a 403 Forbidden response back.

My credentials are definitely correct so is it a case of my request/credentials being set incorrectly?

This is what I have (removed personal info):

var httpClient = new HttpClient();
var content = new FormUrlEncodedContent(new[] { new KeyValuePair<string, string>("User-Agent", "MyApp [EMAIL ADDRESS]") });

httpClient.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Basic",
            Convert.ToBase64String(ASCIIEncoding.ASCII.GetBytes(string.Format("{0}:{1}", "[USERNAME]", "[PASSWORD]"))));

var response = await httpClient.PostAsync("https://basecamp.com/[USER ID]/api/v1/projects.json", content);
var responseContent = response.Content;

using (var reader = new StreamReader(await responseContent.ReadAsStreamAsync()))
{
     Console.WriteLine(await reader.ReadToEndAsync());
}
like image 488
DGibbs Avatar asked Jul 07 '14 11:07

DGibbs


1 Answers

A quick look over their documentation seems to indicate that the projects.json endpoint accepts the following in the body of the POST:

{
    "name": "This is my new project!",
    "description": "It's going to run real smooth"
}

You're sending the User-Agent as the POST body. I'd suggest you change your code as follows:

    var credentials = Convert.ToBase64String(Encoding.ASCII.GetBytes(string.Format("{0}:{1}", "[USERNAME]", "[PASSWORD]")));
    using (var httpClient = new HttpClient())
    {
        httpClient.DefaultRequestHeaders.Add("User-Agent", "MyApp [EMAIL ADDRESS]");
        httpClient.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Basic", credentials);
        var response = await httpClient.PostAsJsonAsync(
            "https://basecamp.com/[USER ID]/api/v1/projects.json",
            new {
                name = "My Project",
                description = "My Project Description"
            });

        var responseContent = await response.Content.ReadAsStringAsync();
        Console.WriteLine(responseContent);
    }

This posts the payload as specified in the docs and sets your user agent in the headers as it should be.

like image 165
Dean Ward Avatar answered Oct 06 '22 08:10

Dean Ward