Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/371.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 为什么我会得到OAuthProblemException error=';无效的_请求';描述=';无法提取句柄';在做精确的OAuth时_Java_Oauth 2.0_Exact Online - Fatal编程技术网

Java 为什么我会得到OAuthProblemException error=';无效的_请求';描述=';无法提取句柄';在做精确的OAuth时

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(…)中使用的“代码”),使用了其中显示的本地主机重定向。我们从浏览器的地址栏复制代码,并将其存储在下一步计算机可以再次读取的位置。这是因为代码是从浏览器地址栏复制的。

在调用Exact-Online API进行身份验证时,我们遇到了获取第一个刷新令牌失败的问题。我们不知道为什么。这是我们从Exact得到的信息:

  • Http代码:400
  • JSON数据:
我们使用基于库org.apache.oltu.oauth2.client(1.0.2)的Java代码:


我们确实执行了第一步(获取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();