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.
| Credential | OSS | Subscription (security plugin) |
|---|---|---|
auth_secret ([server] in conf/super.toml) | ✅ single shared secret | ✅ bootstrap Admin Bearer |
Multi-user Access Tokens (sk-…) | ❌ | ✅ |
OSS admin secret
Rules
| Situation | Behavior |
|---|---|
Default (host = "127.0.0.1", no auth_secret) | API open (local CLI / scripts) |
Non-empty auth_secret | Auth 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.tomlsuperd 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 setUse 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/programsDashboard: 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:
securityis listed in the signed license claims (re-issue legacy keys that omit it).security.so/security.dylibloads successfully from$SUPER_ROOT/plugins/.auth_secretis set inconf/super.toml(Admin Bearer for bootstrap).- 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:
| Signal | Behavior |
|---|---|
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=1 | Refuse 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.
| Mode | API auth | Startup if security missing |
|---|---|---|
OSS (loopback, no auth_secret) | Open | N/A |
OSS (auth_secret set) | Core Bearer = auth_secret | N/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):
super check— re-validatesconf/super.toml, including the license string and licensed-mode requirements.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).super keyring— lists every verifying key id (kid) compiled into this build; use--jsonfor scripts.
Typical messages and what to do:
| Symptom | Likely cause | What to try |
|---|---|---|
Missing signing key id (kid) | License predates the current format | Ask your vendor to re-issue the license |
Unknown / unrecognized kid | License 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 kid | Wrong, truncated, or tampered key string | Restore the exact key from your vendor portal; avoid editing [license].key |
| Expired or version out of range | Policy or Super version span | Renew 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)
- Add a valid
[license].keyinconf/super.toml(must authorizesecurity— included with every subscription). - Install
security.sofrom your subscription delivery package into$SUPER_ROOT/plugins/(required for startup). - Set
[server].auth_secretinsuper.toml(required for startup):
# super.toml (subscription)
[server]
auth_secret = "my-super-secure-root-password"Once the security plugin is active:
- All API requests require an
Authorization: Bearer <token>header (except/healthand the docs whitelist:/api/docs,/api/v1/openapi.json, SPA/+/assets)./metricsrequires Bearer when auth is on — configure Prometheus withauthorization.credentials. - The Dashboard prompts for an Access Token when auth is required (or the admin/
auth_secretstring 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/statusList 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/tokensRenew (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>/renewRevoke a Token
Admin only.
curl -X DELETE -H "Authorization: Bearer <admin-token>" \
http://127.0.0.1:9002/api/v1/auth/tokens/<id>Roles
| Role | Permissions |
|---|---|
| Viewer | Read-only (list, info, logs, stack/notify with secrets redacted). Own token list + renew. |
| Operator | Create programs; manage notification channels; start/stop/restart/signal; read stack redacted; own token list + renew. |
| Admin | Full 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.