v0.0.9¶
New¶
- Users, Roles, and Grants (
woodglue.auth_store,woodglue.access):auth.dbholds Users, Role assignments, and Personal Access Tokens, and every request is authorized against Grants defined as Roles inwoodglue.yaml. Discovery (list_namespaces,list_methods,describe_method,llms.txt, method docs,openapi.json) shows only what the Caller may see. New system methods:whoami,create_token,list_tokens,revoke_token, and admin-only User management. New CLI:wgl user. Existing tokens migrate to the built-in admin Service User, andwgl tokenkeeps working. - Sign-in with Identity Providers:
auth.providerswithkind: oidc(Google, Entra ID, Auth0, Okta) orkind: github. woodglue is its own OAuth client (PKCE, state, nonce). Each provider needs admit rules (email_domains,emails,groups, oranyone: true);default_roles,group_roles, andauth.adminsare re-synced at every sign-in. A second provider with the same verified email links to the same User. - Trusted-proxy Identity Providers:
kind: trusted_proxy_jwt(Cloudflare Access, Google IAP, oauth2-proxy; checked againstjwks_url, issuer, audience, expiry) andkind: trusted_proxy_header(honored only fromtrusted_sources). - Sessions: browsers hold an HttpOnly, SameSite=Lax Session cookie (12h idle,
7 days at most), set by
/auth/login, ended by/auth/logout. The cookie isSecurewhenauth.public_urlis https. - Static UIs at
/ui/<name>/viauis.<name>inwoodglue.yaml, withspa_fallback,public, andui.defaultto choose what/opens. Opening a UI needsviewonui:<name>. - Process-backed UIs (Streamlit or any web server) via a Tornado proxy at
/ui/<name>/: woodglue supervises the process on a loopback port, relays HTTP and websockets, strips its own Session cookie, and passesX-Woodglue-Userand a Delegated Token.uis.<name>.grantsnarrows that token. App code useswoodglue.ui_support.current_user/current_client. Example inexamples/streamlit/. - Caddy as an optional edge:
GET /auth/verifyanswers Caddy'sforward_auth, andwgl caddy config <site>prints a Caddyfile that serves Static UIs from disk and proxies everything else to woodglue. wgl login --server=URLgets a Personal Access Token for a remote server through a loopback redirect with PKCE, storing it in$WOODGLUE_CONFIG_DIR/credentials.json(mode 0600).WoodglueClientuses the stored token when given none.wgl logoutrevokes and forgets it.- Run attribution: DAG runs record
initiated_by(the User for RPC calls,cli:<os user>forwgl run,schedulerfor scheduled runs), and trigger changes recordchanged_by.system.describe_initiatorsresolves User ids; the Console shows who started each run.
Changed¶
- Breaking: the Console moves from
/ui/to/console/, behindviewonui:console. It has a Tokens page and Sign out, and no longer handles tokens. - Breaking: cookie-authenticated
/rpcrequests must be same-originapplication/json(CSRF check). Bearer requests are unaffected. - Breaking:
/rpchides namespaces the Caller cannot see and returns-32003for a visible namespace without acallGrant. - Breaking:
/docs/*no longer accepts?token=. - Breaking:
woodglue.engine.activate_triggersandwoodglue.engine.TriggerActivationResultare removed; useengine.trigger_manager.activate_configured(), which returns lythonic'sTriggerActivationResultwith the same fields. - Breaking:
woodglue.token_store,woodglue.crypto,woodglue.service, andwoodglue.utils.caddyare removed. - Enabling auth without
storage.auth_dbis now a startup error instead of serving everyone as an anonymous all-Grants Caller. - Delegated Tokens and narrowed tokens cannot mint lasting credentials
(
create_token,/auth/login,/auth/cli).
Documentation¶
- README, index, and Getting Started describe Users, sign-in, the Console,
project UIs, run attribution,
wgl login, and Caddy. - New how-tos: access control, identity providers, static UIs, Streamlit UIs, and Caddy.
- Glossary and ADRs for the auth and UI design.
- Fixed namespace config and method-name examples that did not work.
- Docs deploy pins Python 3.13.
Dependencies¶
- lythonic upgraded 0.0.26 -> 0.0.28
- New:
pyjwt[crypto],strif
Decisions and tickets¶
New ADRs:
- 0001 Local Users, with woodglue as its own OIDC client and optional trusted proxy: woodglue keeps its own Users and links them to Identity Providers.
- 0002 Opaque, database-checked tokens:
tokens are looked up in
auth.dbper request so revocation is immediate. - 0003 UIs are hosted on the same origin and use an HttpOnly Session cookie: no page script can read a credential.
- 0004 Caddy is an optional edge; woodglue owns auth: Caddy adds TLS and static serving; every access decision stays in woodglue.
Closed:
-
12 Auth: Users, Roles, Grants, and Personal Access Tokens¶
-
13 Auth: HttpOnly Session cookie, CSRF checks, Console moves to /console/¶
-
14 Auth: login with OIDC providers and GitHub¶
-
15 UIs: host Static UIs at /ui/
/¶ -
16 UIs: Process-backed UIs (Streamlit) via Tornado proxy¶
-
17 Auth: trusted-proxy Identity Providers (JWT and header)¶
-
18 Caddy: optional edge with forward_auth and wgl caddy config¶
-
19 Runs: record which User caused each run¶
-
20 CLI: wgl login with loopback redirect¶