Java 为什么我会得到OAuthProblemException error=';无效的_请求';描述=';无法提取句柄';在做精确的OAuth时
在调用Exact-Online API进行身份验证时,我们遇到了获取第一个刷新令牌失败的问题。我们不知道为什么。这是我们从Exact得到的信息:Java 为什么我会得到OAuthProblemException error=';无效的_请求';描述=';无法提取句柄';在做精确的OAuth时,java,oauth-2.0,exact-online,Java,Oauth 2.0,Exact Online,在调用Exact-Online API进行身份验证时,我们遇到了获取第一个刷新令牌失败的问题。我们不知道为什么。这是我们从Exact得到的信息: Http代码:400 JSON数据: 我们使用基于库org.apache.oltu.oauth2.client(1.0.2)的Java代码: 我们确实执行了第一步(获取setCode(…)中使用的“代码”),使用了其中显示的本地主机重定向。我们从浏览器的地址栏复制代码,并将其存储在下一步计算机可以再次读取的位置。这是因为代码是从浏览器地址栏复制的。
- Http代码:400
- JSON数据:
我们确实执行了第一步(获取setCode(…)中使用的“代码”),使用了其中显示的本地主机重定向。我们从浏览器的地址栏复制代码,并将其存储在下一步计算机可以再次读取的位置。这是因为代码是从浏览器地址栏复制的。在那里,您将找到该代码的URL编码版本(通常在“%21”中可见),当将其逐字传递到setCode中时,后续调用将失败 建议:URL解码值或使用Undertow或类似工具设置一个小型临时本地主机HTTP服务器,以捕获发送给您的本地主机URL的代码:
Undertow server = Undertow.builder() //
.addHttpListener(7891, "localhost") //
.setHandler(new HttpHandler() {
@Override
public void handleRequest(final HttpServerExchange exchange) throws Exception {
String code = exchange.getQueryParameters().get("code").getFirst();
LOG.info("Recieved code: {}.", code);
LOG.info("Store code");
storeCode(code);
LOG.info("Code stored");
exchange.getResponseHeaders().put(Headers.CONTENT_TYPE, "text/plain");
exchange.getResponseSender().send( //
"Thanks for getting me the code: " + code + "\n" //
+ "Will store it for you and get the first refreshToken..." //
+ "Please have a look at " + OAUTH_STATE_INI
+ " for the new code & refreshToken in a minute" //
);
done.add("done");
}
}).build();
server.start();
NB:请确保重定向URL在您的确切应用程序设置中是正确的这是因为代码是从浏览器地址栏复制的。在那里,您将找到该代码的URL编码版本(通常在“%21”中可见),当将其逐字传递到setCode中时,后续调用将失败 建议:URL解码值或使用Undertow或类似工具设置一个小型临时本地主机HTTP服务器,以捕获发送给您的本地主机URL的代码:
Undertow server = Undertow.builder() //
.addHttpListener(7891, "localhost") //
.setHandler(new HttpHandler() {
@Override
public void handleRequest(final HttpServerExchange exchange) throws Exception {
String code = exchange.getQueryParameters().get("code").getFirst();
LOG.info("Recieved code: {}.", code);
LOG.info("Store code");
storeCode(code);
LOG.info("Code stored");
exchange.getResponseHeaders().put(Headers.CONTENT_TYPE, "text/plain");
exchange.getResponseSender().send( //
"Thanks for getting me the code: " + code + "\n" //
+ "Will store it for you and get the first refreshToken..." //
+ "Please have a look at " + OAUTH_STATE_INI
+ " for the new code & refreshToken in a minute" //
);
done.add("done");
}
}).build();
server.start();
NB:确保重定向URL在您的应用程序设置中正确无误
Undertow server = Undertow.builder() //
.addHttpListener(7891, "localhost") //
.setHandler(new HttpHandler() {
@Override
public void handleRequest(final HttpServerExchange exchange) throws Exception {
String code = exchange.getQueryParameters().get("code").getFirst();
LOG.info("Recieved code: {}.", code);
LOG.info("Store code");
storeCode(code);
LOG.info("Code stored");
exchange.getResponseHeaders().put(Headers.CONTENT_TYPE, "text/plain");
exchange.getResponseSender().send( //
"Thanks for getting me the code: " + code + "\n" //
+ "Will store it for you and get the first refreshToken..." //
+ "Please have a look at " + OAUTH_STATE_INI
+ " for the new code & refreshToken in a minute" //
);
done.add("done");
}
}).build();
server.start();