From bd4008f5091122f74967b4debdd4c4f046693f46 Mon Sep 17 00:00:00 2001 From: Anso Date: Sat, 28 Mar 2026 03:30:01 -0400 Subject: [PATCH] feat: SSO & LDAP authentication for Team Pro (#209) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * feat: SSO & LDAP authentication for Team Pro Add SSO integration allowing Team Pro users to authenticate via LDAP/Active Directory, Google, GitHub, and Okta identity providers. SSO works alongside password authentication with auto-provisioning and role mapping. - LDAP bind+search authentication with group-based role mapping - OIDC/OAuth2 flows with PKCE and CSRF protection for Google, GitHub, Okta - Auto-provisioning: first SSO login creates a Sencho account automatically - Role mapping via LDAP group membership or OIDC JWT claims - SSO settings UI in Settings → SSO with per-provider config and test connection - SSO login buttons on login page with LDAP toggle - Environment variable seeding for infrastructure-as-code workflows - Secrets encrypted at rest via CryptoService (AES-256-GCM) - Seat limit enforcement during auto-provisioning - Full documentation: feature docs, quickstart guides, env var reference * fix: resolve ESLint errors in SSO feature - Remove unnecessary escape characters in regex character classes - Remove unused `issuer` variable from OIDC callback handler - Fix setState-in-effect lint error in Login.tsx by using useState initializer - Suppress set-state-in-effect for SSOSection fetch pattern (matches existing codebase convention) --- .env.example | 37 ++ CHANGELOG.md | 1 + backend/package-lock.json | 131 +++++ backend/package.json | 2 + backend/src/__tests__/sso.test.ts | 270 ++++++++++ backend/src/index.ts | 271 +++++++++- backend/src/services/DatabaseService.ts | 80 ++- backend/src/services/SSOService.ts | 587 ++++++++++++++++++++++ docs/docs.json | 4 +- docs/features/rbac.mdx | 8 + docs/features/sso.mdx | 193 +++++++ docs/getting-started/configuration.mdx | 14 + docs/getting-started/sso-quickstart.mdx | 153 ++++++ docs/images/sso/sso-settings-ldap.png | Bin 0 -> 101586 bytes docs/images/sso/sso-settings-oidc.png | Bin 0 -> 85593 bytes docs/images/sso/sso-settings.png | Bin 0 -> 88260 bytes frontend/src/components/Login.tsx | 108 +++- frontend/src/components/SSOSection.tsx | 365 ++++++++++++++ frontend/src/components/SettingsModal.tsx | 12 +- frontend/src/context/AuthContext.tsx | 25 + 20 files changed, 2247 insertions(+), 14 deletions(-) create mode 100644 backend/src/__tests__/sso.test.ts create mode 100644 backend/src/services/SSOService.ts create mode 100644 docs/features/sso.mdx create mode 100644 docs/getting-started/sso-quickstart.mdx create mode 100644 docs/images/sso/sso-settings-ldap.png create mode 100644 docs/images/sso/sso-settings-oidc.png create mode 100644 docs/images/sso/sso-settings.png create mode 100644 frontend/src/components/SSOSection.tsx diff --git a/.env.example b/.env.example index 9e9b35cc..8d6303fb 100644 --- a/.env.example +++ b/.env.example @@ -6,3 +6,40 @@ JWT_SECRET=your-secure-jwt-secret-here # Directory containing docker-compose files COMPOSE_DIR=/path/to/your/compose/files + +# ─── SSO / LDAP Configuration (Team Pro) ─────────────────────────── + +# LDAP / Active Directory +SSO_LDAP_ENABLED=false +SSO_LDAP_URL=ldap://ldap.example.com:389 +SSO_LDAP_BIND_DN=cn=readonly,dc=example,dc=com +SSO_LDAP_BIND_PASSWORD= +SSO_LDAP_SEARCH_BASE=ou=users,dc=example,dc=com +SSO_LDAP_SEARCH_FILTER=(uid={{username}}) +SSO_LDAP_ADMIN_GROUP_DN= +SSO_LDAP_DEFAULT_ROLE=viewer +SSO_LDAP_TLS_REJECT_UNAUTHORIZED=true + +# Google OIDC +SSO_OIDC_GOOGLE_ENABLED=false +SSO_OIDC_GOOGLE_CLIENT_ID= +SSO_OIDC_GOOGLE_CLIENT_SECRET= + +# GitHub OAuth +SSO_OIDC_GITHUB_ENABLED=false +SSO_OIDC_GITHUB_CLIENT_ID= +SSO_OIDC_GITHUB_CLIENT_SECRET= + +# Okta OIDC +SSO_OIDC_OKTA_ENABLED=false +SSO_OIDC_OKTA_ISSUER_URL= +SSO_OIDC_OKTA_CLIENT_ID= +SSO_OIDC_OKTA_CLIENT_SECRET= + +# Role mapping (shared across OIDC providers) +SSO_OIDC_ADMIN_CLAIM=groups +SSO_OIDC_ADMIN_CLAIM_VALUE=sencho-admins +SSO_DEFAULT_ROLE=viewer + +# External base URL for OAuth callback URLs (required behind reverse proxy) +SSO_CALLBACK_URL= diff --git a/CHANGELOG.md b/CHANGELOG.md index d4cdc0a2..a4a18532 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -29,6 +29,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ### Added +* **sso:** Team Pro SSO/LDAP integration — authenticate via LDAP/Active Directory, Google, GitHub, or Okta alongside existing password login. Auto-provisions new users on first SSO login with configurable role mapping from identity provider groups/claims. All provider credentials encrypted at rest. Configurable via environment variables or Settings UI. OIDC flows use PKCE and state-based CSRF protection. Added `trust proxy` for correct behavior behind reverse proxies. * **audit-log:** Team Pro audit logging — records all mutating API actions (deploy, stop, delete, settings changes, user CRUD) with user attribution, timestamp, HTTP method, status code, and node context. Searchable timeline UI with filtering by username and method. 90-day retention with automatic cleanup. * **security:** encryption at rest for sensitive database values — node API tokens are now encrypted with AES-256-GCM using a per-instance key stored outside the database. Existing plaintext tokens are automatically migrated on startup. diff --git a/backend/package-lock.json b/backend/package-lock.json index ccf0dd49..343f09e0 100644 --- a/backend/package-lock.json +++ b/backend/package-lock.json @@ -27,7 +27,9 @@ "http-proxy": "^1.18.1", "http-proxy-middleware": "^3.0.5", "jsonwebtoken": "^9.0.3", + "ldapts": "^4.2.6", "node-pty": "^1.1.0", + "openid-client": "^5.7.1", "systeminformation": "^5.31.1", "ws": "^8.19.0", "yaml": "^2.8.2", @@ -794,6 +796,15 @@ "tslib": "^2.4.0" } }, + "node_modules/@types/asn1": { + "version": "0.2.4", + "resolved": "https://registry.npmjs.org/@types/asn1/-/asn1-0.2.4.tgz", + "integrity": "sha512-V91DSJ2l0h0gRhVP4oBfBzRBN9lAbPUkGDMCnwedqPKX2d84aAMc9CulOvxdw1f7DfEYx99afab+Rsm3e52jhA==", + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, "node_modules/@types/bcrypt": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/@types/bcrypt/-/bcrypt-6.0.0.tgz", @@ -1081,6 +1092,12 @@ "@types/superagent": "^8.1.0" } }, + "node_modules/@types/uuid": { + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/@types/uuid/-/uuid-10.0.0.tgz", + "integrity": "sha512-7gqG38EyHgyP1S+7+xomFtL+ZNHcKv6DwNaCZmJmo1vgMugyF3TCnXVg4t1uk89mLNwnLtnY3TpOpCOyp1/xHQ==", + "license": "MIT" + }, "node_modules/@types/ws": { "version": "8.18.1", "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.18.1.tgz", @@ -3120,6 +3137,15 @@ "dev": true, "license": "ISC" }, + "node_modules/jose": { + "version": "4.15.9", + "resolved": "https://registry.npmjs.org/jose/-/jose-4.15.9.tgz", + "integrity": "sha512-1vUQX+IdDMVPj4k8kOxgUqlcK518yluMuGZwqlr44FS1ppZB/5GWh4rZG89erpOBOJjU/OBsnCVFfapsRz6nEA==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/panva" + } + }, "node_modules/js-tokens": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", @@ -3199,6 +3225,54 @@ "json-buffer": "3.0.1" } }, + "node_modules/ldapts": { + "version": "4.2.6", + "resolved": "https://registry.npmjs.org/ldapts/-/ldapts-4.2.6.tgz", + "integrity": "sha512-r1eOj2PtTJi+9aZxLirktoHntuYXlbQD9ZXCjiZmJx0VBQtBcWc+rueqABuh/AxMcFHNPDSJLJAXxoj5VevTwQ==", + "license": "MIT", + "dependencies": { + "@types/asn1": ">=0.2.0", + "@types/node": ">=14", + "@types/uuid": ">=9", + "asn1": "~0.2.6", + "debug": "~4.3.4", + "strict-event-emitter-types": "~2.0.0", + "uuid": "~9.0.0" + }, + "engines": { + "node": ">=14" + } + }, + "node_modules/ldapts/node_modules/debug": { + "version": "4.3.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.7.tgz", + "integrity": "sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==", + "license": "MIT", + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/ldapts/node_modules/uuid": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-9.0.1.tgz", + "integrity": "sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA==", + "funding": [ + "https://github.com/sponsors/broofa", + "https://github.com/sponsors/ctavan" + ], + "license": "MIT", + "bin": { + "uuid": "dist/bin/uuid" + } + }, "node_modules/levn": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", @@ -3556,6 +3630,18 @@ "loose-envify": "cli.js" } }, + "node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "license": "ISC", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/magic-string": { "version": "0.30.21", "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.21.tgz", @@ -3857,6 +3943,15 @@ "node": ">=0.10.0" } }, + "node_modules/object-hash": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/object-hash/-/object-hash-2.2.0.tgz", + "integrity": "sha512-gScRMn0bS5fH+IuwyIFgnh9zBdo4DV+6GhygmWM9HyNJSgS0hScp1f5vjtm7oIIOiT9trXrShAkLFSc2IqKNgw==", + "license": "MIT", + "engines": { + "node": ">= 6" + } + }, "node_modules/object-inspect": { "version": "1.13.4", "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.4.tgz", @@ -3880,6 +3975,15 @@ ], "license": "MIT" }, + "node_modules/oidc-token-hash": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/oidc-token-hash/-/oidc-token-hash-5.2.0.tgz", + "integrity": "sha512-6gj2m8cJZ+iSW8bm0FXdGF0YhIQbKrfP4yWTNzxc31U6MOjfEmB1rHvlYvxI1B7t7BCi1F2vYTT6YhtQRG4hxw==", + "license": "MIT", + "engines": { + "node": "^10.13.0 || >=12.0.0" + } + }, "node_modules/on-finished": { "version": "2.4.1", "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", @@ -3901,6 +4005,21 @@ "wrappy": "1" } }, + "node_modules/openid-client": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/openid-client/-/openid-client-5.7.1.tgz", + "integrity": "sha512-jDBPgSVfTnkIh71Hg9pRvtJc6wTwqjRkN88+gCFtYWrlP4Yx2Dsrow8uPi3qLr/aeymPF3o2+dS+wOpglK04ew==", + "license": "MIT", + "dependencies": { + "jose": "^4.15.9", + "lru-cache": "^6.0.0", + "object-hash": "^2.2.0", + "oidc-token-hash": "^5.0.3" + }, + "funding": { + "url": "https://github.com/sponsors/panva" + } + }, "node_modules/optionator": { "version": "0.9.4", "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.4.tgz", @@ -4612,6 +4731,12 @@ "dev": true, "license": "MIT" }, + "node_modules/strict-event-emitter-types": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strict-event-emitter-types/-/strict-event-emitter-types-2.0.0.tgz", + "integrity": "sha512-Nk/brWYpD85WlOgzw5h173aci0Teyv8YdIAEtV+N88nDB0dLlazZyJMIsN6eo1/AR61l+p6CJTG1JIyFaoNEEA==", + "license": "ISC" + }, "node_modules/string_decoder": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", @@ -5542,6 +5667,12 @@ "node": ">=10" } }, + "node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "license": "ISC" + }, "node_modules/yaml": { "version": "2.8.3", "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.8.3.tgz", diff --git a/backend/package.json b/backend/package.json index 0bb18bd8..70c00635 100644 --- a/backend/package.json +++ b/backend/package.json @@ -51,7 +51,9 @@ "http-proxy": "^1.18.1", "http-proxy-middleware": "^3.0.5", "jsonwebtoken": "^9.0.3", + "ldapts": "^4.2.6", "node-pty": "^1.1.0", + "openid-client": "^5.7.1", "systeminformation": "^5.31.1", "ws": "^8.19.0", "yaml": "^2.8.2", diff --git a/backend/src/__tests__/sso.test.ts b/backend/src/__tests__/sso.test.ts new file mode 100644 index 00000000..b48fb60d --- /dev/null +++ b/backend/src/__tests__/sso.test.ts @@ -0,0 +1,270 @@ +import { describe, it, expect, beforeAll, afterAll, vi } from 'vitest'; +import { setupTestDb, cleanupTestDb, TEST_JWT_SECRET } from './helpers/setupTestDb'; +import supertest from 'supertest'; +import jwt from 'jsonwebtoken'; +import type { Express } from 'express'; + +let tmpDir: string; +let app: Express; +let adminToken: string; + +beforeAll(async () => { + tmpDir = await setupTestDb(); + ({ app } = await import('../index')); + adminToken = jwt.sign({ username: 'testadmin', role: 'admin' }, TEST_JWT_SECRET, { expiresIn: '1h' }); +}); + +afterAll(() => { + cleanupTestDb(tmpDir); +}); + +describe('SSO Providers Endpoint', () => { + it('GET /api/auth/sso/providers returns empty array when none configured', async () => { + const res = await supertest(app).get('/api/auth/sso/providers'); + expect(res.status).toBe(200); + expect(res.body).toEqual([]); + }); +}); + +describe('SSO LDAP Login', () => { + it('POST /api/auth/sso/ldap returns error when LDAP not configured', async () => { + const res = await supertest(app) + .post('/api/auth/sso/ldap') + .send({ username: 'testuser', password: 'testpass' }); + expect(res.status).toBe(401); + expect(res.body.error).toContain('not configured'); + }); + + it('POST /api/auth/sso/ldap returns 400 when missing credentials', async () => { + const res = await supertest(app) + .post('/api/auth/sso/ldap') + .send({}); + expect(res.status).toBe(400); + expect(res.body.error).toContain('required'); + }); +}); + +describe('SSO Config Endpoints (Protected)', () => { + it('GET /api/sso/config returns 401 without auth', async () => { + const res = await supertest(app).get('/api/sso/config'); + expect(res.status).toBe(401); + }); + + it('GET /api/sso/config returns 403 without Team Pro', async () => { + const res = await supertest(app) + .get('/api/sso/config') + .set('Authorization', `Bearer ${adminToken}`); + // Without a Team Pro license, this should be 403 + expect(res.status).toBe(403); + expect(res.body.code).toBe('PRO_REQUIRED'); + }); + + it('PUT /api/sso/config/:provider returns 401 without auth', async () => { + const res = await supertest(app) + .put('/api/sso/config/ldap') + .send({ enabled: true }); + expect(res.status).toBe(401); + }); + + it('DELETE /api/sso/config/:provider returns 401 without auth', async () => { + const res = await supertest(app).delete('/api/sso/config/ldap'); + expect(res.status).toBe(401); + }); +}); + +describe('SSO OIDC Authorize', () => { + it('GET /api/auth/sso/oidc/:provider/authorize returns 400 for invalid provider', async () => { + const res = await supertest(app).get('/api/auth/sso/oidc/invalid_provider/authorize'); + expect(res.status).toBe(400); + expect(res.body.error).toContain('Invalid SSO provider'); + }); + + it('GET /api/auth/sso/oidc/oidc_google/authorize redirects to error when not configured', async () => { + const res = await supertest(app).get('/api/auth/sso/oidc/oidc_google/authorize'); + // Should redirect to /?sso_error=... + expect(res.status).toBe(302); + expect(res.headers.location).toContain('sso_error'); + }); +}); + +describe('SSO OIDC Callback', () => { + it('GET /api/auth/sso/oidc/:provider/callback redirects with error when no state cookie', async () => { + const res = await supertest(app) + .get('/api/auth/sso/oidc/oidc_google/callback?code=test&state=test'); + expect(res.status).toBe(302); + expect(res.headers.location).toContain('sso_error'); + expect(res.headers.location).toContain('expired'); + }); + + it('GET /api/auth/sso/oidc/:provider/callback redirects with provider error if error param present', async () => { + const res = await supertest(app) + .get('/api/auth/sso/oidc/oidc_google/callback?error=access_denied&error_description=User+denied'); + expect(res.status).toBe(302); + expect(res.headers.location).toContain('User'); + }); +}); + +describe('SSO User Provisioning', () => { + // Mock LicenseService to return team variant (unlimited seats) for provisioning tests + beforeAll(async () => { + const { LicenseService } = await import('../services/LicenseService'); + vi.spyOn(LicenseService.getInstance(), 'getSeatLimits').mockReturnValue({ maxAdmins: null, maxViewers: null }); + }); + + afterAll(() => { + vi.restoreAllMocks(); + }); + + it('provisionUser creates a new SSO user with correct fields', async () => { + const { SSOService } = await import('../services/SSOService'); + const { DatabaseService } = await import('../services/DatabaseService'); + + const sso = SSOService.getInstance(); + const user = sso.provisionUser({ + authProvider: 'oidc_google', + providerId: 'google-sub-123', + preferredUsername: 'John Doe', + email: 'john@example.com', + role: 'viewer', + }); + + expect(user.username).toBe('John_Doe'); + expect(user.auth_provider).toBe('oidc_google'); + expect(user.provider_id).toBe('google-sub-123'); + expect(user.email).toBe('john@example.com'); + expect(user.role).toBe('viewer'); + // Password hash should be unusable (SSO prefix) + expect(user.password_hash).toMatch(/^\$sso\$/); + + // Verify they appear in DB + const dbUser = DatabaseService.getInstance().getUserByProviderIdentity('oidc_google', 'google-sub-123'); + expect(dbUser).toBeDefined(); + expect(dbUser!.username).toBe('John_Doe'); + }); + + it('provisionUser returns existing user on second call', async () => { + const { SSOService } = await import('../services/SSOService'); + const sso = SSOService.getInstance(); + + const user1 = sso.provisionUser({ + authProvider: 'oidc_github', + providerId: 'github-id-456', + preferredUsername: 'janedoe', + email: 'jane@example.com', + role: 'admin', + }); + + const user2 = sso.provisionUser({ + authProvider: 'oidc_github', + providerId: 'github-id-456', + preferredUsername: 'janedoe', + email: 'jane-new@example.com', + role: 'admin', + }); + + expect(user1.id).toBe(user2.id); + // Email should be updated + expect(user2.email).toBe('jane-new@example.com'); + }); + + it('provisionUser handles username collision', async () => { + const { SSOService } = await import('../services/SSOService'); + const { DatabaseService } = await import('../services/DatabaseService'); + const sso = SSOService.getInstance(); + + // Create a local user first + DatabaseService.getInstance().addUser({ + username: 'collision', + password_hash: '$2b$10$fake', + role: 'viewer', + }); + + // Now provision an SSO user with the same preferred username + const user = sso.provisionUser({ + authProvider: 'ldap', + providerId: 'cn=collision,ou=users,dc=example', + preferredUsername: 'collision', + role: 'viewer', + }); + + // Should have a suffixed username + expect(user.username).toBe('collision_ldap'); + expect(user.auth_provider).toBe('ldap'); + }); + + it('SSO users cannot log in via local password endpoint', async () => { + // The SSO user from the first test has a $sso$ password hash + // Trying to log in with any password should fail + const res = await supertest(app) + .post('/api/auth/login') + .send({ username: 'John_Doe', password: 'anything' }); + expect(res.status).toBe(401); + }); +}); + +describe('SSO Config CRUD (DB layer)', () => { + it('upsertSSOConfig and getSSOConfig work correctly', async () => { + const { DatabaseService } = await import('../services/DatabaseService'); + const db = DatabaseService.getInstance(); + + db.upsertSSOConfig('ldap', true, JSON.stringify({ ldapUrl: 'ldap://test:389' })); + + const config = db.getSSOConfig('ldap'); + expect(config).toBeDefined(); + expect(config!.enabled).toBe(1); + expect(JSON.parse(config!.config_json)).toEqual({ ldapUrl: 'ldap://test:389' }); + + // Update + db.upsertSSOConfig('ldap', false, JSON.stringify({ ldapUrl: 'ldap://test2:389' })); + const updated = db.getSSOConfig('ldap'); + expect(updated!.enabled).toBe(0); + expect(JSON.parse(updated!.config_json)).toEqual({ ldapUrl: 'ldap://test2:389' }); + + // Delete + db.deleteSSOConfig('ldap'); + expect(db.getSSOConfig('ldap')).toBeUndefined(); + }); + + it('getEnabledSSOConfigs filters correctly', async () => { + const { DatabaseService } = await import('../services/DatabaseService'); + const db = DatabaseService.getInstance(); + + db.upsertSSOConfig('oidc_google', true, '{}'); + db.upsertSSOConfig('oidc_github', false, '{}'); + + const enabled = db.getEnabledSSOConfigs(); + expect(enabled.length).toBe(1); + expect(enabled[0].provider).toBe('oidc_google'); + + // Cleanup + db.deleteSSOConfig('oidc_google'); + db.deleteSSOConfig('oidc_github'); + }); +}); + +describe('Database migration — SSO columns', () => { + it('users table has auth_provider, provider_id, email columns', async () => { + const { DatabaseService } = await import('../services/DatabaseService'); + const db = DatabaseService.getInstance(); + + const user = db.addUser({ + username: 'sso_migration_test', + password_hash: '$sso$test', + role: 'viewer', + auth_provider: 'ldap', + provider_id: 'cn=test,dc=example', + email: 'test@example.com', + }); + + const fetched = db.getUser(user); + expect(fetched).toBeDefined(); + expect(fetched!.auth_provider).toBe('ldap'); + expect(fetched!.provider_id).toBe('cn=test,dc=example'); + expect(fetched!.email).toBe('test@example.com'); + + // getUserByProviderIdentity + const byProvider = db.getUserByProviderIdentity('ldap', 'cn=test,dc=example'); + expect(byProvider).toBeDefined(); + expect(byProvider!.username).toBe('sso_migration_test'); + }); +}); diff --git a/backend/src/index.ts b/backend/src/index.ts index 3267b362..45121ad5 100644 --- a/backend/src/index.ts +++ b/backend/src/index.ts @@ -18,7 +18,7 @@ import httpProxy from 'http-proxy'; import { createProxyMiddleware } from 'http-proxy-middleware'; import path from 'path'; import { HostTerminalService } from './services/HostTerminalService'; -import { DatabaseService, Node } from './services/DatabaseService'; +import { DatabaseService, Node, AuthProvider } from './services/DatabaseService'; import { NotificationService } from './services/NotificationService'; import { MonitorService } from './services/MonitorService'; import { ImageUpdateService } from './services/ImageUpdateService'; @@ -27,6 +27,7 @@ import { ErrorParser } from './utils/ErrorParser'; import { NodeRegistry } from './services/NodeRegistry'; import { LicenseService } from './services/LicenseService'; import { WebhookService } from './services/WebhookService'; +import { SSOService } from './services/SSOService'; import { isValidStackName, isValidRemoteUrl } from './utils/validation'; import YAML from 'yaml'; import fs, { promises as fsPromises } from 'fs'; @@ -66,6 +67,10 @@ const getCookieOptions = (req: Request) => ({ // Middleware +// Trust the first reverse proxy (nginx, Traefik, etc.) for correct req.protocol, +// req.ip, and secure cookie detection behind a proxy. +app.set('trust proxy', 1); + // Security headers (X-Frame-Options, X-Content-Type-Options, etc.) // crossOriginEmbedderPolicy: disabled - Monaco editor workers lack COEP headers. // hsts: disabled - HSTS must only be set when the app is served over HTTPS. @@ -431,6 +436,178 @@ app.post('/api/auth/generate-node-token', authMiddleware, async (req: Request, r } }); +// --- SSO Auth Routes (public, under /api/auth/sso/*) --- + +// Seed SSO config from environment variables on startup +SSOService.getInstance().seedFromEnv(); + +const ssoRateLimiter = rateLimit({ + windowMs: 15 * 60 * 1000, + max: process.env.NODE_ENV === 'production' ? 10 : 100, + standardHeaders: true, + legacyHeaders: false, + message: { error: 'Too many SSO attempts. Please try again later.' }, +}); + +// List enabled SSO providers (for login page) +app.get('/api/auth/sso/providers', (_req: Request, res: Response): void => { + try { + const providers = SSOService.getInstance().getEnabledProviders(); + res.json(providers); + } catch { + res.json([]); + } +}); + +// LDAP login +app.post('/api/auth/sso/ldap', authRateLimiter, async (req: Request, res: Response): Promise => { + try { + const { username, password } = req.body; + if (!username || !password) { + res.status(400).json({ error: 'Username and password are required' }); + return; + } + + const result = await SSOService.getInstance().authenticateLDAP(username, password); + if (!result.success || !result.user) { + res.status(401).json({ error: result.error || 'Authentication failed' }); + return; + } + + // Provision or find existing user + const user = SSOService.getInstance().provisionUser({ + authProvider: 'ldap', + providerId: result.user.providerId, + preferredUsername: result.user.preferredUsername, + email: result.user.email, + role: result.user.role, + }); + + // Issue JWT (same as local login) + const settings = DatabaseService.getInstance().getGlobalSettings(); + const token = jwt.sign({ username: user.username, role: user.role }, settings.auth_jwt_secret, { expiresIn: '24h' }); + res.cookie(COOKIE_NAME, token, getCookieOptions(req)); + res.json({ success: true, message: 'Login successful' }); + } catch (error: unknown) { + const msg = error instanceof Error ? error.message : 'LDAP login failed'; + console.error('[SSO] LDAP login error:', msg); + res.status(500).json({ error: msg }); + } +}); + +// OIDC: Initiate authorization flow +app.get('/api/auth/sso/oidc/:provider/authorize', ssoRateLimiter, async (req: Request, res: Response): Promise => { + try { + const provider = String(req.params.provider); + const validProviders = ['oidc_google', 'oidc_github', 'oidc_okta']; + if (!validProviders.includes(provider)) { + res.status(400).json({ error: 'Invalid SSO provider' }); + return; + } + + const baseUrl = process.env.SSO_CALLBACK_URL || `${req.protocol}://${req.get('host')}`; + const callbackUrl = `${baseUrl}/api/auth/sso/oidc/${provider}/callback`; + + const { url, state, codeVerifier } = await SSOService.getInstance().getOIDCAuthorizationUrl(provider, callbackUrl); + + // Store state + codeVerifier in an encrypted short-lived cookie + const cryptoSvc = (await import('./services/CryptoService')).CryptoService.getInstance(); + const statePayload = JSON.stringify({ state, codeVerifier, provider }); + res.cookie('sencho_sso_state', cryptoSvc.encrypt(statePayload), { + httpOnly: true, + secure: isSecureRequest(req), + sameSite: 'lax', // Must be lax for cross-site IdP redirect + maxAge: 5 * 60 * 1000, // 5 minutes + }); + + res.redirect(url); + } catch (error: unknown) { + const msg = error instanceof Error ? error.message : 'SSO initialization failed'; + console.error('[SSO] OIDC authorize error:', msg); + res.redirect(`/?sso_error=${encodeURIComponent(msg)}`); + } +}); + +// OIDC: Callback from identity provider +app.get('/api/auth/sso/oidc/:provider/callback', async (req: Request, res: Response): Promise => { + try { + const provider = String(req.params.provider); + const code = String(req.query.code || ''); + const state = String(req.query.state || ''); + const oidcError = req.query.error ? String(req.query.error) : ''; + const error_description = req.query.error_description ? String(req.query.error_description) : ''; + + if (oidcError) { + res.redirect(`/?sso_error=${encodeURIComponent(error_description || oidcError)}`); + return; + } + + if (!code || !state) { + res.redirect('/?sso_error=Missing+authorization+code'); + return; + } + + // Read and validate state cookie + const stateCookie = req.cookies?.sencho_sso_state; + if (!stateCookie) { + res.redirect('/?sso_error=SSO+session+expired.+Please+try+again.'); + return; + } + + const cryptoSvc = (await import('./services/CryptoService')).CryptoService.getInstance(); + let statePayload: { state: string; codeVerifier: string; provider: string }; + try { + statePayload = JSON.parse(cryptoSvc.decrypt(stateCookie)); + } catch { + res.redirect('/?sso_error=Invalid+SSO+session'); + return; + } + + if (statePayload.provider !== provider) { + res.redirect('/?sso_error=Provider+mismatch'); + return; + } + + const baseUrl = process.env.SSO_CALLBACK_URL || `${req.protocol}://${req.get('host')}`; + const callbackUrl = `${baseUrl}/api/auth/sso/oidc/${provider}/callback`; + + const result = await SSOService.getInstance().handleOIDCCallback( + provider, callbackUrl, + { code, state }, + statePayload.state, + statePayload.codeVerifier + ); + + // Clear state cookie + res.clearCookie('sencho_sso_state', { httpOnly: true, secure: isSecureRequest(req), sameSite: 'lax' }); + + if (!result.success || !result.user) { + res.redirect(`/?sso_error=${encodeURIComponent(result.error || 'Authentication failed')}`); + return; + } + + // Provision or find existing user + const user = SSOService.getInstance().provisionUser({ + authProvider: provider as AuthProvider, + providerId: result.user.providerId, + preferredUsername: result.user.preferredUsername, + email: result.user.email, + role: result.user.role, + }); + + // Issue JWT + cookie (same as local login) + const settings = DatabaseService.getInstance().getGlobalSettings(); + const token = jwt.sign({ username: user.username, role: user.role }, settings.auth_jwt_secret, { expiresIn: '24h' }); + res.cookie(COOKIE_NAME, token, getCookieOptions(req)); + + res.redirect('/'); + } catch (error: unknown) { + const msg = error instanceof Error ? error.message : 'SSO callback failed'; + console.error('[SSO] OIDC callback error:', msg); + res.redirect(`/?sso_error=${encodeURIComponent(msg)}`); + } +}); + // Apply authentication middleware to all /api/* routes except /api/auth/* app.use('/api', (req: Request, res: Response, next: NextFunction): void => { if (req.path.startsWith('/auth/') || /^\/webhooks\/\d+\/trigger$/.test(req.path)) { @@ -468,6 +645,8 @@ const AUDIT_ROUTE_SUMMARIES: Record = { 'POST /fleet/snapshot': 'Created fleet backup', 'DELETE /fleet/snapshot': 'Deleted fleet backup', 'POST /fleet/snapshot/restore': 'Restored fleet backup', + 'PUT /sso/config': 'Updated SSO configuration', + 'DELETE /sso/config': 'Deleted SSO configuration', }; function getAuditSummary(method: string, apiPath: string): string { @@ -2805,6 +2984,96 @@ app.post('/api/system/console-token', authMiddleware, (req: Request, res: Respon } }); +// --- SSO Config Routes (admin + Team Pro, local-only) --- + +app.get('/api/sso/config', (req: Request, res: Response): void => { + if (!requireAdmin(req, res)) return; + if (!requireTeamPro(req, res)) return; + try { + const configs = DatabaseService.getInstance().getSSOConfigs(); + const result = configs.map(c => { + const parsed = JSON.parse(c.config_json); + // Strip encrypted secrets from response + delete parsed.ldapBindPassword; + delete parsed.oidcClientSecret; + return { ...parsed, provider: c.provider, enabled: c.enabled === 1 }; + }); + res.json(result); + } catch (error) { + console.error('[SSO] Failed to fetch SSO configs:', error); + res.status(500).json({ error: 'Failed to fetch SSO configuration' }); + } +}); + +app.get('/api/sso/config/:provider', (req: Request, res: Response): void => { + if (!requireAdmin(req, res)) return; + if (!requireTeamPro(req, res)) return; + try { + const config = SSOService.getInstance().getProviderConfig(String(req.params.provider)); + if (!config) { + res.status(404).json({ error: 'Provider not configured' }); + return; + } + // Strip encrypted secrets + const result = { ...config }; + delete result.ldapBindPassword; + delete result.oidcClientSecret; + res.json(result); + } catch (error) { + console.error('[SSO] Failed to fetch SSO config:', error); + res.status(500).json({ error: 'Failed to fetch SSO configuration' }); + } +}); + +app.put('/api/sso/config/:provider', (req: Request, res: Response): void => { + if (!requireAdmin(req, res)) return; + if (!requireTeamPro(req, res)) return; + try { + const provider = String(req.params.provider); + const validProviders = ['ldap', 'oidc_google', 'oidc_github', 'oidc_okta']; + if (!validProviders.includes(provider)) { + res.status(400).json({ error: 'Invalid SSO provider' }); + return; + } + const config = { ...req.body, provider } as import('./services/SSOService').SSOProviderConfig; + SSOService.getInstance().saveProviderConfig(config); + res.json({ success: true, message: 'SSO configuration saved' }); + } catch (error) { + console.error('[SSO] Failed to save SSO config:', error); + res.status(500).json({ error: 'Failed to save SSO configuration' }); + } +}); + +app.delete('/api/sso/config/:provider', (req: Request, res: Response): void => { + if (!requireAdmin(req, res)) return; + if (!requireTeamPro(req, res)) return; + try { + SSOService.getInstance().deleteProviderConfig(String(req.params.provider)); + res.json({ success: true, message: 'SSO configuration deleted' }); + } catch (error) { + console.error('[SSO] Failed to delete SSO config:', error); + res.status(500).json({ error: 'Failed to delete SSO configuration' }); + } +}); + +app.post('/api/sso/config/:provider/test', async (req: Request, res: Response): Promise => { + if (!requireAdmin(req, res)) return; + if (!requireTeamPro(req, res)) return; + try { + const provider = String(req.params.provider); + if (provider === 'ldap') { + const result = await SSOService.getInstance().testLdapConnection(); + res.json(result); + } else { + const result = await SSOService.getInstance().testOidcDiscovery(provider); + res.json(result); + } + } catch (error) { + console.error('[SSO] Connection test failed:', error); + res.status(500).json({ success: false, error: 'Connection test failed' }); + } +}); + // --- Audit Log Routes (Team Pro, local-only) --- app.get('/api/audit-log', async (req: Request, res: Response): Promise => { diff --git a/backend/src/services/DatabaseService.ts b/backend/src/services/DatabaseService.ts index 017e6887..1e0a0b23 100644 --- a/backend/src/services/DatabaseService.ts +++ b/backend/src/services/DatabaseService.ts @@ -60,11 +60,25 @@ export interface WebhookExecution { executed_at: number; } +export type AuthProvider = 'local' | 'ldap' | 'oidc_google' | 'oidc_github' | 'oidc_okta'; + export interface User { id: number; username: string; password_hash: string; role: 'admin' | 'viewer'; + auth_provider: AuthProvider; + provider_id: string | null; + email: string | null; + created_at: number; + updated_at: number; +} + +export interface SSOConfig { + id: number; + provider: string; + enabled: number; + config_json: string; created_at: number; updated_at: number; } @@ -127,6 +141,7 @@ export class DatabaseService { this.migrateJsonConfig(dataDir); this.migrateAdminToUsersTable(); this.migrateEncryptNodeTokens(); + this.migrateSSOColumns(); } public static getInstance(): DatabaseService { @@ -366,6 +381,27 @@ export class DatabaseService { } } + private migrateSSOColumns(): void { + const maybeAddCol = (table: string, col: string, def: string) => { + try { this.db.prepare(`ALTER TABLE ${table} ADD COLUMN ${col} ${def}`).run(); } catch { /* already exists */ } + }; + maybeAddCol('users', 'auth_provider', "TEXT NOT NULL DEFAULT 'local'"); + maybeAddCol('users', 'provider_id', 'TEXT DEFAULT NULL'); + maybeAddCol('users', 'email', 'TEXT DEFAULT NULL'); + + this.db.exec(` + CREATE TABLE IF NOT EXISTS sso_config ( + id INTEGER PRIMARY KEY AUTOINCREMENT, + provider TEXT NOT NULL UNIQUE, + enabled INTEGER DEFAULT 0, + config_json TEXT NOT NULL DEFAULT '{}', + created_at INTEGER NOT NULL, + updated_at INTEGER NOT NULL + ); + CREATE UNIQUE INDEX IF NOT EXISTS idx_users_provider ON users(auth_provider, provider_id) WHERE provider_id IS NOT NULL; + `); + } + // --- Agents --- public getAgents(): Agent[] { @@ -720,7 +756,7 @@ export class DatabaseService { // --- Users --- public getUsers(): Omit[] { - return this.db.prepare('SELECT id, username, role, created_at, updated_at FROM users ORDER BY created_at ASC').all() as Omit[]; + return this.db.prepare('SELECT id, username, role, auth_provider, provider_id, email, created_at, updated_at FROM users ORDER BY created_at ASC').all() as Omit[]; } public getUser(id: number): User | undefined { @@ -731,21 +767,26 @@ export class DatabaseService { return this.db.prepare('SELECT * FROM users WHERE username = ?').get(username) as User | undefined; } - public addUser(user: { username: string; password_hash: string; role: 'admin' | 'viewer' }): number { + public getUserByProviderIdentity(authProvider: string, providerId: string): User | undefined { + return this.db.prepare('SELECT * FROM users WHERE auth_provider = ? AND provider_id = ?').get(authProvider, providerId) as User | undefined; + } + + public addUser(user: { username: string; password_hash: string; role: 'admin' | 'viewer'; auth_provider?: AuthProvider; provider_id?: string | null; email?: string | null }): number { const now = Date.now(); const result = this.db.prepare( - 'INSERT INTO users (username, password_hash, role, created_at, updated_at) VALUES (?, ?, ?, ?, ?)' - ).run(user.username, user.password_hash, user.role, now, now); + 'INSERT INTO users (username, password_hash, role, auth_provider, provider_id, email, created_at, updated_at) VALUES (?, ?, ?, ?, ?, ?, ?, ?)' + ).run(user.username, user.password_hash, user.role, user.auth_provider ?? 'local', user.provider_id ?? null, user.email ?? null, now, now); return result.lastInsertRowid as number; } - public updateUser(id: number, updates: Partial<{ username: string; password_hash: string; role: string }>): void { + public updateUser(id: number, updates: Partial<{ username: string; password_hash: string; role: string; email: string }>): void { const fields: string[] = []; const values: (string | number)[] = []; if (updates.username !== undefined) { fields.push('username = ?'); values.push(updates.username); } if (updates.password_hash !== undefined) { fields.push('password_hash = ?'); values.push(updates.password_hash); } if (updates.role !== undefined) { fields.push('role = ?'); values.push(updates.role); } + if (updates.email !== undefined) { fields.push('email = ?'); values.push(updates.email); } if (fields.length === 0) return; @@ -771,6 +812,35 @@ export class DatabaseService { return (this.db.prepare("SELECT COUNT(*) as count FROM users WHERE role = 'viewer'").get() as { count: number })?.count || 0; } + // --- SSO Config --- + + public getSSOConfigs(): SSOConfig[] { + return this.db.prepare('SELECT * FROM sso_config ORDER BY provider ASC').all() as SSOConfig[]; + } + + public getSSOConfig(provider: string): SSOConfig | undefined { + return this.db.prepare('SELECT * FROM sso_config WHERE provider = ?').get(provider) as SSOConfig | undefined; + } + + public getEnabledSSOConfigs(): SSOConfig[] { + return this.db.prepare('SELECT * FROM sso_config WHERE enabled = 1 ORDER BY provider ASC').all() as SSOConfig[]; + } + + public upsertSSOConfig(provider: string, enabled: boolean, configJson: string): void { + const now = Date.now(); + const existing = this.getSSOConfig(provider); + if (existing) { + this.db.prepare('UPDATE sso_config SET enabled = ?, config_json = ?, updated_at = ? WHERE provider = ?') + .run(enabled ? 1 : 0, configJson, now, provider); + } else { + this.db.prepare('INSERT INTO sso_config (provider, enabled, config_json, created_at, updated_at) VALUES (?, ?, ?, ?, ?)') + .run(provider, enabled ? 1 : 0, configJson, now, now); + } + } + + public deleteSSOConfig(provider: string): void { + this.db.prepare('DELETE FROM sso_config WHERE provider = ?').run(provider); + } // --- Fleet Snapshots --- diff --git a/backend/src/services/SSOService.ts b/backend/src/services/SSOService.ts new file mode 100644 index 00000000..ff6370e6 --- /dev/null +++ b/backend/src/services/SSOService.ts @@ -0,0 +1,587 @@ +import crypto from 'crypto'; +import { Client as LdapClient } from 'ldapts'; +import { Issuer, Client as OIDCClient, generators } from 'openid-client'; +import { DatabaseService, User, AuthProvider } from './DatabaseService'; +import { CryptoService } from './CryptoService'; +import { LicenseService } from './LicenseService'; + +export interface SSOProviderConfig { + provider: string; + enabled: boolean; + displayName: string; + // LDAP + ldapUrl?: string; + ldapBindDn?: string; + ldapBindPassword?: string; + ldapSearchBase?: string; + ldapSearchFilter?: string; + ldapAdminGroupDn?: string; + ldapDefaultRole?: 'admin' | 'viewer'; + ldapTlsRejectUnauthorized?: boolean; + // OIDC + oidcIssuerUrl?: string; + oidcClientId?: string; + oidcClientSecret?: string; + oidcScopes?: string; + oidcAdminClaim?: string; + oidcAdminClaimValue?: string; + oidcDefaultRole?: 'admin' | 'viewer'; +} + +export interface SSOAuthResult { + success: boolean; + error?: string; + user?: { + providerId: string; + preferredUsername: string; + email?: string; + role: 'admin' | 'viewer'; + }; +} + +const PROVIDER_DISPLAY_NAMES: Record = { + ldap: 'LDAP', + oidc_google: 'Google', + oidc_github: 'GitHub', + oidc_okta: 'Okta', +}; + +const WELL_KNOWN_ISSUERS: Record = { + oidc_google: 'https://accounts.google.com', + oidc_github: 'https://github.com', +}; + +const LDAP_USERNAME_REGEX = /^[a-zA-Z0-9_@.-]+$/; + +export class SSOService { + private static instance: SSOService; + + public static getInstance(): SSOService { + if (!SSOService.instance) { + SSOService.instance = new SSOService(); + } + return SSOService.instance; + } + + public seedFromEnv(): void { + this.seedLdapFromEnv(); + this.seedOidcFromEnv('oidc_google', 'SSO_OIDC_GOOGLE'); + this.seedOidcFromEnv('oidc_github', 'SSO_OIDC_GITHUB'); + this.seedOidcFromEnv('oidc_okta', 'SSO_OIDC_OKTA'); + } + + private seedLdapFromEnv(): void { + if (!process.env.SSO_LDAP_ENABLED || process.env.SSO_LDAP_ENABLED !== 'true') return; + const db = DatabaseService.getInstance(); + if (db.getSSOConfig('ldap')) return; // DB already has config, don't overwrite + + const cryptoSvc = CryptoService.getInstance(); + const config: SSOProviderConfig = { + provider: 'ldap', + enabled: true, + displayName: process.env.SSO_LDAP_DISPLAY_NAME || 'LDAP', + ldapUrl: process.env.SSO_LDAP_URL || '', + ldapBindDn: process.env.SSO_LDAP_BIND_DN || '', + ldapBindPassword: process.env.SSO_LDAP_BIND_PASSWORD || '', + ldapSearchBase: process.env.SSO_LDAP_SEARCH_BASE || '', + ldapSearchFilter: process.env.SSO_LDAP_SEARCH_FILTER || '(uid={{username}})', + ldapAdminGroupDn: process.env.SSO_LDAP_ADMIN_GROUP_DN || '', + ldapDefaultRole: (process.env.SSO_LDAP_DEFAULT_ROLE as 'admin' | 'viewer') || 'viewer', + ldapTlsRejectUnauthorized: process.env.SSO_LDAP_TLS_REJECT_UNAUTHORIZED !== 'false', + }; + + const configForStorage = { ...config }; + if (configForStorage.ldapBindPassword) { + configForStorage.ldapBindPassword = cryptoSvc.encrypt(configForStorage.ldapBindPassword); + } + db.upsertSSOConfig('ldap', true, JSON.stringify(configForStorage)); + } + + private seedOidcFromEnv(provider: string, envPrefix: string): void { + if (!process.env[`${envPrefix}_ENABLED`] || process.env[`${envPrefix}_ENABLED`] !== 'true') return; + const db = DatabaseService.getInstance(); + if (db.getSSOConfig(provider)) return; + + const cryptoSvc = CryptoService.getInstance(); + const config: SSOProviderConfig = { + provider, + enabled: true, + displayName: PROVIDER_DISPLAY_NAMES[provider] || provider, + oidcIssuerUrl: process.env[`${envPrefix}_ISSUER_URL`] || WELL_KNOWN_ISSUERS[provider] || '', + oidcClientId: process.env[`${envPrefix}_CLIENT_ID`] || '', + oidcClientSecret: process.env[`${envPrefix}_CLIENT_SECRET`] || '', + oidcScopes: process.env[`${envPrefix}_SCOPES`] || 'openid email profile', + oidcAdminClaim: process.env.SSO_OIDC_ADMIN_CLAIM || 'groups', + oidcAdminClaimValue: process.env.SSO_OIDC_ADMIN_CLAIM_VALUE || 'sencho-admins', + oidcDefaultRole: (process.env.SSO_DEFAULT_ROLE as 'admin' | 'viewer') || 'viewer', + }; + + const configForStorage = { ...config }; + if (configForStorage.oidcClientSecret) { + configForStorage.oidcClientSecret = cryptoSvc.encrypt(configForStorage.oidcClientSecret); + } + db.upsertSSOConfig(provider, true, JSON.stringify(configForStorage)); + } + + // --- Config Management --- + + public getEnabledProviders(): Array<{ provider: string; displayName: string; type: 'ldap' | 'oidc' }> { + const configs = DatabaseService.getInstance().getEnabledSSOConfigs(); + return configs.map(c => { + const parsed = JSON.parse(c.config_json) as SSOProviderConfig; + return { + provider: c.provider, + displayName: parsed.displayName || PROVIDER_DISPLAY_NAMES[c.provider] || c.provider, + type: c.provider === 'ldap' ? 'ldap' as const : 'oidc' as const, + }; + }); + } + + public getProviderConfig(provider: string): SSOProviderConfig | null { + const row = DatabaseService.getInstance().getSSOConfig(provider); + if (!row) return null; + const config = JSON.parse(row.config_json) as SSOProviderConfig; + config.enabled = row.enabled === 1; + config.provider = row.provider; + return config; + } + + public getProviderConfigDecrypted(provider: string): SSOProviderConfig | null { + const config = this.getProviderConfig(provider); + if (!config) return null; + const cryptoSvc = CryptoService.getInstance(); + if (config.ldapBindPassword && cryptoSvc.isEncrypted(config.ldapBindPassword)) { + config.ldapBindPassword = cryptoSvc.decrypt(config.ldapBindPassword); + } + if (config.oidcClientSecret && cryptoSvc.isEncrypted(config.oidcClientSecret)) { + config.oidcClientSecret = cryptoSvc.decrypt(config.oidcClientSecret); + } + return config; + } + + public saveProviderConfig(config: SSOProviderConfig): void { + const cryptoSvc = CryptoService.getInstance(); + const configForStorage = { ...config }; + if (configForStorage.ldapBindPassword && !cryptoSvc.isEncrypted(configForStorage.ldapBindPassword)) { + configForStorage.ldapBindPassword = cryptoSvc.encrypt(configForStorage.ldapBindPassword); + } + if (configForStorage.oidcClientSecret && !cryptoSvc.isEncrypted(configForStorage.oidcClientSecret)) { + configForStorage.oidcClientSecret = cryptoSvc.encrypt(configForStorage.oidcClientSecret); + } + DatabaseService.getInstance().upsertSSOConfig( + config.provider, + config.enabled, + JSON.stringify(configForStorage) + ); + } + + public deleteProviderConfig(provider: string): void { + DatabaseService.getInstance().deleteSSOConfig(provider); + } + + // --- LDAP Authentication --- + + public async authenticateLDAP(username: string, password: string): Promise { + if (!LDAP_USERNAME_REGEX.test(username)) { + return { success: false, error: 'Invalid username format' }; + } + if (!password) { + return { success: false, error: 'Password is required' }; + } + + const config = this.getProviderConfigDecrypted('ldap'); + if (!config || !config.enabled) { + return { success: false, error: 'LDAP authentication is not configured' }; + } + if (!config.ldapUrl || !config.ldapSearchBase) { + return { success: false, error: 'LDAP configuration is incomplete' }; + } + + const client = new LdapClient({ + url: config.ldapUrl, + tlsOptions: { + rejectUnauthorized: config.ldapTlsRejectUnauthorized !== false, + }, + }); + + try { + // Step 1: Bind with service account to search for the user + if (config.ldapBindDn && config.ldapBindPassword) { + await client.bind(config.ldapBindDn, config.ldapBindPassword); + } + + // Step 2: Search for the user + const filter = (config.ldapSearchFilter || '(uid={{username}})').replace('{{username}}', this.escapeLdapFilter(username)); + const { searchEntries } = await client.search(config.ldapSearchBase, { + scope: 'sub', + filter, + attributes: ['dn', 'uid', 'sAMAccountName', 'mail', 'email', 'cn', 'memberOf'], + }); + + if (searchEntries.length === 0) { + return { success: false, error: 'Invalid credentials' }; + } + + const userEntry = searchEntries[0]; + const userDn = userEntry.dn; + + // Step 3: Bind as the user to verify their password + await client.unbind(); + const userClient = new LdapClient({ + url: config.ldapUrl, + tlsOptions: { + rejectUnauthorized: config.ldapTlsRejectUnauthorized !== false, + }, + }); + + try { + await userClient.bind(userDn, password); + } catch { + return { success: false, error: 'Invalid credentials' }; + } finally { + try { await userClient.unbind(); } catch { /* ignore */ } + } + + // Step 4: Determine role from group membership + const role = this.resolveRoleFromLdap(userEntry, config); + + // Extract user info + const preferredUsername = String( + userEntry['sAMAccountName'] || userEntry['uid'] || userEntry['cn'] || username + ); + const email = String(userEntry['mail'] || userEntry['email'] || ''); + + return { + success: true, + user: { + providerId: userDn, + preferredUsername, + email: email || undefined, + role, + }, + }; + } catch (err) { + const message = err instanceof Error ? err.message : 'LDAP connection failed'; + console.error('[SSO] LDAP authentication error:', message); + return { success: false, error: 'LDAP authentication failed. Check server connectivity.' }; + } finally { + try { await client.unbind(); } catch { /* ignore */ } + } + } + + private resolveRoleFromLdap( + userEntry: Record, + config: SSOProviderConfig + ): 'admin' | 'viewer' { + if (!config.ldapAdminGroupDn) { + return config.ldapDefaultRole || 'viewer'; + } + + const memberOf = userEntry['memberOf']; + if (!memberOf) return config.ldapDefaultRole || 'viewer'; + + const groups = Array.isArray(memberOf) + ? memberOf.map(g => String(g).toLowerCase()) + : [String(memberOf).toLowerCase()]; + + if (groups.includes(config.ldapAdminGroupDn.toLowerCase())) { + return 'admin'; + } + return config.ldapDefaultRole || 'viewer'; + } + + private escapeLdapFilter(value: string): string { + return value + .replace(/\\/g, '\\5c') + .replace(/\*/g, '\\2a') + .replace(/\(/g, '\\28') + .replace(/\)/g, '\\29') + .replace(/\0/g, '\\00'); + } + + // --- OIDC Authentication --- + + public async getOIDCAuthorizationUrl( + provider: string, + callbackUrl: string + ): Promise<{ url: string; state: string; codeVerifier: string }> { + const config = this.getProviderConfigDecrypted(provider); + if (!config || !config.enabled) { + throw new Error(`SSO provider ${provider} is not configured`); + } + if (!config.oidcClientId) { + throw new Error(`SSO provider ${provider} is missing client ID`); + } + + const { client } = await this.getOIDCClient(provider, config, callbackUrl); + const state = generators.state(); + const codeVerifier = generators.codeVerifier(); + const codeChallenge = generators.codeChallenge(codeVerifier); + + const scopes = config.oidcScopes || 'openid email profile'; + + const url = client.authorizationUrl({ + scope: scopes, + state, + code_challenge: codeChallenge, + code_challenge_method: 'S256', + }); + + return { url, state, codeVerifier }; + } + + public async handleOIDCCallback( + provider: string, + callbackUrl: string, + params: { code: string; state: string }, + expectedState: string, + codeVerifier: string + ): Promise { + if (params.state !== expectedState) { + return { success: false, error: 'Invalid state parameter (possible CSRF attack)' }; + } + + const config = this.getProviderConfigDecrypted(provider); + if (!config || !config.enabled) { + return { success: false, error: `SSO provider ${provider} is not configured` }; + } + + try { + const { client } = await this.getOIDCClient(provider, config, callbackUrl); + + const tokenSet = await client.callback(callbackUrl, { code: params.code, state: params.state }, { + state: expectedState, + code_verifier: codeVerifier, + }); + + let userInfo: Record; + + if (provider === 'oidc_github') { + // GitHub doesn't support standard OIDC userinfo; use their API + userInfo = await this.fetchGitHubUserInfo(tokenSet.access_token as string); + } else if (tokenSet.id_token) { + const claims = tokenSet.claims(); + // Also fetch userinfo for complete profile + try { + const info = await client.userinfo(tokenSet.access_token as string); + userInfo = { ...claims, ...info }; + } catch { + userInfo = claims as Record; + } + } else { + userInfo = await client.userinfo(tokenSet.access_token as string) as Record; + } + + const sub = String(userInfo.sub || userInfo.id || ''); + if (!sub) { + return { success: false, error: 'Could not determine user identity from provider' }; + } + + const email = String(userInfo.email || ''); + const name = String(userInfo.name || userInfo.preferred_username || userInfo.login || email.split('@')[0] || 'sso_user'); + const role = this.resolveRoleFromOidc(userInfo, config); + + return { + success: true, + user: { + providerId: sub, + preferredUsername: name, + email: email || undefined, + role, + }, + }; + } catch (err) { + const message = err instanceof Error ? err.message : 'OIDC authentication failed'; + console.error('[SSO] OIDC callback error:', message); + return { success: false, error: 'Authentication failed. Please try again.' }; + } + } + + private async fetchGitHubUserInfo(accessToken: string): Promise> { + const [userRes, emailRes] = await Promise.all([ + fetch('https://api.github.com/user', { + headers: { Authorization: `Bearer ${accessToken}`, Accept: 'application/json' }, + }), + fetch('https://api.github.com/user/emails', { + headers: { Authorization: `Bearer ${accessToken}`, Accept: 'application/json' }, + }), + ]); + + const user = await userRes.json() as Record; + let primaryEmail = ''; + try { + const emails = await emailRes.json() as Array<{ email: string; primary: boolean }>; + primaryEmail = emails.find(e => e.primary)?.email || emails[0]?.email || ''; + } catch { /* email fetch is best-effort */ } + + return { + sub: String(user.id), + id: user.id, + login: user.login, + name: user.name || user.login, + email: primaryEmail || user.email, + preferred_username: user.login, + }; + } + + private async getOIDCClient( + provider: string, + config: SSOProviderConfig, + callbackUrl: string + ): Promise<{ client: OIDCClient; issuer: InstanceType }> { + let issuer: InstanceType; + + if (provider === 'oidc_github') { + // GitHub is not a standard OIDC provider — manually configure + issuer = new Issuer({ + issuer: 'https://github.com', + authorization_endpoint: 'https://github.com/login/oauth/authorize', + token_endpoint: 'https://github.com/login/oauth/access_token', + userinfo_endpoint: 'https://api.github.com/user', + }); + } else { + const issuerUrl = config.oidcIssuerUrl || WELL_KNOWN_ISSUERS[provider]; + if (!issuerUrl) { + throw new Error(`Issuer URL not configured for ${provider}`); + } + issuer = await Issuer.discover(issuerUrl); + } + + const client = new issuer.Client({ + client_id: config.oidcClientId || '', + client_secret: config.oidcClientSecret || '', + redirect_uris: [callbackUrl], + response_types: ['code'], + token_endpoint_auth_method: 'client_secret_post', + }); + + return { client, issuer }; + } + + private resolveRoleFromOidc(userInfo: Record, config: SSOProviderConfig): 'admin' | 'viewer' { + const claimName = config.oidcAdminClaim || 'groups'; + const claimValue = config.oidcAdminClaimValue || 'sencho-admins'; + + if (!claimValue) return config.oidcDefaultRole || 'viewer'; + + const claim = userInfo[claimName]; + if (!claim) return config.oidcDefaultRole || 'viewer'; + + if (Array.isArray(claim)) { + if (claim.map(String).includes(claimValue)) return 'admin'; + } else if (String(claim) === claimValue) { + return 'admin'; + } + + return config.oidcDefaultRole || 'viewer'; + } + + // --- User Provisioning --- + + public provisionUser(params: { + authProvider: AuthProvider; + providerId: string; + preferredUsername: string; + email?: string; + role: 'admin' | 'viewer'; + }): User { + const db = DatabaseService.getInstance(); + + // Check if user already exists by provider identity + const existing = db.getUserByProviderIdentity(params.authProvider, params.providerId); + if (existing) { + // Update email if changed + if (params.email && params.email !== existing.email) { + db.updateUser(existing.id, { email: params.email }); + } + return db.getUser(existing.id) || existing; + } + + // Check seat limits + let { role } = params; + const seatLimits = LicenseService.getInstance().getSeatLimits(); + if (role === 'admin' && seatLimits.maxAdmins !== null && db.getAdminCount() >= seatLimits.maxAdmins) { + role = 'viewer'; // Downgrade to viewer if admin seats full + } + if (role === 'viewer' && seatLimits.maxViewers !== null && db.getViewerCount() >= seatLimits.maxViewers) { + throw new Error('User seat limit reached. Contact your administrator to increase your license.'); + } + + // Generate unique username + let username = params.preferredUsername.replace(/[^a-zA-Z0-9_-]/g, '_').substring(0, 50); + if (!username) username = 'sso_user'; + if (db.getUserByUsername(username)) { + const suffix = params.authProvider.replace('oidc_', ''); + username = `${username}_${suffix}`; + let counter = 2; + const base = username; + while (db.getUserByUsername(username)) { + username = `${base}_${counter++}`; + } + } + + // Create user with unusable password hash + const randomHash = `$sso$${crypto.randomBytes(32).toString('hex')}`; + const id = db.addUser({ + username, + password_hash: randomHash, + role, + auth_provider: params.authProvider, + provider_id: params.providerId, + email: params.email ?? null, + }); + + const user = db.getUser(id); + if (!user) throw new Error('Failed to create SSO user'); + return user; + } + + // --- Test Connection --- + + public async testLdapConnection(): Promise<{ success: boolean; error?: string }> { + const config = this.getProviderConfigDecrypted('ldap'); + if (!config || !config.ldapUrl) { + return { success: false, error: 'LDAP not configured' }; + } + + const client = new LdapClient({ + url: config.ldapUrl, + tlsOptions: { rejectUnauthorized: config.ldapTlsRejectUnauthorized !== false }, + connectTimeout: 5000, + }); + + try { + if (config.ldapBindDn && config.ldapBindPassword) { + await client.bind(config.ldapBindDn, config.ldapBindPassword); + } + return { success: true }; + } catch (err) { + const message = err instanceof Error ? err.message : 'Connection failed'; + return { success: false, error: message }; + } finally { + try { await client.unbind(); } catch { /* ignore */ } + } + } + + public async testOidcDiscovery(provider: string): Promise<{ success: boolean; error?: string; issuer?: string }> { + const config = this.getProviderConfigDecrypted(provider); + if (!config) { + return { success: false, error: `Provider ${provider} not configured` }; + } + + try { + if (provider === 'oidc_github') { + return { success: true, issuer: 'https://github.com (OAuth2, non-standard OIDC)' }; + } + const issuerUrl = config.oidcIssuerUrl || WELL_KNOWN_ISSUERS[provider]; + if (!issuerUrl) { + return { success: false, error: 'Issuer URL not configured' }; + } + const issuer = await Issuer.discover(issuerUrl); + return { success: true, issuer: issuer.metadata.issuer }; + } catch (err) { + const message = err instanceof Error ? err.message : 'Discovery failed'; + return { success: false, error: message }; + } + } +} diff --git a/docs/docs.json b/docs/docs.json index b465a311..1d1a0fa0 100644 --- a/docs/docs.json +++ b/docs/docs.json @@ -74,7 +74,8 @@ "pages": [ "getting-started/introduction", "getting-started/quickstart", - "getting-started/configuration" + "getting-started/configuration", + "getting-started/sso-quickstart" ] }, { @@ -96,6 +97,7 @@ "features/atomic-deployments", "features/fleet-backups", "features/audit-log", + "features/sso", "features/licensing" ] }, diff --git a/docs/features/rbac.mdx b/docs/features/rbac.mdx index 9675ac13..a582499a 100644 --- a/docs/features/rbac.mdx +++ b/docs/features/rbac.mdx @@ -49,6 +49,14 @@ Admins can manage accounts in **Settings → Users**. From there you can: - **Edit** an existing user's password or role - **Delete** a user account +## SSO auto-provisioning + +With a Team Pro license, users can also be created automatically when they log in via SSO (LDAP, Google, GitHub, or Okta). SSO users appear in the Users list alongside local accounts. They are assigned a role based on identity provider group membership or claim mapping. + +SSO users cannot log in with a password — they must always authenticate through their identity provider. + +To set up identity provider authentication, see [SSO Authentication →](/features/sso). + ## Migration from single-admin setup When you upgrade to Sencho Pro, your existing single-admin credentials are automatically migrated to the new users table. No manual action is required - your login continues to work as before, and your account is assigned the Admin role. diff --git a/docs/features/sso.mdx b/docs/features/sso.mdx new file mode 100644 index 00000000..0abf5180 --- /dev/null +++ b/docs/features/sso.mdx @@ -0,0 +1,193 @@ +--- +title: SSO & LDAP Authentication +description: Authenticate with your existing identity provider — LDAP, Google, GitHub, or Okta. +--- + + + SSO requires a Sencho **Team Pro** license. Personal Pro and Community Edition do not include this feature. + + +Sencho Team Pro lets your team sign in using existing identity providers instead of managing separate credentials. SSO works **alongside** password authentication — it does not replace it. + +## Supported providers + +| Provider | Protocol | Notes | +|----------|----------|-------| +| **LDAP / Active Directory** | LDAP bind + search | Works with OpenLDAP, Active Directory, FreeIPA, and any LDAPv3 server | +| **Google** | OpenID Connect | Google Workspace or personal Google accounts | +| **GitHub** | OAuth 2.0 | GitHub personal accounts and GitHub orgs | +| **Okta** | OpenID Connect | Any Okta org or Okta-compatible IdP | + +## How it works + +### LDAP flow + +1. User enters their directory username and password on the Sencho login page +2. Sencho binds to LDAP with a service account, searches for the user, then verifies their password +3. If this is their first login, a Sencho account is automatically created +4. Sencho issues a JWT and the user is logged in — identical to a password login + +### OIDC / OAuth flow (Google, GitHub, Okta) + +1. User clicks the provider button on the login page (e.g., "Sign in with Google") +2. Browser redirects to the identity provider for authentication +3. After granting consent, the provider redirects back to Sencho with an authorization code +4. Sencho exchanges the code for tokens, verifies the ID token, and reads user information +5. If this is their first login, a Sencho account is automatically created +6. Sencho issues a JWT and redirects to the dashboard + +All OIDC flows use **PKCE** (Proof Key for Code Exchange) and a **state parameter** for CSRF protection. + +## Auto-provisioning + +When a user logs in via SSO for the first time, Sencho automatically creates a local account: + +- **Username** is derived from their identity provider profile (display name, email prefix, or login handle) +- **Role** is assigned based on [role mapping](#role-mapping) — defaults to Viewer if no mapping matches +- **Password** is set to an unusable placeholder — SSO users cannot log in with a password +- **Seat limits** from your license apply. If admin seats are full, the user is downgraded to Viewer. If all seats are full, login is denied with a clear error message. + +On subsequent logins, the existing account is reused. The user's email is updated if it changed at the provider. + +## Role mapping + +### LDAP group mapping + +Set the **Admin Group DN** to a group in your directory. Members of that group get the Admin role; everyone else gets the default role (Viewer). + +Example: If your admin group is `cn=sencho-admins,ou=groups,dc=example,dc=com`, set that as the Admin Group DN. Users who are a `member` of that group will be provisioned as Admin. + +### OIDC claim mapping + +For OIDC providers, configure two fields: + +| Field | Description | Example | +|-------|-------------|---------| +| **Admin Claim** | The JWT claim name that contains role information | `groups` | +| **Admin Claim Value** | The value within that claim that grants Admin | `sencho-admins` | + +If the user's ID token contains a `groups` claim with the value `sencho-admins`, they get Admin. Otherwise, they get the default role. + + + Not all providers include a `groups` claim by default. You may need to configure custom claims in your identity provider's admin console. + + +## Configuration + +SSO can be configured two ways: + +1. **Settings UI** — Go to **Settings → SSO** in the Sencho dashboard. Enable providers, enter credentials, and test connections from the UI. Changes take effect immediately without restarting. +2. **Environment variables** — Set `SSO_*` variables in your Docker Compose file. These seed the database on first boot. After that, the database configuration is authoritative. + +### Via Settings UI + +Admins can manage SSO providers in **Settings → SSO**. Each provider has: + +- An **enable/disable** toggle +- Provider-specific configuration fields +- A **Test Connection** button to verify connectivity before saving + + + SSO settings panel showing all four identity providers + + +Expand a provider card to configure it. Here's the LDAP configuration form: + + + LDAP configuration form with server URL, bind DN, search base, and role mapping + + +And an OIDC provider (Google) configuration form: + + + Google OIDC configuration form with client ID, client secret, and role claim mapping + + +### Via environment variables + +Environment variables are useful for initial deployment or infrastructure-as-code workflows. They seed the SSO configuration on first startup. After that, changes made in the Settings UI take precedence. + +## SSO environment variables reference + +### LDAP + +| Variable | Default | Description | +|----------|---------|-------------| +| `SSO_LDAP_ENABLED` | `false` | Enable LDAP authentication | +| `SSO_LDAP_URL` | — | LDAP server URL (e.g., `ldap://ldap.example.com:389` or `ldaps://ldap.example.com:636`) | +| `SSO_LDAP_BIND_DN` | — | Service account DN for searching users | +| `SSO_LDAP_BIND_PASSWORD` | — | Service account password (encrypted at rest in the database) | +| `SSO_LDAP_SEARCH_BASE` | — | Base DN for user searches (e.g., `ou=users,dc=example,dc=com`) | +| `SSO_LDAP_SEARCH_FILTER` | `(uid={{username}})` | LDAP filter template. Use `(sAMAccountName={{username}})` for Active Directory | +| `SSO_LDAP_ADMIN_GROUP_DN` | — | DN of the group whose members receive the Admin role | +| `SSO_LDAP_DEFAULT_ROLE` | `viewer` | Role assigned to LDAP users not in the admin group | +| `SSO_LDAP_TLS_REJECT_UNAUTHORIZED` | `true` | Whether to verify the LDAP server's TLS certificate | + +### Google OIDC + +| Variable | Default | Description | +|----------|---------|-------------| +| `SSO_OIDC_GOOGLE_ENABLED` | `false` | Enable Google SSO | +| `SSO_OIDC_GOOGLE_CLIENT_ID` | — | OAuth client ID from Google Cloud Console | +| `SSO_OIDC_GOOGLE_CLIENT_SECRET` | — | OAuth client secret (encrypted at rest) | + +### GitHub OAuth + +| Variable | Default | Description | +|----------|---------|-------------| +| `SSO_OIDC_GITHUB_ENABLED` | `false` | Enable GitHub SSO | +| `SSO_OIDC_GITHUB_CLIENT_ID` | — | OAuth app client ID from GitHub Developer Settings | +| `SSO_OIDC_GITHUB_CLIENT_SECRET` | — | OAuth app client secret (encrypted at rest) | + +### Okta OIDC + +| Variable | Default | Description | +|----------|---------|-------------| +| `SSO_OIDC_OKTA_ENABLED` | `false` | Enable Okta SSO | +| `SSO_OIDC_OKTA_ISSUER_URL` | — | Okta issuer URL (e.g., `https://dev-123456.okta.com`) | +| `SSO_OIDC_OKTA_CLIENT_ID` | — | Okta application client ID | +| `SSO_OIDC_OKTA_CLIENT_SECRET` | — | Okta client secret (encrypted at rest) | + +### General + +| Variable | Default | Description | +|----------|---------|-------------| +| `SSO_OIDC_ADMIN_CLAIM` | `groups` | JWT claim name inspected for Admin role mapping | +| `SSO_OIDC_ADMIN_CLAIM_VALUE` | `sencho-admins` | Value in the admin claim that maps to the Admin role | +| `SSO_DEFAULT_ROLE` | `viewer` | Default role for all SSO users when no mapping matches | +| `SSO_CALLBACK_URL` | auto-detect | External base URL for OAuth callback URLs (see below) | + +## Reverse proxy and callback URLs + + + If Sencho is behind a reverse proxy (nginx, Traefik, Caddy), you **must** set `SSO_CALLBACK_URL` to your external URL. Otherwise, OAuth callbacks will fail. + + +Set `SSO_CALLBACK_URL` to the URL users access Sencho from — for example, `https://sencho.example.com`. Sencho uses this to construct the OAuth redirect URI that your identity provider calls back to. + +If not set, Sencho auto-detects the URL from the request's `Host` header and protocol, which works for direct access but fails behind proxies that rewrite the host. + +## Security + +- **PKCE** — All OIDC flows use `code_challenge_method=S256` to prevent authorization code interception +- **State parameter** — A cryptographic random value protects against CSRF attacks on the OAuth callback +- **Encrypted secrets** — LDAP bind passwords and OIDC client secrets are encrypted at rest with AES-256-GCM +- **No local password** — SSO users are created with an unusable password hash. They cannot bypass SSO by using the password login form +- **Admin-only configuration** — Only Team Pro administrators can enable or configure SSO providers + +## Troubleshooting + +### LDAP connection refused +Verify the LDAP server is reachable from the Sencho container. If LDAP is on the host machine, use `host.docker.internal` (Docker Desktop) or the host's LAN IP address — not `localhost`. + +### TLS certificate errors +If your LDAP server uses a self-signed certificate, set `SSO_LDAP_TLS_REJECT_UNAUTHORIZED=false`. For production, install a trusted certificate instead. + +### OAuth callback URL mismatch +The redirect URI registered in your identity provider must exactly match what Sencho sends. Check: +1. `SSO_CALLBACK_URL` is set to your external URL (e.g., `https://sencho.example.com`) +2. The callback URL in your provider's settings is `https://sencho.example.com/api/auth/sso/oidc//callback` +3. Protocol matches — don't mix `http` and `https` + +### SSO buttons not appearing on login page +SSO providers only appear on the login page when they are both **configured** and **enabled**. Check Settings → SSO to verify the provider is active. diff --git a/docs/getting-started/configuration.mdx b/docs/getting-started/configuration.mdx index 841d219a..6b81d8c8 100644 --- a/docs/getting-started/configuration.mdx +++ b/docs/getting-started/configuration.mdx @@ -27,6 +27,20 @@ When you point `COMPOSE_DIR` at a directory, Sencho expects each stack to live i | `DATA_DIR` | `/app/data` | Directory where Sencho stores its SQLite database, node registry, and cached metrics. | | `NODE_ENV` | `production` | Set automatically in the Docker image. Only change this for local development. | +## SSO environment variables + +If you use SSO (Team Pro), configure your identity providers via environment variables: + +| Variable | Description | +|----------|-------------| +| `SSO_LDAP_ENABLED` | Enable LDAP/AD authentication | +| `SSO_OIDC_GOOGLE_ENABLED` | Enable Google SSO | +| `SSO_OIDC_GITHUB_ENABLED` | Enable GitHub SSO | +| `SSO_OIDC_OKTA_ENABLED` | Enable Okta SSO | +| `SSO_CALLBACK_URL` | External base URL for OAuth callbacks (required behind reverse proxy) | + +For the full SSO configuration reference and setup guides, see [SSO Authentication →](/features/sso). + ## Required volume mounts ### Docker socket diff --git a/docs/getting-started/sso-quickstart.mdx b/docs/getting-started/sso-quickstart.mdx new file mode 100644 index 00000000..9dd10053 --- /dev/null +++ b/docs/getting-started/sso-quickstart.mdx @@ -0,0 +1,153 @@ +--- +title: SSO Setup Guide +description: Step-by-step instructions for connecting Sencho to your identity provider. +--- + + + SSO requires a Sencho **Team Pro** license. You can configure SSO via environment variables (shown below) or from the Settings UI after first boot. + + +## Google OIDC + +1. Go to the [Google Cloud Console](https://console.cloud.google.com/apis/credentials) +2. Create a new **OAuth 2.0 Client ID** (Application type: Web application) +3. Add an **Authorized redirect URI**: `https://sencho.example.com/api/auth/sso/oidc/oidc_google/callback` +4. Copy the **Client ID** and **Client Secret** +5. Add to your `docker-compose.yml`: + +```yaml +services: + sencho: + image: saelix/sencho:latest + environment: + - COMPOSE_DIR=/opt/compose + - SSO_OIDC_GOOGLE_ENABLED=true + - SSO_OIDC_GOOGLE_CLIENT_ID=your-client-id.apps.googleusercontent.com + - SSO_OIDC_GOOGLE_CLIENT_SECRET=your-client-secret + - SSO_CALLBACK_URL=https://sencho.example.com + volumes: + - /var/run/docker.sock:/var/run/docker.sock + - ./sencho-data:/app/data + - /opt/compose:/opt/compose +``` + +Restart Sencho. A "Google" button will appear on the login page. + +## GitHub OAuth + +1. Go to **GitHub → Settings → Developer Settings → [OAuth Apps](https://github.com/settings/developers)** +2. Click **New OAuth App** +3. Set: + - **Application name**: Sencho + - **Homepage URL**: `https://sencho.example.com` + - **Authorization callback URL**: `https://sencho.example.com/api/auth/sso/oidc/oidc_github/callback` +4. Copy the **Client ID** and generate a **Client Secret** +5. Add to your `docker-compose.yml`: + +```yaml + environment: + - SSO_OIDC_GITHUB_ENABLED=true + - SSO_OIDC_GITHUB_CLIENT_ID=your-github-client-id + - SSO_OIDC_GITHUB_CLIENT_SECRET=your-github-client-secret + - SSO_CALLBACK_URL=https://sencho.example.com +``` + +## Okta OIDC + +1. In the [Okta Admin Console](https://admin.okta.com), go to **Applications → Create App Integration** +2. Select **OIDC - OpenID Connect** and **Web Application** +3. Set the **Sign-in redirect URI** to: `https://sencho.example.com/api/auth/sso/oidc/oidc_okta/callback` +4. Note your **Okta domain** (e.g., `https://dev-123456.okta.com`) +5. Copy the **Client ID** and **Client Secret** +6. Add to your `docker-compose.yml`: + +```yaml + environment: + - SSO_OIDC_OKTA_ENABLED=true + - SSO_OIDC_OKTA_ISSUER_URL=https://dev-123456.okta.com + - SSO_OIDC_OKTA_CLIENT_ID=your-okta-client-id + - SSO_OIDC_OKTA_CLIENT_SECRET=your-okta-client-secret + - SSO_CALLBACK_URL=https://sencho.example.com +``` + +## LDAP / Active Directory + +1. Identify your LDAP server's URL and port (default: `389` for LDAP, `636` for LDAPS) +2. Create a **read-only service account** (bind DN) that can search the user directory +3. Determine the **search base** (where users live in the directory tree) +4. Choose the right **search filter**: + - OpenLDAP: `(uid={{username}})` + - Active Directory: `(sAMAccountName={{username}})` +5. Optionally identify an **admin group DN** for role mapping +6. Add to your `docker-compose.yml`: + +```yaml + environment: + - SSO_LDAP_ENABLED=true + - SSO_LDAP_URL=ldap://ldap.example.com:389 + - SSO_LDAP_BIND_DN=cn=readonly,dc=example,dc=com + - SSO_LDAP_BIND_PASSWORD=your-bind-password + - SSO_LDAP_SEARCH_BASE=ou=users,dc=example,dc=com + - SSO_LDAP_SEARCH_FILTER=(uid={{username}}) + - SSO_LDAP_ADMIN_GROUP_DN=cn=sencho-admins,ou=groups,dc=example,dc=com + - SSO_LDAP_DEFAULT_ROLE=viewer +``` + +After starting Sencho, verify the connection in **Settings → SSO → Test Connection**. + + + If your LDAP server is on the Docker host (not in a container), use the host's LAN IP or `host.docker.internal` (Docker Desktop) instead of `localhost`. + + +## Role mapping + +By default, all SSO users are assigned the **Viewer** role. To grant Admin to specific users: + +**For LDAP**: Set `SSO_LDAP_ADMIN_GROUP_DN` to the DN of your admin group. Users who are members of that group will be provisioned as Admin. + +**For OIDC**: Set these two variables: + +```yaml + environment: + - SSO_OIDC_ADMIN_CLAIM=groups + - SSO_OIDC_ADMIN_CLAIM_VALUE=sencho-admins +``` + +This tells Sencho to check the `groups` claim in the OIDC ID token. If it contains `sencho-admins`, the user gets Admin. + +## Full docker-compose.yml example with SSO + +```yaml +services: + sencho: + image: saelix/sencho:latest + restart: unless-stopped + ports: + - "3000:3000" + volumes: + - /var/run/docker.sock:/var/run/docker.sock + - ./sencho-data:/app/data + - /opt/compose:/opt/compose + environment: + - COMPOSE_DIR=/opt/compose + - DATA_DIR=/app/data + # Google SSO + - SSO_OIDC_GOOGLE_ENABLED=true + - SSO_OIDC_GOOGLE_CLIENT_ID=your-google-client-id + - SSO_OIDC_GOOGLE_CLIENT_SECRET=your-google-secret + # LDAP + - SSO_LDAP_ENABLED=true + - SSO_LDAP_URL=ldap://ldap.example.com:389 + - SSO_LDAP_BIND_DN=cn=readonly,dc=example,dc=com + - SSO_LDAP_BIND_PASSWORD=your-bind-password + - SSO_LDAP_SEARCH_BASE=ou=users,dc=example,dc=com + - SSO_LDAP_SEARCH_FILTER=(sAMAccountName={{username}}) + - SSO_LDAP_ADMIN_GROUP_DN=cn=sencho-admins,ou=groups,dc=example,dc=com + # Role mapping & callback + - SSO_OIDC_ADMIN_CLAIM=groups + - SSO_OIDC_ADMIN_CLAIM_VALUE=sencho-admins + - SSO_DEFAULT_ROLE=viewer + - SSO_CALLBACK_URL=https://sencho.example.com +``` + +For the complete list of environment variables and their defaults, see [SSO & LDAP Authentication →](/features/sso#sso-environment-variables-reference). diff --git a/docs/images/sso/sso-settings-ldap.png b/docs/images/sso/sso-settings-ldap.png new file mode 100644 index 0000000000000000000000000000000000000000..98b2b6c206591323a64c20854544a636b8b92d03 GIT binary patch literal 101586 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 TLyO!M8M8y4M?4zcf>Zwklv+i8 literal 0 HcmV?d00001 diff --git a/docs/images/sso/sso-settings-oidc.png b/docs/images/sso/sso-settings-oidc.png new file mode 100644 index 0000000000000000000000000000000000000000..2f79d805d6f34ef6e399259fa38b40217c3432ad GIT binary patch literal 85593 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 literal 0 HcmV?d00001 diff --git a/docs/images/sso/sso-settings.png b/docs/images/sso/sso-settings.png new file mode 100644 index 0000000000000000000000000000000000000000..54f2e0f4d9ee4c1e6280a64a46116c27e9bec946 GIT binary patch literal 88260 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 LB9n93= + + + + + + ); + case 'oidc_github': + return ( + + + + ); + case 'oidc_okta': + return ( + + + + ); + default: + return null; + } +} + export function Login({ className, ...props }: React.ComponentPropsWithoutRef<"div">) { - const { login } = useAuth(); + const { login, ssoLdapLogin } = useAuth(); const [username, setUsername] = useState(''); const [password, setPassword] = useState(''); - const [error, setError] = useState(''); + const [error, setError] = useState(() => { + const params = new URLSearchParams(window.location.search); + const ssoError = params.get('sso_error'); + if (ssoError) { + window.history.replaceState({}, '', window.location.pathname); + return ssoError; + } + return ''; + }); const [isLoading, setIsLoading] = useState(false); + const [loginMode, setLoginMode] = useState<'local' | 'ldap'>('local'); + const [ssoProviders, setSsoProviders] = useState([]); + + useEffect(() => { + fetch('/api/auth/sso/providers', { credentials: 'include' }) + .then(r => r.ok ? r.json() : []) + .then((providers: SSOProvider[]) => setSsoProviders(providers)) + .catch(() => {}); + }, []); + + const hasLdap = ssoProviders.some(p => p.type === 'ldap'); + const oidcProviders = ssoProviders.filter(p => p.type === 'oidc'); const handleSubmit = async (e: React.FormEvent) => { e.preventDefault(); setError(''); setIsLoading(true); - const result = await login(username, password); + const result = loginMode === 'ldap' && ssoLdapLogin + ? await ssoLdapLogin(username, password) + : await login(username, password); if (!result.success) { setError(result.error || 'Login failed'); @@ -106,10 +162,52 @@ export function Login({ )} + {hasLdap && ( + + )} + + {oidcProviders.length > 0 && ( + <> +

diff --git a/frontend/src/components/SSOSection.tsx b/frontend/src/components/SSOSection.tsx new file mode 100644 index 00000000..f0d7274c --- /dev/null +++ b/frontend/src/components/SSOSection.tsx @@ -0,0 +1,365 @@ +import { useState, useEffect } from 'react'; +import { Input } from '@/components/ui/input'; +import { Switch } from '@/components/ui/switch'; +import { Button } from '@/components/ui/button'; +import { Label } from '@/components/ui/label'; +import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from '@/components/ui/select'; +import { Badge } from '@/components/ui/badge'; +import { toast } from 'sonner'; +import { apiFetch } from '@/lib/api'; +import { ProGate } from './ProGate'; +import { Shield, Loader2, CheckCircle, XCircle } from 'lucide-react'; + +interface SSOProviderConfig { + provider: string; + enabled: boolean; + displayName: string; + // LDAP + ldapUrl?: string; + ldapBindDn?: string; + ldapBindPassword?: string; + ldapSearchBase?: string; + ldapSearchFilter?: string; + ldapAdminGroupDn?: string; + ldapDefaultRole?: string; + ldapTlsRejectUnauthorized?: boolean; + // OIDC + oidcIssuerUrl?: string; + oidcClientId?: string; + oidcClientSecret?: string; + oidcScopes?: string; + oidcAdminClaim?: string; + oidcAdminClaimValue?: string; + oidcDefaultRole?: string; +} + +const PROVIDERS = [ + { id: 'ldap', label: 'LDAP / Active Directory', type: 'ldap' as const }, + { id: 'oidc_google', label: 'Google', type: 'oidc' as const }, + { id: 'oidc_github', label: 'GitHub', type: 'oidc' as const }, + { id: 'oidc_okta', label: 'Okta', type: 'oidc' as const }, +]; + +function ProviderCard({ providerId, type, label, initialConfig, onSave }: { + providerId: string; + type: 'ldap' | 'oidc'; + label: string; + initialConfig: SSOProviderConfig | null; + onSave: () => void; +}) { + const [config, setConfig] = useState>(initialConfig || { enabled: false }); + const [saving, setSaving] = useState(false); + const [testing, setTesting] = useState(false); + const [testResult, setTestResult] = useState<{ success: boolean; error?: string } | null>(null); + const [expanded, setExpanded] = useState(!!initialConfig?.enabled); + + const update = (field: string, value: string | boolean) => { + setConfig(prev => ({ ...prev, [field]: value })); + }; + + const handleSave = async () => { + setSaving(true); + try { + const body = { + ...config, + provider: providerId, + displayName: config.displayName || label, + }; + const res = await apiFetch(`/sso/config/${providerId}`, { + method: 'PUT', + headers: { 'Content-Type': 'application/json' }, + body: JSON.stringify(body), + }); + if (res.ok) { + toast.success('SSO configuration saved'); + onSave(); + } else { + const data = await res.json(); + toast.error(data?.error || data?.message || 'Failed to save'); + } + } catch (error: unknown) { + toast.error((error as Error)?.message || 'Failed to save SSO configuration'); + } finally { + setSaving(false); + } + }; + + const handleTest = async () => { + setTesting(true); + setTestResult(null); + try { + const res = await apiFetch(`/sso/config/${providerId}/test`, { method: 'POST' }); + const data = await res.json(); + setTestResult(data); + if (data.success) { + toast.success('Connection successful'); + } else { + toast.error(data.error || 'Connection failed'); + } + } catch { + setTestResult({ success: false, error: 'Connection test failed' }); + } finally { + setTesting(false); + } + }; + + const handleDelete = async () => { + try { + const res = await apiFetch(`/sso/config/${providerId}`, { method: 'DELETE' }); + if (res.ok) { + toast.success('SSO provider removed'); + setConfig({ enabled: false }); + setExpanded(false); + onSave(); + } + } catch { + toast.error('Failed to remove provider'); + } + }; + + return ( +
+
setExpanded(!expanded)} + > +
+ {label} + {initialConfig?.enabled && ( + + Active + + )} +
+
+ update('enabled', checked)} + onClick={(e) => e.stopPropagation()} + /> +
+
+ + {expanded && ( +
+ {type === 'ldap' ? ( + <> +
+ + update('ldapUrl', e.target.value)} + /> +
+
+
+ + update('ldapBindDn', e.target.value)} + /> +
+
+ + update('ldapBindPassword', e.target.value)} + /> +
+
+
+ + update('ldapSearchBase', e.target.value)} + /> +
+
+ + update('ldapSearchFilter', e.target.value)} + /> +

+ Use {'{{username}}'} as placeholder. + For Active Directory: {'(sAMAccountName={{username}})'} +

+
+
+
+ + update('ldapAdminGroupDn', e.target.value)} + /> +
+
+ + +
+
+
+ update('ldapTlsRejectUnauthorized', checked)} + /> + +
+ + ) : ( + <> + {providerId === 'oidc_okta' && ( +
+ + update('oidcIssuerUrl', e.target.value)} + /> +
+ )} +
+
+ + update('oidcClientId', e.target.value)} + /> +
+
+ + update('oidcClientSecret', e.target.value)} + /> +
+
+
+
+ + update('oidcAdminClaim', e.target.value)} + /> +
+
+ + update('oidcAdminClaimValue', e.target.value)} + /> +
+
+
+ + +
+ + )} + +
+
+ + + {testResult && ( + testResult.success + ? + : + )} +
+ {initialConfig && ( + + )} +
+
+ )} +
+ ); +} + +export function SSOSection() { + const [configs, setConfigs] = useState([]); + + const fetchConfigs = async () => { + try { + const res = await apiFetch('/sso/config'); + if (res.ok) setConfigs(await res.json()); + } catch { /* ignore - ProGate will handle non-pro */ } + }; + + // eslint-disable-next-line react-hooks/set-state-in-effect + useEffect(() => { fetchConfigs(); }, []); + + const getConfig = (provider: string) => configs.find(c => c.provider === provider) || null; + + return ( + +
+
+

+ + SSO Authentication +

+

+ Connect your identity provider so team members can sign in with their existing credentials. + SSO works alongside password authentication — it does not replace it. +

+
+ +
+ {PROVIDERS.map(p => ( + + ))} +
+ +
+

SSO users are automatically provisioned on first login and assigned a role based on your identity provider's group membership.

+

For OIDC providers, set the OAuth callback URL to: {'https:///api/auth/sso/oidc//callback'}

+
+
+
+ ); +} diff --git a/frontend/src/components/SettingsModal.tsx b/frontend/src/components/SettingsModal.tsx index 5aa44b48..3943b608 100644 --- a/frontend/src/components/SettingsModal.tsx +++ b/frontend/src/components/SettingsModal.tsx @@ -27,6 +27,7 @@ import { useAuth } from '@/context/AuthContext'; import { useLicense } from '@/context/LicenseContext'; import { TierBadge } from './TierBadge'; import { ProGate } from './ProGate'; +import { SSOSection } from './SSOSection'; interface Agent { type: 'discord' | 'slack' | 'webhook'; @@ -48,7 +49,7 @@ interface PatchableSettings { log_retention_days?: string; } -type SectionId = 'account' | 'license' | 'users' | 'system' | 'notifications' | 'webhooks' | 'developer' | 'nodes' | 'appstore' | 'support' | 'about'; +type SectionId = 'account' | 'license' | 'users' | 'sso' | 'system' | 'notifications' | 'webhooks' | 'developer' | 'nodes' | 'appstore' | 'support' | 'about'; interface WebhookItem { id: number; @@ -656,7 +657,7 @@ export function SettingsModal({ isOpen, onClose }: SettingsModalProps) { // When switching to a remote node, reset to a node-scoped section if on a global-only one useEffect(() => { - if (isRemote && (activeSection === 'account' || activeSection === 'license' || activeSection === 'users' || activeSection === 'notifications' || activeSection === 'webhooks' || activeSection === 'nodes' || activeSection === 'appstore')) { + if (isRemote && (activeSection === 'account' || activeSection === 'license' || activeSection === 'users' || activeSection === 'sso' || activeSection === 'notifications' || activeSection === 'webhooks' || activeSection === 'nodes' || activeSection === 'appstore')) { setActiveSection('system'); } }, [isRemote]); // eslint-disable-line react-hooks/exhaustive-deps @@ -997,6 +998,9 @@ export function SettingsModal({ isOpen, onClose }: SettingsModalProps) { {!isRemote && isAdmin && ( } label="Users" /> )} + {!isRemote && isAdmin && ( + } label="SSO" /> + )} } @@ -1452,6 +1456,10 @@ export function SettingsModal({ isOpen, onClose }: SettingsModalProps) { )} + {activeSection === 'sso' && ( + + )} + {activeSection === 'developer' && (
diff --git a/frontend/src/context/AuthContext.tsx b/frontend/src/context/AuthContext.tsx index 20a45903..9b9ab66e 100644 --- a/frontend/src/context/AuthContext.tsx +++ b/frontend/src/context/AuthContext.tsx @@ -14,6 +14,7 @@ interface AuthContextType { user: UserInfo | null; isAdmin: boolean; login: (username: string, password: string) => Promise<{ success: boolean; error?: string }>; + ssoLdapLogin: (username: string, password: string) => Promise<{ success: boolean; error?: string }>; logout: () => Promise; completeSetup: () => void; checkAuth: () => Promise; @@ -91,6 +92,29 @@ export function AuthProvider({ children }: { children: ReactNode }) { } }; + const ssoLdapLogin = async (username: string, password: string): Promise<{ success: boolean; error?: string }> => { + try { + const response = await fetch('/api/auth/sso/ldap', { + method: 'POST', + headers: { 'Content-Type': 'application/json' }, + credentials: 'include', + body: JSON.stringify({ username, password }), + }); + + const data = await response.json(); + + if (response.ok && data.success) { + setAppStatus('authenticated'); + await checkAuth(); + return { success: true }; + } else { + return { success: false, error: data.error || 'LDAP login failed' }; + } + } catch { + return { success: false, error: 'Network error. Please try again.' }; + } + }; + const logout = async () => { try { await fetch('/api/auth/logout', { @@ -118,6 +142,7 @@ export function AuthProvider({ children }: { children: ReactNode }) { user, isAdmin: user?.role === 'admin', login, + ssoLdapLogin, logout, completeSetup, checkAuth