From 5752f529cb175569fb604e83937edc90f4dae191 Mon Sep 17 00:00:00 2001 From: Trevor Mears Date: Sat, 17 Jan 2026 22:52:06 -0800 Subject: [PATCH] feat: implement OIDC SSO with JIT provisioning --- package-lock.json | 41 +++++++++++++++- package.json | 4 +- public/index.html | 14 ++++++ public/login.html | 37 ++++++++++++++ server/auth.js | 109 +++++++++++++++++++++++++++++++++++++++--- server/db.js | 15 +++++- server/index.js | 8 ++++ server/routes/auth.js | 84 +++++++++++++++++++++----------- 8 files changed, 273 insertions(+), 39 deletions(-) diff --git a/package-lock.json b/package-lock.json index 7dd1f20..1839780 100644 --- a/package-lock.json +++ b/package-lock.json @@ -6,18 +6,20 @@ "packages": { "": { "name": "nodecast-tv", - "version": "1.0.0", + "version": "2.0.0", "license": "GPL-3.0-only", "dependencies": { "@ffprobe-installer/ffprobe": "^2.1.2", "bcryptjs": "^3.0.3", "better-sqlite3": "^12.5.0", + "dotenv": "^17.2.3", "express": "^4.18.2", "express-session": "^1.18.2", "jsonwebtoken": "^9.0.3", "passport": "^0.7.0", "passport-jwt": "^4.0.1", "passport-local": "^1.0.0", + "passport-openidconnect": "^0.1.2", "sax": "^1.4.3", "xml2js": "^0.6.2" }, @@ -525,6 +527,18 @@ "node": ">=8" } }, + "node_modules/dotenv": { + "version": "17.2.3", + "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-17.2.3.tgz", + "integrity": "sha512-JVUnt+DUIzu87TABbhPmNfVdBDt18BLOWjMUFJMSi/Qqg7NTYtabbvSNJGOJ7afbRuv9D/lngizHtP7QyLQ+9w==", + "license": "BSD-2-Clause", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://dotenvx.com" + } + }, "node_modules/dunder-proto": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz", @@ -1196,6 +1210,12 @@ "node": ">=10" } }, + "node_modules/oauth": { + "version": "0.10.2", + "resolved": "https://registry.npmjs.org/oauth/-/oauth-0.10.2.tgz", + "integrity": "sha512-JtFnB+8nxDEXgNyniwz573xxbKSOu3R8D40xQKqcjwJ2CDkYqUDI53o6IuzDJBx60Z8VKCm271+t8iFjakrl8Q==", + "license": "MIT" + }, "node_modules/object-inspect": { "version": "1.13.4", "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.4.tgz", @@ -1292,6 +1312,23 @@ "node": ">= 0.4.0" } }, + "node_modules/passport-openidconnect": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/passport-openidconnect/-/passport-openidconnect-0.1.2.tgz", + "integrity": "sha512-JX3rTyW+KFZ/E9OF/IpXJPbyLO9vGzcmXB5FgSP2jfL3LGKJPdV7zUE8rWeKeeI/iueQggOeFa3onrCmhxXZTg==", + "license": "MIT", + "dependencies": { + "oauth": "0.10.x", + "passport-strategy": "1.x.x" + }, + "engines": { + "node": ">= 0.6.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/jaredhanson" + } + }, "node_modules/passport-strategy": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/passport-strategy/-/passport-strategy-1.0.0.tgz", @@ -1829,4 +1866,4 @@ } } } -} \ No newline at end of file +} diff --git a/package.json b/package.json index 49ffd27..22359fd 100644 --- a/package.json +++ b/package.json @@ -12,12 +12,14 @@ "@ffprobe-installer/ffprobe": "^2.1.2", "bcryptjs": "^3.0.3", "better-sqlite3": "^12.5.0", + "dotenv": "^17.2.3", "express": "^4.18.2", "express-session": "^1.18.2", "jsonwebtoken": "^9.0.3", "passport": "^0.7.0", "passport-jwt": "^4.0.1", "passport-local": "^1.0.0", + "passport-openidconnect": "^0.1.2", "sax": "^1.4.3", "xml2js": "^0.6.2" }, @@ -27,4 +29,4 @@ "engines": { "node": ">=18.0.0" } -} \ No newline at end of file +} diff --git a/public/index.html b/public/index.html index 5aa1269..788d2a6 100644 --- a/public/index.html +++ b/public/index.html @@ -990,6 +990,20 @@ + \ No newline at end of file diff --git a/public/login.html b/public/login.html index 9613748..d9358a3 100644 --- a/public/login.html +++ b/public/login.html @@ -195,10 +195,44 @@ + +
+ OR +
+
+
+ +