Skip to content
Super 1.7.0 is production-ready — transactional installs with automatic rollback, cron runtime caps (kill_after_secs), and panic-free input handling. See what’s new →

Authentication

On this page: OSS admin secret (Community / no plugins) → Licensed security (multi-user Access Tokens). Day-to-day RBAC and audit deep-dives live under Advanced Management.

Can OSS use --token?

Yes. OSS has no sk-… Access Tokens, but when you set a non-empty auth_secret in conf/super.toml, that string is the Bearer credential for:

  • super --token <secret> …
  • export SUPER_TOKEN=<secret>
  • super login <secret>
  • Dashboard login
  • Authorization: Bearer <secret>
super --token 'your-auth-secret' list

--token only means “send this string as Bearer”; it does not mint or imply an sk-… token.

CredentialOSSSubscription (security plugin)
auth_secret ([server] in conf/super.toml)✅ single shared secret✅ bootstrap Admin Bearer
Multi-user Access Tokens (sk-…)❌✅

OSS admin secret

Rules

SituationBehavior
Default (host = "127.0.0.1", no auth_secret)API open (local CLI / scripts)
Non-empty auth_secretAuth on — Bearer = that value
Non-loopback TCP without auth_secret (and without the security plugin)Refuse to start
Unix socket only (socket_only)Open (filesystem ACLs); set auth_secret if you want Bearer auth anyway

There is no on-disk auth.key. The only OSS secret is auth_secret in config. Because the file holds a live credential, keep it owner-readable only:

chmod 600 conf/super.toml

superd warns at startup if auth_secret is set and the config is group/world-readable.

# conf/super.toml — enable auth (also required for non-loopback binds)
[server]
auth_secret = "your-own-long-random-string"
host = "127.0.0.1"   # default; use 0.0.0.0 only with auth_secret set

Use the secret

SECRET='your-own-long-random-string'   # same as auth_secret in toml

super login "$SECRET"
super list

super --token "$SECRET" list
export SUPER_TOKEN="$SECRET"

curl -H "Authorization: Bearer $SECRET" \
  http://127.0.0.1:9002/api/v1/programs

Dashboard: open /, paste the same string when prompted.


Licensed feature — security plugin

Sections below are multi-user Access Tokens, RBAC, and audit — security plugin (every subscription; required for licensed startup). Needs a valid [license].key, the plugin in $SUPER_ROOT/plugins/, and auth_secret. When loaded it replaces the OSS core auth gate (one middleware, not two).

Licensed deployments require security

Every subscription includes the security plugin at no extra charge. If [license].key verifies successfully, superd refuses to start unless:

  1. security is listed in the signed license claims (re-issue legacy keys that omit it).
  2. security.so / security.dylib loads successfully from $SUPER_ROOT/plugins/.
  3. auth_secret is set in conf/super.toml (Admin Bearer for bootstrap).
  4. HTTP auth middleware is active (the security plugin exports authenticate).

Other licensed plugins (ui, notify, isolation, …) load only after these checks pass. OSS deployments (no valid license) are unchanged.

Invalid or incompatible license key

If [license].key is set but verification fails (bad signature, expired with retain_grants_after_expiry = false, or superd version outside the signed range), superd does not treat the deployment as licensed:

SignalBehavior
Dev-style OSS (loopback, no plugins, no auth_secret)Degrade — run OSS without plugins; stderr banner + super check / super doctor warnings
Licensed intent (plugins under plugins/, auth_secret set, or non-loopback bind)Refuse startup — avoids silent loss of API auth or licensed features
[license].strict = true or SUPER_LICENSE_STRICT=1Refuse startup always

The SUPER_LICENSE / SUPER_LICENSE_STRICT env overrides are documented in Environment Variables.

Production subscription templates ship with strict = true. Fix the key, renew, or remove licensed-only configuration to run in OSS mode.

ModeAPI authStartup if security missing
OSS (loopback, no auth_secret)OpenN/A
OSS (auth_secret set)Core Bearer = auth_secretN/A
OSS (non-loopback, no secret / no plugin)—Refuse start
Licensed✅ Required (via security)Hard fail
Invalid key + licensed intent / strict—Hard fail (no OSS fallback)

Caution

Legacy keys without security in claims must be re-issued. Partial installs (license OK, ui.so present, security.so missing) also fail fast with an actionable error.

Troubleshooting license verification

When startup, super check, or super doctor reports a bad or incompatible license, try these steps locally (no daemon required for check / keyring):

  1. super check — re-validates conf/super.toml, including the license string and licensed-mode requirements.
  2. super doctor — runs the same config check, then probes a running daemon; prints a Verifying keys line (embedded signing key ids in this CLI binary).
  3. super keyring — lists every verifying key id (kid) compiled into this build; use --json for scripts.

Typical messages and what to do:

SymptomLikely causeWhat to try
Missing signing key id (kid)License predates the current formatAsk your vendor to re-issue the license
Unknown / unrecognized kidLicense signed with a key this superd build does not embed yet (common after key rotation)Run super keyring on the same super / superd version you deploy; upgrade to an official release that includes that kid, or keep your previous license file until you upgrade
Signature mismatch for a listed kidWrong, truncated, or tampered key stringRestore the exact key from your vendor portal; avoid editing [license].key
Expired or version out of rangePolicy or Super version spanRenew or upgrade per your subscription terms — see Get Super Pro

Official release binaries may embed more verifying keys than a local cargo build from git alone. Compare against the release you actually run in production, not only a dev build.

Enabling Authentication (Subscription)

  1. Add a valid [license].key in conf/super.toml (must authorize security — included with every subscription).
  2. Install security.so from your subscription delivery package into $SUPER_ROOT/plugins/ (required for startup).
  3. Set [server].auth_secret in super.toml (required for startup):
# super.toml (subscription)
[server]
auth_secret = "my-super-secure-root-password"

Once the security plugin is active:

  1. All API requests require an Authorization: Bearer <token> header (except /health and the docs whitelist: /api/docs, /api/v1/openapi.json, SPA / + /assets). /metrics requires Bearer when auth is on — configure Prometheus with authorization.credentials.
  2. The Dashboard prompts for an Access Token when auth is required (or the admin/auth_secret string for bootstrap).

Bootstrap with auth_secret

Sign in with config auth_secret (Dashboard or super login), then create Access Tokens. Creating a token does not end the current root session:

curl -X POST http://127.0.0.1:9002/api/v1/auth/tokens \
  -H "Authorization: Bearer my-super-secure-root-password" \
  -H "Content-Type: application/json" \
  -d '{"name":"ci-bot","role":"operator"}'

By default auth_secret stays usable even after tokens exist (with a Dashboard warning). Prefer generated sk-... tokens for day-to-day access.

The Access Tokens page in the Dashboard (Account menu) appears when the security and ui plugins are loaded. You can always manage tokens via the HTTP API below without that UI.

Optional: disable auth_secret

An Admin (including a root session still using auth_secret) can explicitly disable config auth_secret after at least one Admin Access Token exists:

  • Dashboard → Access Tokens → Disable auth_secret (requires ui + security)
  • Or POST /api/v1/auth/secret/disable

State is persisted in $SUPER_ROOT/data/auth_settings.json. While disabled, Bearer/auth_secret login is rejected.

Recovery: revoke all Admin Access Tokens — auth_secret is re-enabled automatically. Startup still requires auth_secret to be set in super.toml.

If data/tokens.json is corrupt (parse error), superd refuses to start instead of wiping tokens — see FAQ — Corrupt tokens.json.

Warning

Without auth_secret and without the security plugin, OSS superd has no /api/v1/auth/* routes (loopback stays open). Set auth_secret for a single admin Bearer, or load the security plugin for multi-user Access Tokens.

Managing Tokens (HTTP API)

Login / logout / status

curl -X POST http://127.0.0.1:9002/api/v1/auth/login \
  -H "Authorization: Bearer <token-or-auth_secret>"

curl -X POST http://127.0.0.1:9002/api/v1/auth/logout \
  -H "Authorization: Bearer <token-or-auth_secret>"

curl -H "Authorization: Bearer <token>" http://127.0.0.1:9002/api/v1/auth/status

List Tokens

Admins see all tokens. Viewer/Operator see only their own token metadata (no secret).

curl -H "Authorization: Bearer <token>" http://127.0.0.1:9002/api/v1/auth/tokens

Renew (rotate) a Token

Same id/name/role; old secret is invalidated immediately. Non-admins may renew only their own token.

curl -X POST -H "Authorization: Bearer <token>" \
  http://127.0.0.1:9002/api/v1/auth/tokens/<id>/renew

Revoke a Token

Admin only.

curl -X DELETE -H "Authorization: Bearer <admin-token>" \
  http://127.0.0.1:9002/api/v1/auth/tokens/<id>

Roles

RolePermissions
ViewerRead-only (list, info, logs, stack/notify with secrets redacted). Own token list + renew.
OperatorCreate programs; manage notification channels; start/stop/restart/signal; read stack redacted; own token list + renew.
AdminFull access including token management, plaintext config, and disabling auth_secret.

Was this page helpful? Thanks for your feedback!

Still have questions? Open an issue or browse the source.