From 4c390d45c7f223aed0e95554a6cf00f8d0b7fccb Mon Sep 17 00:00:00 2001 From: gator Date: Sat, 15 Aug 2026 00:56:15 +0000 Subject: [PATCH] SSO: gate uses shared app.promptpcb.ai accounts --- assets/auth.js | 39 ++++++++++++++++++++------------------- 1 file changed, 20 insertions(+), 19 deletions(-) diff --git a/assets/auth.js b/assets/auth.js index 62719a1..ce5ba86 100644 --- a/assets/auth.js +++ b/assets/auth.js @@ -1,18 +1,17 @@ -// auth.js — gates the whole site behind a PromptPCB account (Corben tenant auth for this site). -// Nothing loads until you're signed in; the catalog + file URLs come only from the authed function. +// auth.js — gates the whole site behind your PromptPCB account (SHARED with app.promptpcb.ai via its +// SSO bridge). Nothing loads until you're signed in; the catalog + file URLs come only from the authed +// Corben function, which itself verifies your PromptPCB session. (function () { - var API = 'https://api.corben.world'; - var SITE = '6ab5ec79-8b91-453d-aacc-5be76f9271d1'; // this site IS the tenant + var CORBEN = 'https://api.corben.world'; // Corben functions (catalog/autofill/submit) + var AUTH = 'https://app.promptpcb.ai'; // shared PromptPCB accounts live here var FN_CATALOG = '0f3cd09e-81ce-43f4-88e7-cde3d91f122e'; var TK_CATALOG = '687d2466cea418815433b60946d6742a'; var LS = 'ppcb_token'; window.PPCB = { token: null, user: null }; - window.ppcbReady = function (fn) { - if (window.PPCB.token) fn(); else addEventListener('ppcb:auth', function () { fn(); }, { once: true }); - }; + window.ppcbReady = function (fn) { if (window.PPCB.token) fn(); else addEventListener('ppcb:auth', function () { fn(); }, { once: true }); }; window.getCatalog = async function () { - var r = await fetch(API + '/functions/' + FN_CATALOG + '/invoke?token=' + TK_CATALOG, { + var r = await fetch(CORBEN + '/functions/' + FN_CATALOG + '/invoke?token=' + TK_CATALOG, { method: 'POST', headers: { 'Content-Type': 'application/json', 'Authorization': 'Bearer ' + window.PPCB.token }, body: '{}' }); if (r.status === 401) { logout(); throw new Error('session expired'); } var d = await r.json(); return d.parts || []; @@ -23,7 +22,7 @@ window.PPCB.user = user; document.documentElement.classList.add('ppcb-authed'); var g = document.getElementById('ppcb-gate'); if (g) g.style.display = 'none'; var c = document.querySelector('.credits'); - if (c) c.innerHTML = '◆ ' + (user.display_name || user.email.split('@')[0]) + ' · sign out'; + if (c) c.innerHTML = '◆ ' + (user.name || user.email.split('@')[0]) + ' · sign out'; var lo = document.getElementById('ppcb-logout'); if (lo) lo.onclick = function (e) { e.preventDefault(); logout(); }; dispatchEvent(new Event('ppcb:auth')); } @@ -34,9 +33,10 @@ var t = localStorage.getItem(LS); if (!t) return gate(); try { - var r = await fetch(API + '/auth/tenant/me', { headers: { Authorization: 'Bearer ' + t } }); + var r = await fetch(AUTH + '/api/auth/sso/verify', { headers: { Authorization: 'Bearer ' + t } }); if (!r.ok) return gate(); - var u = await r.json(); window.PPCB.token = t; authed(u); + var u = await r.json(); if (!u.valid) return gate(); + window.PPCB.token = t; authed({ email: u.email, name: u.name }); } catch (e) { gate(); } } @@ -48,13 +48,14 @@ '
' + '
PromptPCB / parts
' + '
Sign in to the part library
' + - '
One PromptPCB account. Every part—real specs, 3D, SPICE—once you’re in.
' + + '
Your PromptPCB account — the same one you use at app.promptpcb.ai. Real specs, 3D, SPICE for every part, once you’re in.
' + '
' + - '' + + '' + '' + '' + '' + '
' + + '
One account across all of PromptPCB · app.promptpcb.ai ↗
' + '
'; document.body.appendChild(el); var mode = 'login'; @@ -71,14 +72,14 @@ async function go() { var email = document.getElementById('g-email').value.trim(), pass = document.getElementById('g-pass').value; var msg = document.getElementById('g-msg'); msg.style.color = 'var(--dim)'; msg.innerHTML = ' …'; - var path = mode === 'signup' ? '/auth/tenant/register' : '/auth/tenant/login'; - var body = { tenant_id: SITE, email: email, password: pass }; - if (mode === 'signup') body.display_name = document.getElementById('g-name').value.trim(); + var path = mode === 'signup' ? '/api/auth/signup' : '/api/auth/login'; + var body = { email: email, password: pass }; + if (mode === 'signup') body.name = document.getElementById('g-name').value.trim(); try { - var r = await fetch(API + path, { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify(body) }); + var r = await fetch(AUTH + path, { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify(body) }); var d = await r.json(); - if (!r.ok) { msg.style.color = 'var(--bad,#ff6b6b)'; msg.textContent = d.error || 'failed'; return; } - localStorage.setItem(LS, d.token); window.PPCB.token = d.token; authed(d.user); + if (!r.ok || !d.token) { msg.style.color = '#ff6b6b'; msg.textContent = d.error || 'failed'; return; } + localStorage.setItem(LS, d.token); window.PPCB.token = d.token; authed({ email: d.user.email, name: d.user.name }); } catch (e) { msg.style.color = '#ff6b6b'; msg.textContent = 'network error'; } } }