docs(android): spec Android App Links (assetlinks.json + build-time host)
Promote APP_LINKS.md from a deferred design note into an implementation spec matching the website `feat/mobile-app-links` and android `feat/app-links` branches: the server-side `/.well-known/assetlinks.json` route + `mobile_app_links_enabled` toggle + additive redirect-allowlist entry, and the app-side `autoVerify` intent-filter driven by a build-time `appLinkHost` (a single multi-tenant APK cannot autoVerify open-ended shard domains, so App Links are a white-label / first-party build opt-in; the custom scheme stays the permanent fallback). Update PLAN.md §9 (M9 follow-up) and the §14 open item, and the redirect-URI allowlist section of website/BACKEND_DESIGN.md. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01NgyHnrNa8WwG3doxvxjuCr
This commit is contained in:
@@ -317,8 +317,17 @@ layers (a different app instance triggering `/start` cannot complete someone els
|
||||
against a configured allowlist (`MOBILE_AUTH_REDIRECT_URIS`, default the one fixed application-owned
|
||||
callback `runicgateway://auth/callback`) — **never prefix match** (prefix matching on custom schemes
|
||||
is a known open-redirect vector). Tokens are **never** placed in the callback URL — only the
|
||||
short-lived authorization code. HTTPS App Link URIs can be appended to the allowlist later per shard;
|
||||
that is the *only* server change App Links require (see docs/android/APP_LINKS.md).
|
||||
short-lived authorization code.
|
||||
|
||||
*App Links (implemented).* When the admin toggle `mobile_app_links_enabled` is **on**, `/start` also
|
||||
accepts the self-origin HTTPS callback `https://<request-host>/mobile/callback` — one *additive*
|
||||
exact-match entry, derived from the request/`APP_BASE_URL` and never from client input; the
|
||||
custom-scheme allowlist is never narrowed. The shard then auto-serves `GET
|
||||
/.well-known/assetlinks.json` (fixed package `com.runicgateway.app` + `MOBILE_APP_CERT_SHA256`
|
||||
fingerprints; 404 when the toggle is off or no fingerprint is configured), and
|
||||
`settings.getPublic()` advertises `mobileAppLinks: <bool>`. These two things — one static file route
|
||||
and one more allowlist entry — are the *entire* server surface App Links require. See
|
||||
docs/android/APP_LINKS.md.
|
||||
|
||||
**TOTP through the bridge.** A 2FA account keeps full parity: the callback stages the existing
|
||||
pending-TOTP cookie (now also carrying the bridge `session_id`) and bounces the Custom Tab through the
|
||||
|
||||
Reference in New Issue
Block a user