From 8e544ad5b9bf28b13dc184a01f009bb55cf9690f Mon Sep 17 00:00:00 2001 From: Daniel Onyejesi Date: Wed, 25 Mar 2026 18:54:44 -0400 Subject: [PATCH] Add OpenID Connect SSO + Firefox speech notice OIDC/SSO: - New /api/auth/oidc route with PKCE for secure authorization - Supports Azure AD, Okta, Keycloak, PocketID, Google, any OIDC provider - Admin configurable: issuer, client ID/secret, button label - Option to disable local auth (force SSO only) - Auto-creates users on first SSO login, links existing by email - SSO button on login page, hidden until admin enables OIDC Firefox: - Show info toast on first recording that live preview requires Chrome/Edge; server-side transcription still works in all browsers --- package-lock.json | 37 +++++++- package.json | 1 + public/index.html | 9 +- public/js/app.js | 11 ++- public/js/auth.js | 43 ++++++++- server.js | 1 + src/db/database.js | 1 + src/routes/oidc.js | 225 +++++++++++++++++++++++++++++++++++++++++++++ 8 files changed, 321 insertions(+), 7 deletions(-) create mode 100644 src/routes/oidc.js diff --git a/package-lock.json b/package-lock.json index aa35607..242c688 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,14 +1,13 @@ { "name": "pediatric-ai-scribe", - "version": "7.0.0", + "version": "8.0.0", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "pediatric-ai-scribe", - "version": "7.0.0", + "version": "8.0.0", "dependencies": { - "@aws-sdk/client-transcribe-streaming": "^3.700.0", "@marp-team/marp-cli": "^4.3.1", "@marp-team/marp-core": "^4.3.0", "@tiptap/core": "^3.20.4", @@ -30,6 +29,7 @@ "multer": "^1.4.5-lts.1", "nodemailer": "^6.9.16", "openai": "^4.73.0", + "openid-client": "^6.8.2", "pdf-parse": "^1.1.1", "pg": "^8.13.0", "pptxgenjs": "^4.0.1", @@ -3937,6 +3937,15 @@ "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", "license": "MIT" }, + "node_modules/jose": { + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/jose/-/jose-6.2.2.tgz", + "integrity": "sha512-d7kPDd34KO/YnzaDOlikGpOurfF0ByC2sEV4cANCtdqLlTfBlw2p14O/5d/zv40gJPbIQxfES3nSx1/oYNyuZQ==", + "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", @@ -4403,6 +4412,15 @@ "node": ">=6.0.0" } }, + "node_modules/oauth4webapi": { + "version": "3.8.5", + "resolved": "https://registry.npmjs.org/oauth4webapi/-/oauth4webapi-3.8.5.tgz", + "integrity": "sha512-A8jmyUckVhRJj5lspguklcl90Ydqk61H3dcU0oLhH3Yv13KpAliKTt5hknpGGPZSSfOwGyraNEFmofDYH+1kSg==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/panva" + } + }, "node_modules/object-assign": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", @@ -4475,6 +4493,19 @@ } } }, + "node_modules/openid-client": { + "version": "6.8.2", + "resolved": "https://registry.npmjs.org/openid-client/-/openid-client-6.8.2.tgz", + "integrity": "sha512-uOvTCndr4udZsKihJ68H9bUICrriHdUVJ6Az+4Ns6cW55rwM5h0bjVIzDz2SxgOI84LKjFyjOFvERLzdTUROGA==", + "license": "MIT", + "dependencies": { + "jose": "^6.1.3", + "oauth4webapi": "^3.8.4" + }, + "funding": { + "url": "https://github.com/sponsors/panva" + } + }, "node_modules/orderedmap": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/orderedmap/-/orderedmap-2.1.1.tgz", diff --git a/package.json b/package.json index 1caa55d..1992037 100644 --- a/package.json +++ b/package.json @@ -28,6 +28,7 @@ "multer": "^1.4.5-lts.1", "nodemailer": "^6.9.16", "openai": "^4.73.0", + "openid-client": "^6.8.2", "pdf-parse": "^1.1.1", "pg": "^8.13.0", "pptxgenjs": "^4.0.1", diff --git a/public/index.html b/public/index.html index 9c0257a..9f9f384 100644 --- a/public/index.html +++ b/public/index.html @@ -50,7 +50,14 @@ - + + +