Lightweight unified identity authentication (SSO / OIDC IdP) service
285
Unified identity authentication (SSO / OIDC IdP) service. https://github.com/schiplat/signet/
Language: English · 简体中文
https://sso.example.comhttp://localhost:8443 (configurable via SIGNET_ISSUER)Naming note: this project is an SSO, not Alibaba Cloud Object Storage (OSS).
| Document | Contents |
|---|---|
| docs/design.md | Overall design, roles, security, roadmap |
| docs/security.md | Security design summary (credential storage, auth, sessions, MFA, OIDC, audit, keys) |
| docs/client-integration.md | Client OIDC integration (authorize/token/PKCE/IP allowlist) |
| docs/integrations.md | Integrations (RFC 7591 dynamic registration · Webhooks/Feishu · SCIM v2) |
| docs/api-v1.md | Dashboard HTTP API (unified /api/v1/...) |
| docs/mfa.md | TOTP / recovery codes / global & per-user enforcement |
| docs/dashboard.md | Dashboard pages & permissions |
cp .env.example .env
# Edit SIGNET_DATABASE_URL, etc.
On first run with no admin, open the dashboard in a browser. It redirects to
/setup, where you create the first administrator account (email, optional
display name, and password).
cargo run -p signet
Health check: GET http://localhost:8443/health
cd dashboard
pnpm install
pnpm dev # http://localhost:5173, proxied to :8443
# or build and embed into the binary:
pnpm build
cd .. && cargo build -p signet
In production/staging, Rust serves dashboard/dist via rust-embed.
/users, API /api/v1/admin/users)admin / manager / member (see design doc)/setup page creates the initial adminx-request-id (passed through or auto-generated UUIDv4) for trace linkingcrates/signet/src/access_log.rs: single line, structured fields (request_id / method / path / query / ip / status / latency_ms), with 2xx/3xx at INFO, 4xx at WARN, 5xx at ERRORtracing; see .cursor/rules/logging.mdc: static messages + structured fields, errors in an error field, single-line JSON in production (APP_ENV=production)GET /metrics exposes Prometheus metrics| Path | Description |
|---|---|
GET /health | Health check |
GET /metrics | Prometheus metrics (public) |
GET /.well-known/openid-configuration | OIDC Discovery |
GET /oauth/authorize | Authorization (redirects to /login if not signed in, /consent if not consented) |
POST /oauth/token | Token exchange (code + PKCE / refresh) |
POST /oauth/consent | Consent submission |
GET /oauth/jwks | JWKS |
GET /oauth/userinfo | UserInfo (includes groups) |
GET/POST /oauth/end_session | Single logout |
POST /oauth/revoke | RFC 7009 revocation |
POST /oauth/register | RFC 7591 dynamic client registration |
GET /api/v1/setup/status | First-run setup probe (needs_setup) |
POST /api/v1/setup | Create the first admin on first run |
POST /api/v1/password-reset/* | Password reset (request/confirm) |
GET/POST/DELETE /api/v1/me/passkeys/* | Passkey (WebAuthn) register/sign-in/manage |
/scim/v2/* | SCIM v2 user/group sync (Bearer auth) |
/api/v1/* | Dashboard / session / admin API (unified prefix, see api-v1.md) |
Examples: POST /api/v1/login, GET /api/v1/admin/users, GET /api/v1/admin/stats.
crates/signet/ Axum OIDC IdP + /api/v1
dashboard/ Vue 3 + Tailwind CSS v4
migrations/ Postgres migrations (MFA, audit IP, client IP allowlist, password reset, webhook, SCIM, WebAuthn)
docs/ design · security · client-integration · integrations · api-v1 · mfa · dashboard
Content type
Image
Digest
sha256:0bceb88f4…
Size
38.4 MB
Last updated
21 days ago
docker pull schiplat/signet