JavaFX WebEngine 和 Pushbullet 身份验证
JavaFX WebEngine and Pushbullet authentication
我正在开发一个小型 JavaFX 应用程序,旨在打开 Pushbullet 身份验证网页以获得 OAuth 访问令牌。用 JavaFX 编写非常简单。但是,当我填写表格并使用 Google 帐户对其进行验证时,身份验证失败。由于在我的本机 Chrome 浏览器中打开 URL 时同样有效,我认为这个问题与 JavaFX WebEngine 实现的有限能力有关,但我无法弄清楚它是什么。
下面是我使用的代码片段:
import javafx.application.Application;
import javafx.geometry.Rectangle2D;
import javafx.scene.Scene;
import javafx.scene.layout.BorderPane;
import javafx.scene.web.WebEngine;
import javafx.scene.web.WebView;
import javafx.stage.Screen;
import javafx.stage.Stage;
public class GraphicalAuthorizationHelper extends Application {
public static void main(String[] args) {
launch(args);
}
@Override
public void start(final Stage stage) throws Exception {
BorderPane borderPane = new BorderPane();
WebView browser = new WebView();
WebEngine webEngine = browser.getEngine();
borderPane.setCenter(browser);
webEngine.documentProperty().addListener((prop, oldDoc, newDoc) -> {
//enableFirebug(webEngine);
});
String url = "https://www.pushbullet.com/authorize?client_id=hjT07gVHUYnzN1iVlWIFU7K1Sxype0bf&redirect_uri=http://oauth.yfiton.com/callback&response_type=token";
webEngine.load(url);
Rectangle2D primaryScreenBounds = Screen.getPrimary().getVisualBounds();
Scene scene = new Scene(
borderPane,
primaryScreenBounds.getWidth() * 0.55,
primaryScreenBounds.getHeight() * 0.65);
stage.setScene(scene);
stage.show();
}
private static void enableFirebug(final WebEngine engine) {
engine.executeScript("if (!document.getElementById('FirebugLite')){E = document['createElement' + 'NS'] && document.documentElement.namespaceURI;E = E ? document['createElement' + 'NS'](E, 'script') : document['createElement']('script');E['setAttribute']('id', 'FirebugLite');E['setAttribute']('src', 'https://getfirebug.com/' + 'firebug-lite.js' + '#startOpened');E['setAttribute']('FirebugLite', '4');(document['getElementsByTagName']('head')[0] || document['getElementsByTagName']('body')[0]).appendChild(E);E = new Image;E['setAttribute']('src', 'https://getfirebug.com/' + '#startOpened');}");
}
}
我注意到该代码可用于成功获取 Twitter 或 Slack 的 Oauth 访问令牌,但不能使用 Pushbullet 身份验证机制。提交表单时,出现错误 登录您的帐户时出错:无法连接到服务器:
我大约两周前给 Pushbullet 团队发了一封电子邮件,但没有得到回复。与此同时,我尝试使用 firebug 来了解可能是什么问题但没有成功:
欢迎任何想法、评论等。
正如 Chris Pushbullet 所建议的,该问题与 CORS 有关。我通过在运行 JavaFX WebEngine 实例的 JVM 上将 Java 系统 属性 sun.net.http.allowRestrictedHeaders
设置为 true
成功解决了这个问题。
我正在开发一个小型 JavaFX 应用程序,旨在打开 Pushbullet 身份验证网页以获得 OAuth 访问令牌。用 JavaFX 编写非常简单。但是,当我填写表格并使用 Google 帐户对其进行验证时,身份验证失败。由于在我的本机 Chrome 浏览器中打开 URL 时同样有效,我认为这个问题与 JavaFX WebEngine 实现的有限能力有关,但我无法弄清楚它是什么。
下面是我使用的代码片段:
import javafx.application.Application;
import javafx.geometry.Rectangle2D;
import javafx.scene.Scene;
import javafx.scene.layout.BorderPane;
import javafx.scene.web.WebEngine;
import javafx.scene.web.WebView;
import javafx.stage.Screen;
import javafx.stage.Stage;
public class GraphicalAuthorizationHelper extends Application {
public static void main(String[] args) {
launch(args);
}
@Override
public void start(final Stage stage) throws Exception {
BorderPane borderPane = new BorderPane();
WebView browser = new WebView();
WebEngine webEngine = browser.getEngine();
borderPane.setCenter(browser);
webEngine.documentProperty().addListener((prop, oldDoc, newDoc) -> {
//enableFirebug(webEngine);
});
String url = "https://www.pushbullet.com/authorize?client_id=hjT07gVHUYnzN1iVlWIFU7K1Sxype0bf&redirect_uri=http://oauth.yfiton.com/callback&response_type=token";
webEngine.load(url);
Rectangle2D primaryScreenBounds = Screen.getPrimary().getVisualBounds();
Scene scene = new Scene(
borderPane,
primaryScreenBounds.getWidth() * 0.55,
primaryScreenBounds.getHeight() * 0.65);
stage.setScene(scene);
stage.show();
}
private static void enableFirebug(final WebEngine engine) {
engine.executeScript("if (!document.getElementById('FirebugLite')){E = document['createElement' + 'NS'] && document.documentElement.namespaceURI;E = E ? document['createElement' + 'NS'](E, 'script') : document['createElement']('script');E['setAttribute']('id', 'FirebugLite');E['setAttribute']('src', 'https://getfirebug.com/' + 'firebug-lite.js' + '#startOpened');E['setAttribute']('FirebugLite', '4');(document['getElementsByTagName']('head')[0] || document['getElementsByTagName']('body')[0]).appendChild(E);E = new Image;E['setAttribute']('src', 'https://getfirebug.com/' + '#startOpened');}");
}
}
我注意到该代码可用于成功获取 Twitter 或 Slack 的 Oauth 访问令牌,但不能使用 Pushbullet 身份验证机制。提交表单时,出现错误 登录您的帐户时出错:无法连接到服务器:
我大约两周前给 Pushbullet 团队发了一封电子邮件,但没有得到回复。与此同时,我尝试使用 firebug 来了解可能是什么问题但没有成功:
欢迎任何想法、评论等。
正如 Chris Pushbullet 所建议的,该问题与 CORS 有关。我通过在运行 JavaFX WebEngine 实例的 JVM 上将 Java 系统 属性 sun.net.http.allowRestrictedHeaders
设置为 true
成功解决了这个问题。