I’ve been trying to get an access token from freeagent for a while and can not find any reason why this code doesn’t work.
Seems like HTTP basic auth just isn’t working.
One issue I have bypassed is an SSL issue as well.
App settings:
<add key="FreeAgentConsumerKey" value="1gohv0NDO9hNxKG6NopXuw" />
<add key="FreeAgentConsumerSecret" value="qwRQJypi8NiHu5pRrTWBbQ" />
<add key="FreeAgentBaseUrl" value="https://api.sandbox.freeagent.com/v2" />
<add key="FreeAgentTokenEndpoint" value="/token_endpoint" />
<add key="FreeAgentTokenApproveApp" value="/approve_app" />
<add key="FreeAgentOauthAuthCallbackUrl" value="/Admin/FreeAgent/GetAccessCodeFromAuthCode" />
<add key="FreeAgentOauthCallbackUrl" value="/Admin/FreeAgent/FreeAgentResponse" />
string url = CompleatConfiguration.AppSettings["FreeAgentBaseUrl"] + CompleatConfiguration.AppSettings["FreeAgentTokenEndpoint"];
string code = Request.QueryString["code"].ToString();
string callbackURL = Request.Url.GetLeftPart(UriPartial.Authority) + CompleatConfiguration.AppSettings["FreeAgentOauthCallbackUrl"];
string credentailString = CompleatConfiguration.AppSettings["FreeAgentConsumerKey"] + ":" + CompleatConfiguration.AppSettings["FreeAgentConsumerSecret"];
string credentials = Convert.ToBase64String(Encoding.ASCII.GetBytes(credentailString));
HttpClient client = new HttpClient();
client.BaseAddress = new Uri(url);
client.DefaultRequestHeaders.Authorization = new System.Net.Http.Headers.AuthenticationHeaderValue("Basic", credentailString);
client.DefaultRequestHeaders.Host = "api.freeagent.com";
client.DefaultRequestHeaders.ConnectionClose = true;
client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
client.DefaultRequestHeaders.UserAgent.Add(new ProductInfoHeaderValue("Java", "1.6.0_33"));
var values = new Dictionary<string, string>
{
{ "grant_type", "authorization_code" },
{ "code", code },
{ "redirect_uri", UriUtility.UrlEncode(callbackURL) },
};
var content = new FormUrlEncodedContent(values);
HttpResponseMessage response = await client.PostAsync(url, content);
var t = response.Content.ReadAsStringAsync();