2

我需要通过 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);
4

3 回答 3

1

您的第一个问题由 Gusman 解决

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

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

于 2016-02-05T10:59:02.307 回答
0

我看不到您使用的是哪个 REST 客户端,但我可以假设“request.AddParameter”调用需要名称、内容和参数类型。

如果是这种情况,那么您添加错误,您需要执行以下操作:

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

以此类推,必须将请求参数一一添加,让其余客户端构建主体。

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

于 2016-02-04T19:04:05.193 回答
0

好的,解决了。必须对我在步骤 2 中从 Exact 响应中返回的令牌进行 UrlDecode,然后再将其传递给步骤 3 中的请求。像这样:

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

感谢所有参与此事的人:-)

于 2016-02-05T17:01:16.600 回答