URL-адрес перенаправления Discord OAuth2 не отображается с помощью JavaFX WebView JDK12

Я пытаюсь открыть следующий сайт: ссылка на URL-адрес Discord OAuth2 (наведите курсор на меня, чтобы увидеть ссылку) для загрузки с помощью JavaFX WebView в JDK12. Когда я пытаюсь загрузить этот сайт, отображается только белая страница. Следующий код используется для отображения и обработки WebView. Я использую библиотеку OAuth2Discord для обработки кода и авторизации.

DiscordAuth.java:
DiscordAuth ()

Этот метод инициализирует OAuthBuilder, используемый в остальной части кода ниже.

public DiscordAuth() {
        CLIENT_SECRET = [REDACTED];
        CLIENT_ID = [REDACTED];
        REDIRECT_URL = "https://temperlesergal.github.io/NuBot/discordWebPage/success.html";
         builder = new OAuthBuilder(CLIENT_ID, CLIENT_SECRET)
                .setScopes(new String[]{"connections", "guilds", "email"})
                .setRedirectURI(REDIRECT_URL);
    }


getUser (WebView, WebView, поток)

Это предназначено для запуска процесса получения кода, примененного к URL-адресу при перенаправлении с URL-адреса Auth.

public void getUser(WebView webView, Thread thread) {
    startOAuth2Flow(webView, thread);
}


startOAuth2Flow (WebView, WebView, поток)

Этот метод обрабатывает перенаправление сайта, а также разбивает URL-адрес для получения кода.
P.S. https://temperlesergal.github.io/NuBot/discordWebPage/index.html перенаправляет на URL-адрес аутентификации, указанный выше

private void startOAuth2Flow(WebView webView, Thread thread) {
    String authURL = builder.getAuthorizationUrl(null);
    WebEngine webEngine = webView.getEngine();
    webEngine.setJavaScriptEnabled(true);
    webEngine.setUserAgent("Cotton Le Sergal's OAuth2 grant for app.");
    webEngine.getLoadWorker().stateProperty().addListener(
        (ov, oldState, newState) -> {
            if (webEngine.getLoadWorker().getException() != null || newState == Worker.State.FAILED){
                System.err.println(webEngine.getLoadWorker().getException().toString());
            }else{
                System.out.println(webEngine.getLoadWorker().getState());
            }
        });
        webEngine.locationProperty().addListener((observableValue, oldLocation, newLocation) -> {
        System.out.println("newLocation = " + newLocation);
        if (newLocation.startsWith(REDIRECT_URL) && newLocation.contains("code")) {
            try {
                URL url = new URL(newLocation);
                String[] params = url.getQuery().split("&");
                Map<String, String> map = new HashMap<>();
                for (String param : params) {
                    String name = param.split("=")[0];
                    String value = param.split("=")[1];
                    map.put(name, value);
                }
                code = map.get("code");
                gotTheAccessCode(code, thread);
                System.out.println("Notifying thread");
                synchronized (thread){
                    thread.notify();
                    thread.start();
                    System.out.println("Thread Notified!");
                }
            } catch (MalformedURLException e) {
                e.printStackTrace();
            }
        }
    });
    String url = "https://temperlesergal.github.io/NuBot/discordWebPage/index.html";
    webEngine.load(url);
}


gotTheAccessCode (строковый код, поток потока)

Этот метод обменивает код и инициализирует следующее:
-builder.getUser ();
-builder.getGuilds ();
-builder.getConnections ()

private void gotTheAccessCode(String code, Thread thread) {
    System.out.println("access code: " + code);
    Response response = builder.exchange(code);
    if (response == Response.ERROR) {
        // AN ERROR HAPPENED WHILE EXCHANGING THE CODE
    } else {
        // EVERYTHING WORKED AS EXPECTED
    }
    System.out.println("Testing by printing guild info!");
    getGuildInfo().forEach(guild -> System.out.println(guild.getName()));
    System.out.println("DONE!");
    user =  builder.getUser();
    guilds = builder.getGuilds();
    connections = builder.getConnections();
}

FXMLController.java:
signIn ()

Этот метод запускается, когда пользователь нажимает кнопку входа в систему на сцене FXML. Он предназначен для того, чтобы позволить им входить в систему Discord через приложение JavaFX.

@FXML
void signIn(){
    Thread thread = new Thread(() -> {
        System.out.println("Thread waking up!");
        Platform.runLater(() -> {
            usernameLabel.setText(discordAuth.getUserNameWithDiscriminator());
            setUserAvatar(discordAuth.getUserAvatarURL());
        });
    });
    try {
        if(thread.isAlive())
            thread.wait();
    } catch (InterruptedException e) {
        e.printStackTrace();
    }
    discordSigninWebView.setVisible(true);
    discordSigninWebView.setOpacity(0.0);
    FadeIn signInFade = new FadeIn(discordSigninWebView);
    signInFade.play();
    discordAuth.getUser(discordSigninWebView, thread);
}


Вот что я вижу при загрузке в приложение:
Бот:
URL: URL-адрес не загружен в WebEngine
Описание: это значение по умолчанию посмотрите при запуске приложения. Это вид по умолчанию при запуске приложения»></a> URL: <a target='_blank' href='https://temperlesergal.github.io/NuBot/discordWebPage/index.html'>https://temperlesergal.github.io/NuBot/discordWebPage/index.html</a> <br>Описание. Вот как выглядит WebView, когда я нажимаю кнопку выхода (что должно быть логином, просто забыл  Измени это).  [<img src = URL: https://discordapp.com/oauth2/authorize?client_id=569662931990478857&redirect_uri=https%3A%2F%2Ftemperlesergal.github.io%2FNuBot%2FdiscordWebPage%2FNuBot%2FdiscordWebPage%2Fsuccess.http: //support.http: //support.http: //support.html / a>
Описание: Это белый экран, который отображается после нажатия: «Авторизовать».
Это белый экран, который отображается после нажатия: Authorize

Вот что я вижу при загрузке в Chrome:
Интернет:
URL: https://discordapp.com/oauth2/authorize?client_id=569662931990478857&redirect_uri=https%3A%2F%2Ftemperlesergal.github.io%2FNuBot%2FdiscordWebPage%2Fsuccess.html&response_type=code&scope=identify%20email%20connections%20guilds
Описание. Это то, что должен отображать бот. введите здесь описание изображения

Это информация, выводимая на консоль.

Image size is: 800.0x800.0 with the width being the largest at: 800.0px.
Image is 8.0 times the size it should be... resizing
Image has been resized to the following: 100.0x100.0px.
Actual image size is: 100.0x100.0px.
Test
0    [OkHttp https://discordapp.com/...] DEBUG net.dv8tion.jda.internal.requests.Requester  - Received response with following cf-rays: [5176ddc69aaae202-ORD]
317  [OkHttp https://discordapp.com/...] DEBUG net.dv8tion.jda.internal.requests.Requester  - Received response with following cf-rays: [5176ddc83f13e202-ORD]
320  [Thread-3] INFO  net.dv8tion.jda.api.JDA  - Login Successful!
[0 / 3]
578  [OkHttp https://discordapp.com/...] DEBUG net.dv8tion.jda.internal.requests.Requester  - Received response with following cf-rays: [5176ddca3e3ac510-ORD]
Host Name: [REDACTED]
Host Address: [REDACTED]
693  [JDA [0 / 3] MainWS-ReadThread] INFO  net.dv8tion.jda.internal.requests.WebSocketClient  - Connected to WebSocket
693  [JDA [0 / 3] MainWS-ReadThread] DEBUG net.dv8tion.jda.internal.requests.WebSocketClient  - Sending Identify-packet...
734  [JDA [0 / 3] MainWS-ReadThread] DEBUG net.dv8tion.jda.internal.requests.WebSocketClient  - Got HELLO packet (OP 10). Initializing keep-alive.
754  [OkHttp https://discordapp.com/...] DEBUG net.dv8tion.jda.internal.requests.Requester  - Received response with following cf-rays: [5176ddcaaf3dc510-ORD]
754  [Thread-3] INFO  net.dv8tion.jda.api.JDA  - Login Successful!
[1 / 3]
832  [JDA [0 / 3] MainWS-ReadThread] DEBUG net.dv8tion.jda.internal.handle.GuildSetupController  - Setting incomplete count to 0
832  [JDA [0 / 3] MainWS-ReadThread] INFO  net.dv8tion.jda.api.JDA  - Finished Loading!
Shard: 1 out of: 3 is ready.
842  [JDA [0 / 3] Gateway-Worker 1] DEBUG net.dv8tion.jda.internal.requests.WebSocketClient  - Sending normal message {"op":3,"d":{"game":{"name":"Type owo.help","type":0},"afk":false,"status":"online","since":1568679123052}}
883  [OkHttp https://discordapp.com/...] DEBUG net.dv8tion.jda.internal.requests.Requester  - Received response with following cf-rays: [5176ddcc2a44c56c-ORD]
998  [OkHttp https://discordapp.com/...] DEBUG net.dv8tion.jda.internal.requests.Requester  - Received response with following cf-rays: [5176ddccab8dc56c-ORD]
998  [Thread-3] INFO  net.dv8tion.jda.api.JDA  - Login Successful!
[2 / 3]
5952 [JDA [1 / 3] MainWS-ReadThread] INFO  net.dv8tion.jda.internal.requests.WebSocketClient  - Connected to WebSocket
5953 [JDA [1 / 3] MainWS-ReadThread] DEBUG net.dv8tion.jda.internal.requests.WebSocketClient  - Sending Identify-packet...
5955 [JDA [1 / 3] MainWS-ReadThread] DEBUG net.dv8tion.jda.internal.requests.WebSocketClient  - Got HELLO packet (OP 10). Initializing keep-alive.
6047 [JDA [1 / 3] MainWS-ReadThread] DEBUG net.dv8tion.jda.internal.handle.GuildSetupController  - Setting incomplete count to 1
6082 [JDA [1 / 3] MainWS-ReadThread] INFO  net.dv8tion.jda.api.JDA  - Finished Loading!
Shard: 2 out of: 3 is ready.
6084 [JDA [1 / 3] MainWS-ReadThread] DEBUG net.dv8tion.jda.internal.handle.GuildSetupController  - Finished setup for guild 530802775530012672 firing cached events 0
6246 [JDA [1 / 3] Gateway-Worker 1] DEBUG net.dv8tion.jda.internal.requests.WebSocketClient  - Sending normal message {"op":3,"d":{"game":{"name":"Type owo.help","type":0},"afk":false,"status":"online","since":1568679128295}}
11239 [JDA [2 / 3] MainWS-WriteThread] INFO  net.dv8tion.jda.internal.requests.WebSocketClient  - Connected to WebSocket
11240 [JDA [2 / 3] MainWS-WriteThread] DEBUG net.dv8tion.jda.internal.requests.WebSocketClient  - Sending Identify-packet...
11241 [JDA [2 / 3] MainWS-ReadThread] DEBUG net.dv8tion.jda.internal.requests.WebSocketClient  - Got HELLO packet (OP 10). Initializing keep-alive.
11368 [JDA [2 / 3] MainWS-ReadThread] DEBUG net.dv8tion.jda.internal.handle.GuildSetupController  - Setting incomplete count to 0
11368 [JDA [2 / 3] MainWS-ReadThread] INFO  net.dv8tion.jda.api.JDA  - Finished Loading!
Shard: 3 out of: 3 is ready.
11504 [JDA [2 / 3] Gateway-Worker 1] DEBUG net.dv8tion.jda.internal.requests.WebSocketClient  - Sending normal message {"op":3,"d":{"game":{"name":"Type owo.help","type":0},"afk":false,"status":"online","since":1568679133581}}
newLocation = https://temperlesergal.github.io/NuBot/discordWebPage/index.html
SCHEDULED
RUNNING
SUCCEEDED
newLocation = https://discordapp.com/api/oauth2/authorize?client_id=569662931990478857&redirect_uri=https%3A%2F%2Ftemperlesergal.github.io%2FNuBot%2FdiscordWebPage%2Fsuccess.html&response_type=code&scope=identify%20email%20connections%20guilds
SCHEDULED
RUNNING
newLocation = https://discordapp.com/oauth2/authorize?client_id=569662931990478857&redirect_uri=https%3A%2F%2Ftemperlesergal.github.io%2FNuBot%2FdiscordWebPage%2Fsuccess.html&response_type=code&scope=identify%20email%20connections%20guilds
SUCCEEDED


Воспроизводимость: 100%
Простая попытка загрузить URL-адрес Auth в WebView вызовет эту проблему.
Мы будем очень признательны за любые мысли по этому поводу, спасибо.


person Corbin    schedule 17.09.2019    source источник


Ответы (1)


Я обнаружил, что проблема заключается в том, что [проверка целостности субресурсов WebView не работает в Windows и Linux.

Это можно увидеть и доказать здесь, перейдя по следующим ссылкам:

  1. https://bugs.openjdk.java.net/browse/JDK-8219917
  2. https://github.com/javafxports/openjdk-jfx/issues/230

Как исправить возникшую проблему

    Please view link no.1 for more in depth details

Короче говоря, проблема заключалась в том, что в OpenJDK 12 для JavaFX была ошибка, из-за которой не выполнялась проверка целочисленности субресурсов на платформах Windows и Linux, что вызывало проблему, когда он не предоставлял криптографический хэш, соответствующий хешу из полученного ресурса. Таким образом, содержимое веб-страницы не будет отображаться должным образом. Способ решения указан в ссылке №1. Ошибка исправлена ​​в JavaFX 13, поэтому все, что требовалось для решения этой проблемы, - это обновить модули JavaFX в моем файле maven pom.

person Corbin    schedule 19.09.2019