DSH HUB
首页插件商店插件包社区排行榜资源发布指南
插件源码
返回插件目录

cmyfqwq /

cmyfqwq/webauthn-for-webview-shells

仅 Topic 仓库

Enable passkeys in WebView-shell browsers (Via, Quark, ...) via the official androidx.webkit switch — LSPosed module; targets older WebView (~124-13x) where WebAuthn is not default-enabled; fully reversible

★ 2 Stars1 Forks0 IssuesN/A 社区评分0 已确认安装
查看 GitHub
README来源: master@aa268278

🔑 WebAuthn for WebView Shells

Enable passkeys in lightweight WebView-based browsers — via the official androidx.webkit switch, flipped from the inside.

License: MIT Requires LSPosed Android 7.0+ System WebView 124+

English · 简体中文


🧠 What this actually is

Passkeys are already inside Android's system WebView. The official guideline says every host app that embeds a WebView must opt in itself:

WebSettingsCompat.setWebAuthenticationSupport(settings, WEB_AUTHENTICATION_SUPPORT_FOR_APP);

Lightweight "shell" browsers (Via, Quark, X, and dozens more) render every page through the system WebView — but none of them make this call, so navigator.credentials() never reaches the credential stack. The capability is already there; the switch is simply never flipped.

This module flips it, without touching native app code. It is a small LSPosed module that hooks WebView construction inside target browsers and applies the official integration on their behalf, backed by its own copy of androidx.webkit.

No patching of the system password manager · no network I/O · no UI injection. Revert = flip the module off in LSPosed. That's it.

✅ What you get

graph LR
    A[navigator.credentials] --> B{host switch}
    B -- off --> X[no passkey prompt]
    B -- module --> C[WAShell hook]
    C --> D[System WebView 124]
    D --> E[native password manager sheet]
  • Your website now realizes the phone has a platform authenticator.
  • Creating and verifying passkeys goes through the native password manager (ColorOS 密码本, One UI Passcodes, Google Password Manager…)
  • The module keeps gluing itself back on whenever the host re-touches its settings.

🧱 Tech stack

Layer What Why
Hook runtime Xposed API 93 / LSPosed injects into the browser's own process; module off = stock behavior
Bridge androidx.webkit 1.17 (WebSettingsCompat.setWebAuthenticationSupport) the official WebView ↔ Credential-Manager integration; shipped inside the module dex
Target floor Android 7.0+ (API 24), System WebView 124+ device must already carry WebAuthn-capable WebView; module enables, never backports
Build javac → d8 → aapt2 → apksigner (plain PowerShell, no Gradle) ~350 lines total; everything reproducible from one script
Depends on nothing else no network, no UI, no system writes reversibility is the design constraint

Why ship our own androidx.webkit? Because the shells never bundle it — the hook must supply the bridge library it is applying.

📦 Shell support

Browser Status
Via GP (mark.via.gp 7.3.3) ✅ tested — passkey create + verify work with the native password manager
Via CN (mark.via) wired & installed by default; needs nothing but your own test
Everything else ⚠️ supports this mechanism (WebView ≥ 124), but not wired by default — add the package name to TARGETS in MainHook.java, rebuild, and try it out

🕓 Compatibility: is it even needed on your device?

Maybe not — check before reporting "no effect". The module exists because WebView used to keep WebAuthn off by default unless the host opted in. Newer WebView / OS builds have started flipping that default themselves:

Your device situation What you'll see
Android ≤ 16, WebView ~124–13x (historical default: opt-in required) ✅ module's sweet spot — without it, shell browsers report "no platform authenticator"
Android 16/17 with a recent WebView (observed: HyperOS 4.0.0.24, Android 17, WebView past 124) ⚠️ WebView may already enable navigator.credentials for shells by default — the module becomes a no-op redundancy on those devices; passkey success there comes from the credential provider side, not this hook
Shell that calls the androidx switch itself ✅ any version — module is redundant by design (that's the goal)

Quick self-check: disable the module in LSPosed, force-stop the browser, retry passkeys. If they still work, your device no longer needs this module — nothing is broken.

Also note the provider side: on Xiaomi HyperOS 4 the default credential provider may still reject WebView-originated requests (NotReadableError); see FAQ / 中文 FAQ.

🚀 Install

  1. Requires: rooted device + LSPosed, Android 7.0+, system WebView 124+
  2. Download the APK from Releases, install it
  3. Enable the module in LSPosed Manager (scope is pre-filled from the manifest) and restart your browser
  4. Open any passkey-capable site and watch the system sheet appear

This module is fully reversible — turn it off or pm uninstall io.github.cmyfqwq.webauthnshell; everything returns to stock with no residue.

🔨 Build it yourself

No Gradle needed — a plain PowerShell script drives javac → d8 → aapt2 → apksigner from any Android SDK:

pwsh build.ps1   # → build/WebAuthn-Shell-1.0.0.apk

Want another browser? Add its package to TARGETS in MainHook.java and rebuild.

🧭 FAQ

Is this an exploit? No. It sets a public (androidx) setting inside the target app's own process — exactly what the shell could call itself. Nothing is added to a WebView it cannot already do, and system WebView gatekeepers stay untouched.

Why not ask the browsers upstream? Please do — a 3-line change in each browser would obsolete this module, which is the ideal outcome. This module exists to close the gap until then.

☕ Credits

  • Built on the official androidx.webkit WebView–Credential-Manager bridge
  • Problem coverage gathered from the caniuse passkey matrix (QQ 14.9 / Baidu 13.52 unsupported) and in-app-shell breakage reported upstream, e.g. openai/codex #31204

:fox:') built by cmyfqwq · MIT · no tracking, no network, one switch

—/ 5

暂无评分

需要先验证清单

Commit aa2682785424

社区评论

还没有评论,来写第一条。

DSH HUB

社区维护的 DSH 插件索引。不是 GitHub 或 DeepSeek AI 的官方产品。

社区资源API关于