VityaSchel/open-grind-google-oauth-android-app
GitHub: VityaSchel/open-grind-google-oauth-android-app
一款基于 GeckoView 的 Android 辅助应用,帮助第三方 Grindr 客户端绕过 Android WebView 的 Google OAuth 登录限制并自动获取认证令牌。
Stars: 0 | Forks: 0
# 打开 Grind Google OAuth
这是一款 Android 配套应用,用于获取 Google OAuth token,以便登录如 [Open Grind](https://git.opengrind.org/open-grind/open-grind) 等第三方 Grindr 客户端。
## 下载
- 从 [Releases](https://git.opengrind.org/open-grind/open-grind-google-oauth-android-app/releases) 下载
## 构建
请参阅 [BUILDING.md](./BUILDING.md)。
## 安全
Releases 使用 [Open Grind governance keys](https://git.opengrind.org/open-grind/open-grind/src/branch/main/KEYS.md) 进行签名;切勿从非官方来源安装。
## 许可证
[MIT](./LICENSE)
为什么需要一个单独的应用?
完整讨论:https://git.opengrind.org/open-grind/open-grind/issues/27 ## 为什么不使用原生的 Google OAuth 流程? 官方 Grindr 应用使用 Android 设备上安装的 Google Identity Services 来验证用户身份。这意味着该应用会调用宿主系统的 GIS,后者会检查调用者的 package id(必须是 `com.grindrapp.android` 而不是 `org.opengrind`,如果将后者设置成前者,会导致同时使用这两者的用户遇到冲突错误),更重要的是,还会检查 package signature(这是我们无法伪造的,因为我们没有 Grindr 的 JKS;签名欺骗仅在部分定制 ROM 和已 root 的设备上可行)。 **使用官方的 Google Play Services,第三方客户端无法为 Grindr 官方应用启动原生的 Google OAuth 流程。** ## 为什么不使用 microG 或其他免费的重实现版本? MicroG 本身不允许欺骗,因为它是一个通过相同 API 工作的直接替代品。YouTube ReVanced 内置了其自己修补过的 microG。然而这仍然存在一个问题:原生的 Google OAuth 流程需要 DroidGuard token,该 token 是通过在一个专有的、不透明的认证 VM 中执行由 Google web API 针对每个请求生成的专有且不透明的 blob 来获取的。该 VM 需要设备权限来验证其是否为真实的物理设备而非模拟器。DroidGuard VM 经过了完全混淆,microG 开发者对其进行的逆向工程尝试均告失败。[查看 microG 讨论](https://github.com/microg/GmsCore/issues/214#issuecomment-2040272095)。 **在没有真实物理 Android 设备并且运行来自 Google 的专有且不透明的可执行文件的情况下,无法完成原生的 Google OAuth 流程。** 这既违背了 Open Grind 的跨平台目标,也违背了完全透明的初衷。 ## 我们能在没有原生流程的情况下通过 Google OAuth 认证用户吗? 可以的,web.grindr.com 就是这么运作的。整个认证过程都是 web 流程,这意味着它应该在浏览器中运行,不需要任何设备认证 token,因此可以在任何平台上运行,甚至在模拟器中也可以。web 流程是从 web.grindr.com 以 `responseType=postMessage` 方式启动的,生成的 code 由 GIS JavaScript 以 `web.grindr.com` 源发布,因此只有具有 web.grindr.com 源的页面才能接收回调。此外,浏览器(甚至是内嵌的浏览器)会阻止在没有用户操作的情况下打开新标签页等动作,这就是为什么在启动页面上需要点击一下的原因。 然而,还有另一个问题:Google OAuth Web Flow 页面会积极地检查在内嵌窗口(包括系统 WebView,这也是 Open Grind UI 底层使用的 Tauri 组件)中渲染登录页面的任何迹象。虽然对于基于 WebKit 的 WebView(用于 macOS 和 iOS 的 WKWebView,用于 Linux 的 WebKitGTK)和基于 Chromium 的 WebView(用于 Windows 的 WebView2,用于 Android 的 Chromium)来说,更改 User-Agent 和移除 Sec- 标头是可行的,**但 Android 的 Chromium WebView 特别添加了一个特殊的 X-Requested-With 标头,且无法被移除。** 这是 Google 专门为了“欺诈/滥用检测”而推送的(即在其服务中检测 Android WebView,例如 OAuth 页面)。2023 年,有公告称 Google 开始了一项试验,允许开发者选择不发送此标头,**但在 2025 年该决定被撤销,现在 Android 系统的所有 Chromium WebView 请求都会发送 X-Requested-With 标头,且无法禁用,** 这正是触发 Google OAuth 页面“安全检查”并拒绝登录尝试的原因。 **所有其他平台通过在平台的原生 WebView 中直接渲染 Google 的 OAuth 页面都可以正常工作,** 因此这仅仅是 Android 平台上的问题。 ## 我们能为 Android 打包一个不同的 WebView 吗? 没有太多选择:对于 Android,只有 Chromium WebView 和 Mozilla 的 GeckoView 可用。虽然可以在 Open Grind 应用中打包其中一个,但有两个实际问题: 1. WebView 库非常大。Chromium 超过 200 MB,GeckoView 稍微轻一点,大约 100 MB。 2. 许多用户甚至根本不需要使用 Google 登录,因此仅仅为了渲染一个页面就给应用增加 100MB+ 的大小是不切实际的。 3. 此外,将应用发布到 F-Droid 官方仓库要求从源代码构建所有依赖项,而构建 GeckoView 即使在性能强大的机器上也需要数小时——这就是为什么你在 F-Droid 仓库中[看不到任何带有 GeckoView 的应用](https://forum.f-droid.org/t/clean-build-with-geckoview-dependency/11066)的原因(除了 Fennec 和 Tor 等浏览器);另外 GeckoView 包含了 Google Services,因此我们在从源代码构建之前必须对其进行修补。 **每种 CPU 架构都会给通用包增加约 100MB。因此,Open Grind apk 会从约 70MB 增加到约 500MB,而这仅仅是为了一个只有部分人会用到一次的页面。** ## 我们可以将 GeckoView 与 Android 应用打包在一起,并在其中渲染应用本身吗? 不行,Tauri 的 [wry](https://github.com/tauri-apps/wry) 只能使用系统的 WebView(即 Chromium)。 ## 我们如何解决所有这些问题? 为了解决这些 Google OAuth 问题,我们开发了 [Grindr Google OAuth WebExtension](https://git.opengrind.org/open-grind/grindr-google-oauth-webextension)。这是一个浏览器扩展(支持 Firefox、任何基于 Firefox 的浏览器(如 Librewolf、Firefox for Android)、Google Chrome、Chromium 以及任何基于 Chromium 的浏览器(如 Brave)),它会启动 web.grindr.com(以满足启动页面的源要求),将文档替换为一个简单的“Sign in with Google”按钮,然后在响应 token 到达 Grindr Web 的 API 之前拦截来自 Google OAuth 页面的 token,并将其打印出来或传递给 GeckoView 以进行编程式 intent。 ## 既然是个扩展,那为什么还要开发一个应用呢? 整个应用基本上就是一个由 [GeckoView](https://mozilla.github.io/geckoview/) 驱动的内嵌了该扩展的无头浏览器。原因很简单,因为大多数 Android 用户没有安装 Firefox,而是使用 Google Chrome for Android,后者不支持扩展。 此外,该应用具有编程式 intent 功能,允许 Open Grind 应用调用此应用并自动获取 token,无需复制粘贴。为了安全起见,只有在两个应用都使用相同的 JKS 签名时,此功能才有效。 如果你是高级用户,并且希望避免安装不必要的应用,可以考虑直接使用浏览器扩展,并将 token 复制粘贴到 Open Grind 应用中。标签:Android应用, Grindr, OAuth认证, 后台面板检测, 第三方客户端