Research: candidate OIDC providers and non-interactive token flows for CI publishers #33
Labels
No labels
Compat/Breaking
Crazy Idea
Kind/Bug
Kind/Documentation
Kind/Enhancement
Kind/Feature
Kind/Security
Kind/Testing
Priority/Critical
Priority/High
Priority/Low
Priority/Medium
Reviewed/Confirmed
Reviewed/Duplicate
Reviewed/Invalid
Reviewed/Won't Fix
Status/Abandoned
Status/Blocked
Status/Need More Info
needs-info
needs-triage
ready-for-agent
ready-for-human
wayfinder:grilling
wayfinder:map
wayfinder:prototype
wayfinder:research
wayfinder:task
wontfix
No milestone
No project
No assignees
1 participant
Notifications
Due date
No due date set.
Blocks
Reference
OpenIndiana/ips#33
Loading…
Reference in a new issue
No description provided.
Delete branch "%!s()"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Part of #24
Question
Survey, from primary documentation: Forgejo's OAuth2/OIDC provider (does it issue JWT access tokens or opaque ones? JWKS endpoint? client-credentials or only authorization-code? custom claims?), Keycloak, Authentik and Zitadel (client-credentials support, custom role/group claims, device-code flow), and Forgejo Actions OIDC/ID tokens. For each, state how a Solstice CI job would obtain a bearer token non-interactively and how a human maintainer would from a CLI.
Capture as
docs/research/oidc-providers.md, with a recommendation table. This feeds the provider decision.Links
Resolution
Findings, sources cited in docs/research/oidc-providers.md:
/.well-known/openid-configuration+/login/oauth/keys(RS256), but onlyauthorization_codeandrefresh_tokengrants; no client_credentials, no device flow (routers/web/auth/oauth.go). Access tokens are JWTs carrying onlygnt/tt/exp/iat(no iss/aud/sub), so pkg6depotd cannot validate them; ID tokens do carry iss/aud/sub plusgroups(org, org:team). Docs warn OAuth2 scopes are "not yet implemented" (token = full user rights).enable-openid-connect: true, curl$ACTIONS_ID_TOKEN_REQUEST_URL&audience=..., issuerhttps://code.aopc.cloud/api/actions, JWKS/api/actions/.well-known/keys(verified live), RS256, 1 h lifetime, claimsrepository,ref,ref_protected,event_name,actor,sha, etc.; disabled for fork PRs.profilescope emitsgroups, and federatedclient_credentialsaccepts Forgejo Actions ID tokens as client assertions. ZITADEL: opaque tokens by default (JWT opt-in), roles under urn-prefixed claims, extra login container + immutable masterkey, keys rotate "without any prior notice".Recommendation: (1) CI publishing: trust the Forgejo Actions OIDC issuer directly, secretless, gating on
repository/refclaims; pkg6depotd needs multi-issuer support with per-issueraudand a claim-to-role policy. Verify the Solstice runner injectsACTIONS_ID_TOKEN_REQUEST_*. (2) Humans: Forgejo OAuth2 auth-code+PKCE public client (loopback redirect), presenting the ID token withgroupsmapped to roles. (3) Only if a real IdP is later needed, pick authentik: lightest footprint and it federates the Forgejo Actions tokens natively.Full findings: docs/research/oidc-providers.md on branch
research/oidc-providers(research branch, not merged; cherry-pick the file when the decision it feeds is recorded).