使用 RestSharp 获取 ExactOnline 的访问令牌时出现 400 错误请求
400 Bad Request when getting access token for ExactOnline using RestSharp
我需要通过 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);
我看不到您使用的是哪个 REST 客户端,但我可以假设 "request.AddParameter" 调用需要名称、内容和参数类型。
如果是这样那就是你添加错了,你需要做的是:
request.AddParameter("code", authToken, ParameterType.RequestBody);
request.AddParameter("redirect_uri", redirectUri, ParameterType.RequestBody);
等等,必须一个一个加上request参数,让其余的client构造body。
编辑:我看到客户端只在名称上,好的,这就是 RestSharp 所期望的:)
您的第一期是 。
我的猜测是第二个问题与您设置的exactAccesTokenRequestEndpoint
有关。 Exact 在 URL 上真的很挑剔,我怀疑你拥有的 URL 是否是 EOL 中应用商店设置中描述的 URL。确保它至少是设置中给出的 URL。
因此,如果您的设置包含 http://localhost/abc/
,您的 redirect_uri
应该至少是 http://localhost/abc/
而不是 http://localhost/abc
,这看起来是有效的。
好的,解决了。在将它传递给步骤 3 中的请求之前,必须对我从步骤 2 中的确切响应返回的令牌进行 UrlDecode。像这样:
var authToken = WebUtility.UrlDecode("code/token");
感谢所有参与此事的人:-)
我需要通过 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);
我看不到您使用的是哪个 REST 客户端,但我可以假设 "request.AddParameter" 调用需要名称、内容和参数类型。
如果是这样那就是你添加错了,你需要做的是:
request.AddParameter("code", authToken, ParameterType.RequestBody);
request.AddParameter("redirect_uri", redirectUri, ParameterType.RequestBody);
等等,必须一个一个加上request参数,让其余的client构造body。
编辑:我看到客户端只在名称上,好的,这就是 RestSharp 所期望的:)
您的第一期是
我的猜测是第二个问题与您设置的exactAccesTokenRequestEndpoint
有关。 Exact 在 URL 上真的很挑剔,我怀疑你拥有的 URL 是否是 EOL 中应用商店设置中描述的 URL。确保它至少是设置中给出的 URL。
因此,如果您的设置包含 http://localhost/abc/
,您的 redirect_uri
应该至少是 http://localhost/abc/
而不是 http://localhost/abc
,这看起来是有效的。
好的,解决了。在将它传递给步骤 3 中的请求之前,必须对我从步骤 2 中的确切响应返回的令牌进行 UrlDecode。像这样:
var authToken = WebUtility.UrlDecode("code/token");
感谢所有参与此事的人:-)