Login
Nostr login
Auth mode=nostr: NIP-98 + session cookie (rust-nostr, not JS NDK). Empty allowlist is fail-closed. nsec never on server. Host enable: docs/OPS.md. Open residual (do not invent here): key-loss recovery, durable session store, first-operator bootstrap UX.
Mode: nostr · services host services.surmount.systems
Product auth uses rust-nostr on the server (not JS NDK / no NPM). nsec never leaves your client.
Optional: browser extension implementing window.nostr.signEvent.
curl / NIP-98
- GET
/api/v1/auth/challengefor absoluteuURL and skew window. - Sign kind
27235with tagsu= session URL andmethod= POST. - POST
/api/v1/auth/sessionwith headerAuthorization: Nostr <base64(event JSON)>(or JSON body{{"event": ...}}).
Allowlist: SURMOUNT_NOSTR_ALLOWLIST (npub or hex). Empty allowlist = fail-closed. Session sets CSRF cookie; cookie-authenticated POSTs need X-CSRF-Token.