Skip to content

Commit d2c84ba

Browse files
feat: enhance OIDC support by validating UserInfo sub claim and parsing scopes from config
1 parent 8b76b8d commit d2c84ba

2 files changed

Lines changed: 9 additions & 4 deletions

File tree

api/v1/server/handlers/users/oidc_oauth_callback.go

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -181,6 +181,10 @@ func getOIDCClaimsFromToken(ctx context.Context, config *server.ServerConfig, to
181181
if uiErr == nil {
182182
uiClaims := &oidcClaims{}
183183
if err := userInfo.Claims(uiClaims); err == nil {
184+
// Per OIDC spec, the UserInfo sub must match the ID token sub.
185+
if uiClaims.Sub != "" && claims.Sub != "" && uiClaims.Sub != claims.Sub {
186+
return nil, fmt.Errorf("OIDC UserInfo sub claim (%s) does not match ID token sub claim (%s)", uiClaims.Sub, claims.Sub)
187+
}
184188
if claims.Email == "" {
185189
claims.Email = uiClaims.Email
186190
}

pkg/config/loader/loader.go

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -622,6 +622,11 @@ func createControllerLayer(dc *database.Layer, cf *server.ServerConfigFile, vers
622622
}
623623

624624
if cf.Auth.OIDC.Enabled {
625+
// Parse ScopesString before building OIDCOAuthConfig so the env var is used.
626+
if cf.Auth.OIDC.ScopesString != "" {
627+
cf.Auth.OIDC.Scopes = getStrArr(cf.Auth.OIDC.ScopesString)
628+
}
629+
625630
if cf.Auth.OIDC.ClientID == "" {
626631
return nil, nil, fmt.Errorf("oidc client id is required")
627632
}
@@ -820,10 +825,6 @@ func createControllerLayer(dc *database.Layer, cf *server.ServerConfigFile, vers
820825
cf.Runtime.AllowedOrigins = getStrArr(cf.Runtime.AllowedOriginsString)
821826
}
822827

823-
if cf.Auth.OIDC.ScopesString != "" {
824-
cf.Auth.OIDC.Scopes = getStrArr(cf.Auth.OIDC.ScopesString)
825-
}
826-
827828
if cf.Runtime.Monitoring.TLSRootCAFile == "" {
828829
cf.Runtime.Monitoring.TLSRootCAFile = cf.TLS.TLSRootCAFile
829830
}

0 commit comments

Comments
 (0)