如何使用c#在oauth2api中获取身份验证代码和访问代码



我正在尝试使用sage API,它使用oauth2,如facebook和google API。我需要获得授权代码,并使用Asp将其交换为访问令牌。净C#。我手动检索授权码的代码如下(我正在登录,授权它,然后从URL手动检索它,对吗?(:

public ActionResult GetRequest()
{
var URL = "https://www.sageone.com/oauth2/auth/central?filter=apiv3.1";
var urlParameters = "&response_type=code&client_id=_client_id_&redirect_uri=_redirect_uri_&state=d57w5d193";
return Redirect("https://www.sageone.com/oauth2/auth/central?filter=apiv3.1&response_type=code&client_id=_client_id_&redirect_uri=_redirect_uri_&scope=full_access&state=_state_");
}

然后,我手动将授权代码导入到模型中,并使用以下代码将信息发布到令牌URL:

public async Task<string> GetAccess()
{
using (var client = new HttpClient())
{
client.BaseAddress = new Uri("https://oauth.accounting.sage.com/token");
var contentType = new MediaTypeWithQualityHeaderValue("application/json");
client.DefaultRequestHeaders.Accept.Add(contentType);
AccessTokenSend accessTokenSend = new AccessTokenSend()
{
client_id = "_client_id_",
client_secret = "_client_secret",
code = "_authorisation_code_from_url",
grant_type = "authorization_code",
redirect_url = "_redirect_url"
};
var json = Newtonsoft.Json.JsonConvert.SerializeObject(accessTokenSend);
var data = new System.Net.Http.StringContent(json, Encoding.UTF8, "application/json");
var result = await client.PostAsync("https://oauth.accounting.sage.com/token", data);
string resultContent = await result.Content.ReadAsStringAsync();
return resultContent;
}
}

这应该返回访问代码,但是抛出一个错误;您传输的身份验证代码具有意外的格式";。我的访问令牌模型如下:

public class AccessTokenSend
{
public string client_id { get; set; }
public string  client_secret { get; set; }
public string code { get; set; }
public string grant_type { get; set; }
public string redirect_url { get; set; }
}

有人知道我怎么做错了吗?sage除了poster之外,不会为开发人员提供帮助。

您将数据作为JSON发送到令牌端点。您应该将它们作为表单数据发送(内容类型为application/x-www-form-urlencoded(。