Files
hanzo.ai/app/(marketing)/join/layout.tsx
zooqueenandHanzo Dev e022a96b95 A sign-in IAM holds is finished on hanzo.ai, with the reset and the invitation
The panel finishes what IAM holds, because IAM holds it in a host-only
challenge cookie on the host the credential was posted to, which is this one:
a second factor (the authenticator app's code, the code IAM sent by email or
text, or a recovery code; a wrong one asks for the credential again) and an
unproven address (the code IAM sent to it, or another address and its code).
Only enrolling a factor still goes to the issuer's page.

Beside it, on this site:
- /forget: a code to the address, then the new password with it
  (PUT /v1/iam/password). The panel's "Forgot password?" opens it.
- /join: an emailed invitation accepted as the person signed in here, with
  the code IAM sends for an invitation pinned to an address.
- /auth/callback names IAM's refusal of a provider sign-in for an account
  whose address is unproven.

The sign-in pages (/login, /signup, /forget, /join, /auth/*) are never framed:
lib/edge.ts FRAME renders X-Frame-Options: DENY and an enforced
frame-ancestors 'none' into universe, beside the report-only policy. /forget
and /join are bare pages and private ones. @hanzo/iam 0.21.29 carries the
calls and is the one copy in the tree.

Co-authored-by: Hanzo Dev <[email protected]>
2026-10-14 23:26:42 -07:00

15 lines
466 B
TypeScript

import type { Metadata } from 'next'
import { pageMeta } from '@/lib/page-meta'
// The page is 'use client', so its title lives here. Whether it is indexed is
// lib/publish's to say, and it says so.
export const metadata: Metadata = pageMeta({
title: 'Join an organization',
description: 'Accept an invitation to an organization on Hanzo.',
path: '/join',
})
export default function Layout({ children }: { children: React.ReactNode }) {
return children
}