Cordova Android 应用程序中的网页不可用

2024-05-08

编辑:我一直在解决这个问题并回顾我的所有步骤。我很乐意缩小这个问题的规模,并在令人困惑的情况下获得更多确切的细节。目前,我觉得 Keycloak 似乎只想将我重定向到 https://,据我所知,这应该是 Wildfly 服务器配置问题。

编辑:我减少了我的问题,但这引起了混乱,所以我将问题回滚到原来的问题,最相关的部分在底部,我将在其中注意到这一点

我正在抓狂地试图找出可能导致这个问题的原因。

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

我正在使用身份管理系统 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 中相当自由地设置了我的意图和允许导航:

<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 连接,如果这对任何人有帮助的话。

很抱歉我无法提供更多信息,我希望我能找到一些东西,任何可以掌握的东西,但我在这里完全迷失了,无论我做什么,它似乎都无法找到本地主机。

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”

EDIT:

我在尝试一个非常基本的 keycloak 实现时也注意到了这个错误(这里的玩具示例:https://github.com/keycloak/keycloak/blob/master/examples/cordova/www/index.html 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 中的相关代码涉及创建本机承诺:

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:深入挖掘......

错误在这里抛出。

所以我的猜测是,这是由于我的重定向网址以某种方式https://本地主机 https://localhost而不是http://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,我强烈认为这是造成我的错误的原因。

My 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>

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

请检查并提供更多信息:

  • 追踪您从 Cordova 到 Keycloak 的请求
  • 发送/请求什么redirect_uri参数?
  • 您可以尝试像这样启用审核审计配置 https://www.keycloak.org/docs/6.0/server_admin/#login-events检查“redirect_uri”参数。

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

  • 检查您的客户端和领域配置(cordova 应用程序的领域配置示例 https://github.com/keycloak/keycloak/blob/master/examples/cordova/example-realm.json)

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

仅当您的 keycloak 位于反向代理后面(使用 x-forwarded-* 标头)时,才必须使用属性“proxy-address-forwarding”。


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

需要记住的一些要点:

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

使用 Keycloak v6.0.1 进行测试

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

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

mkdir 平台插件
cordova 插件添加 cordova-plugin-inappbrowser
cordova 插件添加 cordova-plugin-whitelist
cordova平台添加android
科尔多瓦构建安卓
科尔多瓦运行安卓

PS:如果您有一些公共测试实例可以检查或者

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Cordova Android 应用程序中的网页不可用 的相关文章

  • 带有自定义阵列适配器的微调器不允许选择项目

    我使用自定义阵列适配器作为微调器 但是 当在下拉列表中选择一个项目时 下拉列表保留在那里 并且微调器不会更新 这是错误行为 与使用带有字符串的通用数组适配器相比 这是自定义类 我错过了什么吗 谢谢 public class Calendar
  • 无法理解 Java 地图条目集

    我正在看一个 java 刽子手游戏 https github com leleah EvilHangman blob master EvilHangman java https github com leleah EvilHangman b
  • Flutter 深度链接

    据Flutter官方介绍深层链接页面 https flutter dev docs development ui navigation deep linking 我们不需要任何插件或本机 Android iOS 代码来处理深层链接 但它并没
  • ROOM迁移过程中如何处理索引信息

    CODE Entity tableName UserRepo indices Index value id unique true public class GitHubRepo PrimaryKey autoGenerate true p
  • 反思 Groovy 脚本中声明的函数

    有没有一种方法可以获取 Groovy 脚本中声明的函数的反射数据 该脚本已通过GroovyShell目的 具体来说 我想枚举脚本中的函数并访问附加到它们的注释 Put this到 Groovy 脚本的最后一行 它将作为脚本的返回值 a la
  • 归并排序中的递归:两次递归调用

    private void mergesort int low int high line 1 if low lt high line 2 int middle low high 2 line 3 mergesort low middle l
  • 如何在不更改手机语言的情况下更改Android应用程序语言?

    我希望用户在应用程序内选择一种语言 选择语言后 我希望字符串使用特定语言 如果我更改手机语言 那么我的应用程序将以设置的语言运行 我无法找到任何在不更改手机语言的情况下设置语言的方法 此外 一旦设置了语言 更改就应该反映出来 有人可以建议一
  • Android Webview 图像未加载

    我制作了一个简单的应用程序WebView 但有些图片无法加载 正确 在我的电脑上 错误 在模拟器中 Correct 错误 没有横幅 于是我用Chrome debug进行调试 发现我的代码被改变了 我不添加像noscript or style
  • 调节麦克风录音音量

    我们正在尝试调整录音时的音量级别 麦克风似乎非常敏感 会接收到很多静电 我们查看了 setVolumeControlStream 但找不到传入其中来控制麦克风的流 将您的音频源设置为 MIC using MediaRecorder Audi
  • 将多模块 Maven 项目导入 Eclipse 时出现问题 (STS 2.5.2)

    我刚刚花了最后一个小时查看 Stackoverflow com 上的线程 尝试将 Maven 项目导入到 Spring ToolSuite 2 5 2 中 Maven 项目有多个模块 当我使用 STS 中的 Import 向导导入项目时 所
  • 在 Android 上按下电源按钮时,如何防止先调用 onDestroy() 再调用 onCreate()

    我正在记录每个 onCreate 和 onDestroy 调用 我发现 一旦我单击 Android 上的电源按钮 以及模拟器上的电源按钮 我的活动中就会拨打电话 gt onDestroy gt onCreate 这会杀死我的游戏 然后立即从
  • 如何在 Maven 中显示消息

    如何在 Maven 中显示消息 在ant中 我们确实有 echo 来显示消息 但是在maven中 我该怎么做呢 您可以使用 antrun 插件
  • Windows 上的 Nifi 命令

    在我当前的项目中 我一直在Windows操作系统上使用apache nifi 我已经提取了nifi 0 7 0 bin zip文件输入C 现在 当我跑步时 bin run nifi bat as 管理员我在命令行上看到以下消息 但无法运行
  • 如何测试 spring-security-oauth2 资源服务器安全性?

    随着 Spring Security 4 的发布改进了对测试的支持 http docs spring io spring security site docs 4 0 x reference htmlsingle test我想更新我当前的
  • 将 JTextArea 内容写入文件

    我在 Java Swing 中有一个 JTextArea 和一个 提交 按钮 需要将textarea的内容写入一个带有换行符的文件中 我得到的输出是这样的 它被写为文件中的一个字符串 try BufferedWriter fileOut n
  • com.jcraft.jsch.JSchException:身份验证失败

    当我从本地磁盘上传文件到远程服务器时 出现这样的异常 com jcraft jsch JSchException Auth fail at org apache tools ant taskdefs optional ssh Scp exe
  • 在 Android 中,如何将字符串从 Activity 传递到 Service?

    任何人都可以告诉如何将字符串或整数从活动传递到服务 我试图传递一个整数 setpossition 4 但它不需要 启动时总是需要 0 Service 我不知道为什么我不能通过使用 Service 实例从 Activity 进行操作 publ
  • 找到 Android 浏览器中使用的 webkit 版本?

    有没有办法知道某些特定手机上的 Android 浏览器使用的是哪个版本的 webkit 软件 如果有一个您可以浏览以获取该信息的 URL 那就太好了 但任何其他方式也很好 如果你知道 webkit 版本 你就知道 html5 支持多少 至少
  • 无法将 admob 与 firebase iOS/Android 项目链接

    我有两个帐户 A 和 B A 是在 Firebase 上托管 iOS Android unity 手机游戏的主帐户 B 用于将 admob 集成到 iOS Android 手机游戏中 我在尝试将 admob 分析链接到 Firebase 项
  • Jackson 将单个项目反序列化到列表中

    我正在尝试使用一项服务 该服务为我提供了一个带有数组字段的实体 id 23233 items name item 1 name item 2 但是 当数组包含单个项目时 将返回该项目本身 而不是包含一个元素的数组 id 43567 item

随机推荐