oidc: one verifier per issuer, because IdPs mint one per application
Authentik derives the issuer from the application slug, so two applications mean two issuers - and a token's `iss` must match whoever signed it. A single pinned issuer could therefore only ever serve one of the two clients. So there is a verifier per issuer, and each accepts only the client belonging to it. That is tighter than the previous arrangement as well as more general: a token minted for the phone cannot be replayed at the admin login, and vice versa, because they arrive at different verifiers with different audiences. ECHOLOT_OIDC_APP_ISSUER is optional - empty means both clients share ECHOLOT_OIDC_ISSUER, which is what IdPs with one global issuer do. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
co-authored by
Claude Fable 5
parent
5d7f59a66a
commit
c7750fbf0b
@@ -59,8 +59,12 @@ type Server struct {
|
||||
// Granted server->client sends (spec §5). Both consume an asymmetric grant.
|
||||
DownTrain func(sess *session.Session, g *session.Grant, count, sizeBytes, intervalUs int) (int, error)
|
||||
BigSend func(sess *session.Session, g *session.Grant, sizes []int, df bool) ([]dataplane.BigSendResult, error)
|
||||
// OIDC verifies ID tokens when the operator has configured an issuer (may be nil).
|
||||
// OIDC verifies ID tokens presented by the *app* (may be nil).
|
||||
OIDC *oidc.Verifier
|
||||
// AdminOIDC verifies tokens from the admin UI's own client. Separate because an IdP may
|
||||
// give each application its own issuer — Authentik derives it from the application slug —
|
||||
// and a verifier pins exactly one issuer and the clients belonging to it.
|
||||
AdminOIDC *oidc.Verifier
|
||||
// Runs stores uploaded measurement documents (may be nil: uploads unsupported).
|
||||
Runs *runs.Store
|
||||
// FragSend emits one datagram as hand-built IP fragments in a chosen order (may be nil:
|
||||
|
||||
Reference in New Issue
Block a user