使用RestSharp获取ExactOnline的访问令牌时出现400 Bad Request

时间:2016-02-04 18:51:43

标签: c# rest restsharp exact-online

我需要浏览ExactOnline的OAuth2流程,但是我被困在文档的第3步(https://developers.exactonline.com/#OAuth_Tutorial.html%3FTocPath%3DAuthentication%7C_____2

我使用Postman chrome应用程序创建了以下c#代码,用于测试http请求,但仍然遇到400个错误(错误请求)。邮差应用程序也给了我400个错误,但无论我设置什么设置,我似乎总是得到400错误。

var authToken = "veryyyyyylongtoken";
var redirectUri = "the-url-I-set-in-the-dashboard";
var grantType = "authorization_code";
var clientId = "id-guid";
var clientSecret = "secret";
var exactAccesTokenRequestEndpoint = "https://start.exactonline.nl/api/oauth2/token";

var client = new RestClient(exactAccesTokenRequestEndpoint);
var request = new RestRequest(Method.POST);
request.AddHeader("content-type", "application/x-www-form-urlencoded");
request.AddParameter("application/x-www-form-urlencoded", String.Format("code={0}&redirect_uri={1}&grant_type={2}&client_id={3}&client_secret={4}", authToken, exactAccesTokenRequestEndpoint, grantType, clientId, clientSecret), ParameterType.RequestBody);
var response = client.Execute(request);

这段代码怎么了?

在Exact注册的应用程序正在测试模式下运行,而不是生产。

有什么想法吗?

=====编辑=====

根据Gusman的指针,我将代码更改为以下内容。这仍然会产生400错误。

var client = new RestClient(exactAccesTokenRequestEndpoint);
var request = new RestRequest(Method.POST);
request.AddHeader("content-type", "application/x-www-form-urlencoded");
request.AddParameter("code", authToken, ParameterType.RequestBody);
request.AddParameter("redirect_uri", redirectUri, ParameterType.RequestBody);
request.AddParameter("grant_type", grantType, ParameterType.RequestBody);
request.AddParameter("client_id", clientId, ParameterType.RequestBody);
request.AddParameter("client_secret", clientSecret, ParameterType.RequestBody);
var response = client.Execute(request);

3 个答案:

答案 0 :(得分:1)

您的第一个问题是solved by Gusman

我的猜测是第二个问题与你设定的exactAccesTokenRequestEndpoint有关。确切对URL很挑剔,我怀疑你的URL是否是EOL中App Store设置中描述的URL。确保它至少是设置中给出的URL。

因此,如果您的设置包含http://localhost/abc/,那么您的redirect_uri应该至少为http://localhost/abc/而不是http://localhost/abc,这似乎有效。

答案 1 :(得分:0)

我看不到您使用的是哪个REST客户端,但我可以假设“request.AddParameter”调用需要Name,Content和ParamType。

如果是这种情况,那么你添加错了,你需要这样做:

request.AddParameter("code", authToken, ParameterType.RequestBody);
request.AddParameter("redirect_uri", redirectUri, ParameterType.RequestBody);

等等,你必须逐个添加request参数,让其余的客户端构造主体。

编辑:我看到客户端只是名字,好吧,这就是RestSharp所期望的:)

答案 2 :(得分:0)

好的,解决了。必须在第2步中将我从第2步中的Exact响应返回的令牌解码,然后再将其传递给步骤3中的请求。如下所示:

var authToken = WebUtility.UrlDecode("code/token");

感谢所有关注此事的人: - )

相关问题