java - 网页在 Cordova Android 应用程序中不可用

标签 java android cordova wildfly keycloak

编辑:我一直在解决这个问题并回顾我的所有步骤。如果这个问题令人困惑,我很乐意减少这个问题的大小并获得更多确切的细节。目前,我正处于 Keycloak 似乎只打算将我重定向到 https://的地步,据我所知,这应该是 Wildfly 服务器配置问题。

编辑:我减少了我的问题,但这引起了困惑,所以我将问题回滚到原来的样子,不过最相关的部分在底部,我会在这里注明

我正在绞尽脑汁想找出可能导致此问题的原因。

我在 Android studio 的模拟器上收到以下错误消息:

Webpage not available

我正在使用身份管理系统 Keycloak - 我稍后会回过头来。

我已尝试将我的 CSP 更改为非常宽松:

  <meta http-equiv="Content-Security-Policy" content="default-src *; script-src 'self' 'unsafe-eval' 'unsafe-inline'; style-src 'self' 'unsafe-eval' 'unsafe-inline'; media-src *; img-src 'self' * data:"
  />

我已经安装了 inappbrowser,我已经在我的 config.xml 中非常自由地设置了我的 Intent 和允许导航:

<allow-intent href="http://*/*" />
<allow-intent href="https://*/*" />
<allow-intent href="tel:*" />
<allow-intent href="sms:*" />
<allow-intent href="mailto:*" />
<allow-intent href="geo:*" />
<allow-intent href="gap://*" />
<allow-intent href="APPNAMEHERE://*/*" />
<allow-intent href="fb://*/*" />
<allow-intent href="http://stage.APPNAMEHERE.com://*/*" />
<allow-intent href="https://stage.APPNAMEHERE.com://*/*" />
<allow-navigation href="https://localhost/*"/>
<allow-navigation href="http://localhost/*"/>
<preference name="Hostname" value="localhost" />
<preference name="Scheme" value="https" />
<preference name="MixedContentMode" value="0" />
<access origin="*" />
<allow-navigation href="*" />
<allow-navigation href="localhost://*/*" />
<allow-navigation href="APPNAME://*/*" />
<allow-navigation href="fb://*/*" />
<allow-intent href="*" />
<allow-navigation href="*" />
<allow-intent href="http://*/*" />
<allow-intent href="https://*/*" />
<allow-intent href="*" />

基本上我已经尝试让这个应用程序尽可能宽松,但仍然没有成功进行身份验证。

但还有更奇怪的事情。

我有另一个完全不相关的应用程序,但它也使用相同的身份管理系统。我很高兴地决定,因为我迫不及待地想尝试连接这里的该服务,而且它运行完美 - 没问题。

我尝试从另一个 Keycloak(一堆配置设置)导出客户端并使用它们进行微小的更改,没有骰子。还是一样的错误。

在这一点上,我简直快要崩溃了,我一直在不断地尝试不同的事情,并点击“登录”几个小时,结果完全相同。

什么可能会阻止我登录?

请注意,有一个 iOS 应用程序可以在相同的设置上完美运行,所以它不是设置。

我正在通过 OIDC 进行连接,如果这对任何人有帮助的话。

很抱歉我无法提供更多信息,我希望我能找到一些东西,任何可以掌握的东西,但我完全迷失在这里,似乎无法找到 localhost,无论我如何试试。

Android 控制台(我在 Chrome 检查器中没有看到什么特别的东西):

2019-08-31 10:56:42.002 12062-12191/com.companyname.appname D/InAppBrowser: target = _blank
2019-08-31 10:56:42.003 12062-12062/com.companyname.appname D/InAppBrowser: in blank
2019-08-31 10:56:42.054 12062-12164/com.companyname.appname E/eglCodecCommon: glUtilsParamSize: unknow param 0x000088ef
2019-08-31 10:56:42.054 12062-12164/com.companyname.appname E/eglCodecCommon: glUtilsParamSize: unknow param 0x000088ef
2019-08-31 10:56:42.168 12062-12170/com.companyname.appname D/EGL_emulation: eglMakeCurrent: 0xf0677ba0: ver 3 0 (tinfo 0xd6778770)
2019-08-31 10:56:42.325 12062-12170/com.companyname.appname D/EGL_emulation: eglMakeCurrent: 0xf0677ba0: ver 3 0 (tinfo 0xd6778770)
2019-08-31 10:56:42.501 12062-12170/com.companyname.appname D/EGL_emulation: eglMakeCurrent: 0xf0677ba0: ver 3 0 (tinfo 0xd6778770)

请注意,我已将公司名称替换​​为“companyname”,将应用程序名称替换为“appname”

编辑:

在我的前端尝试一个非常基本的 keycloak 实现(这里的玩具示例:https://github.com/keycloak/keycloak/blob/master/examples/cordova/www/index.html)时,我也注意到了这个错误:

keycloak.js:1000 Uncaught (in promise) undefined
setError    @   keycloak.js:1000
(anonymous) @   keycloak.js:1261
Channel.fire    @   cordova.js:840
_eventHandler   @   inappbrowser.js:53
cb  @   inappbrowser.js:118
callbackFromNative  @   cordova.js:290
(anonymous) @   VM68:1

keycloak.js 中的相关代码与创建 native promise 有关:

function createNativePromise() {
    // Need to create a native Promise which also preserves the
    // interface of the custom promise type previously used by the API
    var p = {
        setSuccess: function(result) {
            p.success = true;
            p.resolve(result);
        },

        setError: function(result) {
            p.success = false;
            p.reject(result);
        }
    };

会不会和inappbrowser有关?

问题的实际相关部分

编辑 2:深入挖掘...

这里会抛出错误。

所以我猜这是因为我的重定向 url 不知何故是 https://localhost而不是 http://localhost ,因为这就是我的重定向 URI。

                ref.addEventListener('loaderror', function(event) {
                    if (!completed) {
                        if (event.url.indexOf('http://localhost') == 0) {
                            var callback = parseCallback(event.url);
                            processCallback(callback, promise);
                            closeBrowser();
                            completed = true;
                        } else {
                            promise.setError();
                            closeBrowser();
                        }
                    }
                });

https://localhost/#state=3bc5b8e8-ee17-4c78-861c-6fa62f5e353b&session_state=43d5518d-c278-4245-b181-899783fd2c6b&code=8e50a9c0-d1a6-4ecd-8e91-e85d92350900.43d5518d-c278-4245-b181-899783fd2c6b.863570ca-9c62-41a5-97bb-33880fe6c62d

即使尝试:

keycloak.init({ onLoad: "check-sso", redirectUri: "http://localhost" })

我仍然得到上面 https://的重定向 uri,我强烈认为这是导致我的错误的原因。

目前我strong 的猜测是,这可能与 Keycloak(使用 Wildfly)配置设置有关。

这是我在 Wildfly 中的服务器设置:

        <server name="default-server">
            <http-listener name="default" socket-binding="http" redirect-socket="http" proxy-address-forwarding="true" enable-http2="true"/>
            <https-listener name="https" socket-binding="https" security-realm="ApplicationRealm" enable-http2="true"/>
            <host name="default-host" alias="localhost">
                <location name="/" handler="welcome-content"/>
                <http-invoker security-realm="ApplicationRealm"/>
            </host>
        </server>

最佳答案

我不明白为什么您认为这可能是由于 wildfly 配置造成的...

请检查并提供更多信息:

  • 跟踪您从 Cordova 到 Keycloak 的请求
  • 发送/请求什么 redirect_uri 参数?
  • 您可以像这样尝试启用审核 audit configuration检查“redirect_uri”参数。

Keycloak 收到带有有效重定向 uri 的请求,然后如果您是有效用户并且收到的重定向 uri 与您的客户端配置匹配...您的应用将被重定向到您请求的 redirect_uri。

编辑 1:关于你的 wildfly standalone.xml: 正如我之前在评论中所说,您的 http-listener 属性 reditect-socket=“http” 是一个错误。 如果要启用到 https 的重定向,请将“http”替换为“https”。否则将其删除。

仅当您的 key 斗篷位于反向代理(使用 x-forwarded-* header )之后时,才必须使用属性“proxy-address-forwarding”。


我使用 Keycloak v6.0.1 进行了测试,它可以正常工作。它重定向到' http://localhost '.

需要注意的几点:

  • 不要使用平台“浏览器”(使用“android”)
  • 添加“inappbrowser”和“白名单”插件
  • 尝试使用新的模拟器/运行时实例。
  • 不要尝试使用外部身份提供者

使用 Keycloak v6.0.1 测试

我使用示例项目进行测试所遵循的步骤:

  1. 从 github 下载 Keycloak 源代码 source
  2. 安装最新版本的 Android Studio 和 Gradle(添加到 PATH)
  3. 转到目录'keycloak/examples/cordova'
  4. 从您的 Keycloak 实例(例如“https://yourdomain:port/auth/js/keycloak.js”)下载“keycloak.js”并放入目录“keycloak/examples/cordova/www”
  5. 从 Android Studio 打开您的模拟器(安装您的运行时,例如“Pixel 2 Api 29”)。
  6. 配置你的领域'example'(从文件导入新领域:'keycloak/examples/cordova/example-realm.json')
  7. 运行命令:

mkdir platforms plugins
cordova plugin add cordova-plugin-inappbrowser
cordova plugin add cordova-plugin-whitelist
cordova platform add android
cordova build android
cordova run android

PS:如果你有一些公共(public)测试实例来检查它或者

关于java - 网页在 Cordova Android 应用程序中不可用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57734603/

相关文章:

ios - 我需要 Mac 设备才能拥有 'signing key' 吗?

android - Sencha 触摸 : unable to call superclass error

java - 在没有 java.lang.String 的情况下比较 Java 中的字符串

java - 无法调用 Product.class 的无参数构造函数

java - Netbeans 中有关 join 方法的错误

java - 如何在Android中的上一个按钮上设置选中的单选按钮?

java - 错误 :(24, 46) 错误 : diamond operator is not supported in -source 1. 6(使用 -source 7 或更高版本启用钻石运算符)

java - 定义的 TextView 上出现 NullPointerException

AsyncTask 中的 java.lang.NullPointerException

android - 是否对破折号进行编码