doxa-maps/deployment/cloud/pb-oidc.mjs
Doxa Maps 71d4c1817c
Some checks are pending
Deploy to GitHub Pages / build (push) Waiting to run
Deploy to GitHub Pages / deploy (push) Blocked by required conditions
Cloud container: pb-dev as the team's shared PocketBase, signed in through the team OIDC provider
Laptops reach pb-dev's API without the site sign-in; PocketBase signs people in itself through the same
OIDC provider (its own client), members of OIDC_ALLOWED_GROUPS only, password sign-in off. The group check
is ONE hook baked into the image and pinned by SHA-256; hooks from the pulled repo still never run. The
dashboard, _superusers and system collections stay behind the site sign-in for admins. It fails closed:
without the baked gate or a working OIDC setup, /pb/ stays behind the site sign-in as before.
2026-09-27 23:41:53 +00:00

41 lines
2.1 KiB
JavaScript

// pb-oidc.mjs — make the team PocketBase (pb-dev) sign people in through the team's OIDC provider.
// Run by entry.sh at every start, against PocketBase on localhost, as the superuser (env, never printed).
// users: sign-in ONLY through OIDC (password sign-in off); the group check is the image's baked hook.
// The client secret comes from the environment; nothing here, or in PocketBase's data, is in git.
const env = process.env
const PB = env.PB_LOCAL_URL || 'http://127.0.0.1:8090'
const need = (k) => env[k] || (console.error(`[pb-oidc] ${k} is not set: team sign-in NOT configured`), process.exit(1))
const call = async (method, path, body, token) => {
const r = await fetch(PB + path, { method, headers: { 'Content-Type': 'application/json', ...(token ? { Authorization: token } : {}) }, body: body && JSON.stringify(body) })
const j = await r.json().catch(() => ({}))
if (!r.ok) throw new Error(`${method} ${path}: ${r.status} ${j.message || ''}`)
return j
}
const issuer = need('OIDC_ISSUER').replace(/\/$/, '')
const disc = env.PB_OIDC_DISCOVERY_JSON ? JSON.parse(env.PB_OIDC_DISCOVERY_JSON)
: await (await fetch(issuer + '/.well-known/openid-configuration')).json()
const { token } = await call('POST', '/api/collections/_superusers/auth-with-password',
{ identity: need('PB_SUPERUSER_EMAIL'), password: need('PB_SUPERUSER_PASSWORD') })
await call('PATCH', '/api/collections/users', {
passwordAuth: { enabled: false, identityFields: ['email'] },
oauth2: {
enabled: true,
mappedFields: { id: '', name: 'name', username: '', avatarURL: '' },
providers: [{
name: 'oidc',
displayName: env.OIDC_DISPLAY_NAME || 'Team sign-in',
clientId: env.PB_OIDC_CLIENT_ID || 'dx-maps-pb-dev',
clientSecret: need('PB_OIDC_CLIENT_SECRET'),
authURL: disc.authorization_endpoint,
tokenURL: disc.token_endpoint,
userInfoURL: disc.userinfo_endpoint,
pkce: true,
extra: {},
}],
},
}, token)
if (env.PB_APP_URL) await call('PATCH', '/api/settings', { meta: { appURL: env.PB_APP_URL } }, token)
console.log(`[pb-oidc] users sign in through ${issuer} only (password sign-in off)`)