Add invite universal-link landing for app deep-link

Encode the admin invite QR as a clean /invite/<hlv_token> universal-link
that the iOS app intercepts via the AASA wildcard matcher. Add the
matching web route as a thin, shape-validated redirect onto the existing
register flow, and open the path on the public allowlist so an
unauthenticated scanner reaches it. A malformed token segment is
indistinguishable from no invite — no database hit, no enumeration
oracle. The token is never logged.
This commit is contained in:
Marc-André Bombeck committed 2026-06-14 19:32:19 +02:00
1 parent e561f8d893
commit c1eb618dcc
8 files changed
+235 -5

No files matched your search

+1 -1
View File
@@ -152,7 +152,7 @@ export const adminInvitePaths: NonNullable<ZodOpenApiObject["paths"]> = {
url: z
.string()
.describe(
"Composed registration deep link (`/auth/register?invite=…`).",
"Composed invite universal-link (`/invite/<hlv_token>`). On iOS it opens the app onto onboarding registration; in a browser it redirects to `/auth/register?invite=…`.",
),
}),
"AdminInviteCreated",