Skip to content

feat: track and invite passkey enrollment for imported users #338

Closed

Description

@Bccorb

Part of #334. Related: #178.

Problem

After an import, the work that remains is getting every person enrolled with a passkey or a security key, ideally two authenticators each. Today there is no way to see who still has not enrolled, or to invite them.

Proposal

  • A clear "imported, not yet enrolled" state for users with no credential
  • Admin action to send enrollment invites (single and bulk) using the existing magic link / OTP delivery, including external delivery mode so an organization can send them from its own mail system
  • Enrollment progress per organization: not enrolled, one authenticator, two or more
  • Expose it in the admin dashboard and through the API so it can feed the coverage report in No authentication coverage report for assessment and insurance responses #178

Activity

  1. added
    enhancementNew feature or request
    P2GovRAMP readiness track
    on Oct 5, 2026
  2. Bccorb commented on Oct 6, 2026

    @Bccorb
    ContributorAuthor

    In progress. Decisions:

    • An invite is a notice that links to the sign-in page and carries no credential.
    • A new tenant setting, prompt_passkey_enrollment, makes email or phone code sign-ins and magic link sign-ins return nextStep: 'enroll_passkey' for a user with no passkey. That is how an invited user lands in enrollment, whichever way they sign in.

    PRs, in merge and release order:

    1. feat(core): add an enrollment invite email seamless-auth-messaging#6: sendEnrollmentInviteEmail. Released as messaging 0.2.0, together with the bootstrap-invite removal and the relicense already on main.
    2. feat(enrollment): add schemas for tracking and inviting passkey enrollment seamless-auth-types#87: enrollment and invite schemas, the enrollment_invite_email delivery kind, prompt_passkey_enrollment, nextStep on code and magic link sign-ins, and admin_enrollment_invite_sent.
    3. API branch feat/enrollment-tracking, which covers:
      • GET /admin/enrollment, with counts per status, scoped by organization or to imported users;
      • POST /admin/enrollment/invites, for listed users or a whole organization, 200 at a time, skipping anyone invited in the last 24h, with external delivery supported;
      • the setting and nextStep;
      • an enrollment_invited_at column.
        The raw SQL was checked against a real Postgres. Its PR opens once 1 and 2 are published.
    4. feat(proxy): pass the passkey enrollment admin routes through seamless-auth-server#179: passthroughs in Express, Fastify and Next.js.
    5. Admin dashboard enrollment view: in progress.

    Found along the way: the Next.js adapter lacks the #337 retirement routes (fells-code/seamless-auth-server#180).

  3. Bccorb commented on Oct 6, 2026

    @Bccorb
    ContributorAuthor

    All the pieces are now up:

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    P2GovRAMP readiness trackenhancementNew feature or request

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions