git.iko.soy/typeable/oauth2-proxy
on master help sign in
Discover signature algorithms from OIDC provider (#1662)
commitd3f428a1a6a289ff132297840ded6f7274ced10f authorJoel Speed <Joel.speed@hotmail.co.uk> dateSun 29 May 2022, 13:48 (4 years ago) parentc900c51
7 files changed+97−39
CHANGELOG.md+1 go.mod+4−5 go.sum+12−11 pkg/providers/oidc/provider.go+25−16 pkg/providers/oidc/provider_test.go+39 pkg/providers/oidc/provider_verifier.go+15−6 pkg/providers/oidc/provider_verifier_test.go+1−1
CHANGELOG.md+1
@@ -18,6 +18,7 @@ If you are using an architecture specific tag (ex: v7.2.1-arm64) you should move
1818
1919## Changes since v7.2.1
2020
21+- [#1662](https://github.com/oauth2-proxy/oauth2-proxy/pull/1662) Discover signature algorithms from OIDC provider (@JoelSpeed)
2122- [#1651](https://github.com/oauth2-proxy/oauth2-proxy/pull/1651) Updated go-lang's text, crypto and prometheus dependencies to fix reported security vulnerabilities. (@rkkris75)
2223- [#1595](https://github.com/oauth2-proxy/oauth2-proxy/pull/1595) Add optional `allowed_emails` query parameter to the `auth_request`. (@zv0n)
2324- [#1478](https://github.com/oauth2-proxy/oauth2-proxy/pull/1478) Parameterise the runtime image (@omBratteng)
go.mod+4−5
@@ -9,17 +9,16 @@ require (
99 github.com/bitly/go-simplejson v0.5.0
1010 github.com/bsm/redislock v0.7.0
1111 github.com/coreos/go-oidc/v3 v3.0.0
12− github.com/dgrijalva/jwt-go v3.2.0+incompatible
1312 github.com/fsnotify/fsnotify v1.4.9
1413 github.com/ghodss/yaml v1.0.1-0.20190212211648-25d852aebe32
1514 github.com/go-redis/redis/v8 v8.2.3
16− github.com/golang-jwt/jwt v3.2.1+incompatible
15+ github.com/golang-jwt/jwt v3.2.2+incompatible
1716 github.com/google/uuid v1.2.0
1817 github.com/gorilla/mux v1.8.0
1918 github.com/justinas/alice v1.2.0
2019 github.com/mbland/hmacauth v0.0.0-20170912233209-44256dfd4bfa
2120 github.com/mitchellh/mapstructure v1.1.2
22− github.com/oauth2-proxy/mockoidc v0.0.0-20210703044157-382d3faf2671
21+ github.com/oauth2-proxy/mockoidc v0.0.0-20220221072942-e3afe97dec43
2322 github.com/oauth2-proxy/tools/reference-gen v0.0.0-20210118095127-56ffd7384404
2423 github.com/onsi/ginkgo v1.14.1
2524 github.com/onsi/gomega v1.10.2
@@ -30,13 +29,13 @@ require (
3029 github.com/spf13/viper v1.6.3
3130 github.com/stretchr/testify v1.7.0
3231 github.com/vmihailenco/msgpack/v4 v4.3.11
33− golang.org/x/crypto v0.0.0-20220411220226-7b82a4e95df4
32+ golang.org/x/crypto v0.0.0-20220214200702-86341886e292
3433 golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2
3534 golang.org/x/oauth2 v0.0.0-20200107190931-bf48bf16ab8d
3635 golang.org/x/sync v0.0.0-20201207232520-09787c993a3a
3736 google.golang.org/api v0.20.0
3837 gopkg.in/natefinch/lumberjack.v2 v2.0.0
39− gopkg.in/square/go-jose.v2 v2.5.1
38+ gopkg.in/square/go-jose.v2 v2.6.0
4039 k8s.io/apimachinery v0.19.3
4140)
4241
go.sum+12−11
@@ -56,7 +56,6 @@ github.com/coreos/pkg v0.0.0-20180928190104-399ea9e2e55f/go.mod h1:E3G3o1h8I7cfc
5656github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
5757github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=
5858github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
59−github.com/dgrijalva/jwt-go v3.2.0+incompatible h1:7qlOGliEKZXTDg6OTjfoBKDXWrumCAMpl/TFQ4/5kLM=
6059github.com/dgrijalva/jwt-go v3.2.0+incompatible/go.mod h1:E3ru+11k8xSBh+hMPgOLZmtrrCbhqsmaPHjLKYnJCaQ=
6160github.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f h1:lO4WD4F/rVNCu3HqELle0jiPLLBs70cWOduZpkS1E78=
6261github.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f/go.mod h1:cuUVRXasLTGF7a8hSLbxyZXjz+1KgoB3wDUb6vlszIc=
@@ -98,8 +97,8 @@ github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/me
9897github.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ=
9998github.com/gogo/protobuf v1.2.1/go.mod h1:hp+jE20tsWTFYpLwKvXlhS1hjn+gTNwPg2I6zVXpSg4=
10099github.com/gogo/protobuf v1.3.1/go.mod h1:SlYgWuQ5SjCEi6WLHjHCa1yvBfUnHcTbrrZtXPKa29o=
101−github.com/golang-jwt/jwt v3.2.1+incompatible h1:73Z+4BJcrTC+KczS6WvTPvRGOp1WmfEP4Q1lOd9Z/+c=
102−github.com/golang-jwt/jwt v3.2.1+incompatible/go.mod h1:8pz2t5EyA70fFQQSrl6XZXzqecmYZeUEB8OUGHkxJ+I=
100+github.com/golang-jwt/jwt v3.2.2+incompatible h1:IfV12K8xAKAnZqdXVzCZ+TOjboZ2keLg81eXfW3O+oY=
101+github.com/golang-jwt/jwt v3.2.2+incompatible/go.mod h1:8pz2t5EyA70fFQQSrl6XZXzqecmYZeUEB8OUGHkxJ+I=
103102github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b h1:VKtxabqXZkF25pY9ekfRL6a582T4P37/31XEstQ5p58=
104103github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q=
105104github.com/golang/groupcache v0.0.0-20190129154638-5b532d6fd5ef/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc=
@@ -205,8 +204,8 @@ github.com/mwitkow/go-conntrack v0.0.0-20190716064945-2f068394615f/go.mod h1:qRW
205204github.com/mxk/go-flowrate v0.0.0-20140419014527-cca7078d478f/go.mod h1:ZdcZmHo+o7JKHSa8/e818NopupXU1YMK5fe1lsApnBw=
206205github.com/nxadm/tail v1.4.4 h1:DQuhQpB1tVlglWS2hLQ5OV6B5r8aGxSrPc5Qo6uTN78=
207206github.com/nxadm/tail v1.4.4/go.mod h1:kenIhsEOeOJmVchQTgglprH7qJGnHDVpk1VPCcaMI8A=
208−github.com/oauth2-proxy/mockoidc v0.0.0-20210703044157-382d3faf2671 h1:rCw45DEDqAy46HsVu2WZQgEqKth79c8k6HZP2uPDTls=
209−github.com/oauth2-proxy/mockoidc v0.0.0-20210703044157-382d3faf2671/go.mod h1:ejAP84CdQJiV7GcnIF0wNhbhcWsxew0qXV04CB+r+Mw=
207+github.com/oauth2-proxy/mockoidc v0.0.0-20220221072942-e3afe97dec43 h1:V9YiO92tYBmVgVcKhdxK6I4avJCefBM+0Db4WM2dank=
208+github.com/oauth2-proxy/mockoidc v0.0.0-20220221072942-e3afe97dec43/go.mod h1:rW25Kyd08Wdn3UVn0YBsDTSvReu0jqpmJKzxITPSjks=
210209github.com/oauth2-proxy/tools/reference-gen v0.0.0-20210118095127-56ffd7384404 h1:ZpzR4Ou1nhldBG/vEzauoqyaUlofaUcLkv1C/gBK8ls=
211210github.com/oauth2-proxy/tools/reference-gen v0.0.0-20210118095127-56ffd7384404/go.mod h1:YpORG8zs14vNlpXvuHYnnDvWazIRaDk02MaY8lafqdI=
212211github.com/oklog/ulid v1.3.1/go.mod h1:CirwcVhetQ6Lv90oh/F+FBtV6XMibvdAFo93nm5qn4U=
@@ -313,9 +312,8 @@ golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnf
313312golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
314313golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
315314golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
316−golang.org/x/crypto v0.0.0-20201221181555-eec23a3978ad/go.mod h1:jdWPYTVW3xRLrWPugEBEK3UY2ZEsg3UU495nc5E+M+I=
317−golang.org/x/crypto v0.0.0-20220411220226-7b82a4e95df4 h1:kUhD7nTDoI3fVd9G4ORWrbV5NY0liEs/Jg2pv5f+bBA=
318−golang.org/x/crypto v0.0.0-20220411220226-7b82a4e95df4/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4=
315+golang.org/x/crypto v0.0.0-20220214200702-86341886e292 h1:f+lwQ+GtmgoY+A2YaQxlSOnDjXcQ7ZRLWOHbC6HtRqE=
316+golang.org/x/crypto v0.0.0-20220214200702-86341886e292/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4=
319317golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
320318golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
321319golang.org/x/exp v0.0.0-20200908183739-ae8ad444f925/go.mod h1:1phAWC201xIgDyaFpmDeZkgf70Q4Pd/CNqfRtVPtxNw=
@@ -382,7 +380,6 @@ golang.org/x/sys v0.0.0-20190507160741-ecd444e8653b/go.mod h1:h1NjWce9XRLGQEsW7w
382380golang.org/x/sys v0.0.0-20190904154756-749cb33beabd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
383381golang.org/x/sys v0.0.0-20191001151750-bb3f8db39f24/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
384382golang.org/x/sys v0.0.0-20191005200804-aed5e4c7ecf9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
385−golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
386383golang.org/x/sys v0.0.0-20191120155948-bd437916bb0e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
387384golang.org/x/sys v0.0.0-20200106162015-b016eb3dc98e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
388385golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
@@ -390,15 +387,18 @@ golang.org/x/sys v0.0.0-20200519105757-fe76b779f299/go.mod h1:h1NjWce9XRLGQEsW7w
390387golang.org/x/sys v0.0.0-20200615200032-f1bc736245b1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
391388golang.org/x/sys v0.0.0-20200622214017-ed371f2e16b4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
392389golang.org/x/sys v0.0.0-20200625212154-ddb9806d33ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
390+golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
393391golang.org/x/sys v0.0.0-20210124154548-22da62e12c0c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
392+golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
394393golang.org/x/sys v0.0.0-20210603081109-ebe580a85c40/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
395394golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1 h1:SrN+KX8Art/Sf4HNj6Zcz06G7VEz+7w9tdXTPOZ7+l4=
396395golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
397−golang.org/x/term v0.0.0-20201117132131-f5c789dd3221/go.mod h1:Nr5EML6q2oocZ2LXRh80K7BxOlk5/8JxuGnuhpl+muw=
396+golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
398397golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
399398golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
400399golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk=
401400golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
401+golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
402402golang.org/x/text v0.3.7 h1:olpwvP2KacW1ZWvsR7uQhoyTYvKAupfQrRGBFM352Gk=
403403golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ=
404404golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
@@ -465,8 +465,9 @@ gopkg.in/ini.v1 v1.51.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k=
465465gopkg.in/natefinch/lumberjack.v2 v2.0.0 h1:1Lc07Kr7qY4U2YPouBjpCLxpiyxIVoxqXgkXLknAOE8=
466466gopkg.in/natefinch/lumberjack.v2 v2.0.0/go.mod h1:l0ndWWf7gzL7RNwBG7wST/UCcT4T24xpD6X8LsfU/+k=
467467gopkg.in/resty.v1 v1.12.0/go.mod h1:mDo4pnntr5jdWRML875a/NmxYqAlA73dVijT2AXvQQo=
468−gopkg.in/square/go-jose.v2 v2.5.1 h1:7odma5RETjNHWJnR32wx8t+Io4djHE1PqxCFx3iiZ2w=
469468gopkg.in/square/go-jose.v2 v2.5.1/go.mod h1:M9dMgbHiYLoDGQrXy7OpJDJWiKiU//h+vD76mk0e1AI=
469+gopkg.in/square/go-jose.v2 v2.6.0 h1:NGk74WTnPKBNUhNzQX7PYcTLUjoq7mzKk2OKbvwk2iI=
470+gopkg.in/square/go-jose.v2 v2.6.0/go.mod h1:M9dMgbHiYLoDGQrXy7OpJDJWiKiU//h+vD76mk0e1AI=
470471gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7 h1:uRGJdciOHaEIrze2W8Q3AKkepLTh2hOroT7a+7czfdQ=
471472gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw=
472473gopkg.in/yaml.v2 v2.0.0-20170812160011-eb3733d160e7/go.mod h1:JAlM8MvJe8wmxCU4Bli9HhUf9+ttbYbLASfIpnQbh74=
pkg/providers/oidc/provider.go+25−16
@@ -11,12 +11,13 @@ import (
1111
1212// providerJSON resresents the information we need from an OIDC discovery
1313type providerJSON struct {
14− Issuer string `json:"issuer"`
15− AuthURL string `json:"authorization_endpoint"`
16− TokenURL string `json:"token_endpoint"`
17− JWKsURL string `json:"jwks_uri"`
18− UserInfoURL string `json:"userinfo_endpoint"`
19− CodeChallengeAlgs []string `json:"code_challenge_methods_supported"`
14+ Issuer string `json:"issuer"`
15+ AuthURL string `json:"authorization_endpoint"`
16+ TokenURL string `json:"token_endpoint"`
17+ JWKsURL string `json:"jwks_uri"`
18+ UserInfoURL string `json:"userinfo_endpoint"`
19+ CodeChallengeAlgs []string `json:"code_challenge_methods_supported"`
20+ SupportedSigningAlgs []string `json:"id_token_signing_alg_values_supported"`
2021}
2122
2223// Endpoints represents the endpoints discovered as part of the OIDC discovery process
@@ -39,6 +40,7 @@ type PKCE struct {
3940type DiscoveryProvider interface {
4041 Endpoints() Endpoints
4142 PKCE() PKCE
43+ SupportedSigningAlgs() []string
4244}
4345
4446// NewProvider allows a user to perform an OIDC discovery and returns the DiscoveryProvider.
@@ -63,21 +65,23 @@ func NewProvider(ctx context.Context, issuerURL string, skipIssuerVerification b
6365 }
6466
6567 return &discoveryProvider{
66− authURL: p.AuthURL,
67− tokenURL: p.TokenURL,
68− jwksURL: p.JWKsURL,
69− userInfoURL: p.UserInfoURL,
70− codeChallengeAlgs: p.CodeChallengeAlgs,
68+ authURL: p.AuthURL,
69+ tokenURL: p.TokenURL,
70+ jwksURL: p.JWKsURL,
71+ userInfoURL: p.UserInfoURL,
72+ codeChallengeAlgs: p.CodeChallengeAlgs,
73+ supportedSigningAlgs: p.SupportedSigningAlgs,
7174 }, nil
7275}
7376
7477// discoveryProvider holds the discovered endpoints
7578type discoveryProvider struct {
76− authURL string
77− tokenURL string
78− jwksURL string
79− userInfoURL string
80− codeChallengeAlgs []string
79+ authURL string
80+ tokenURL string
81+ jwksURL string
82+ userInfoURL string
83+ codeChallengeAlgs []string
84+ supportedSigningAlgs []string
8185}
8286
8387// Endpoints returns the discovered endpoints needed for an authentication provider.
@@ -96,3 +100,8 @@ func (p *discoveryProvider) PKCE() PKCE {
96100 CodeChallengeAlgs: p.codeChallengeAlgs,
97101 }
98102}
103+
104+// SupportedSigningAlgs returns the discovered provider signing algorithms.
105+func (p *discoveryProvider) SupportedSigningAlgs() []string {
106+ return p.supportedSigningAlgs
107+}
pkg/providers/oidc/provider_test.go+39
@@ -103,6 +103,25 @@ var _ = Describe("Provider", func() {
103103
104104 Expect(provider.PKCE().CodeChallengeAlgs).To(ConsistOf("S256", "plain"))
105105 })
106+
107+ It("with signing algorithms supported on the provider, should populate signature information", func() {
108+ m, err := mockoidc.NewServer(nil)
109+ Expect(err).ToNot(HaveOccurred())
110+ m.AddMiddleware(newSigningAlgsIssuerMiddleware(m))
111+
112+ ln, err := net.Listen("tcp", "127.0.0.1:0")
113+ Expect(err).ToNot(HaveOccurred())
114+
115+ Expect(m.Start(ln, nil)).To(Succeed())
116+ defer func() {
117+ Expect(m.Shutdown()).To(Succeed())
118+ }()
119+
120+ provider, err := NewProvider(context.Background(), m.Issuer(), false)
121+ Expect(err).ToNot(HaveOccurred())
122+
123+ Expect(provider.SupportedSigningAlgs()).To(ConsistOf("RS256", "HS256"))
124+ })
106125})
107126
108127func newInvalidIssuerMiddleware(m *mockoidc.MockOIDC) func(http.Handler) http.Handler {
@@ -144,6 +163,26 @@ func newCodeChallengeIssuerMiddleware(m *mockoidc.MockOIDC) func(http.Handler) h
144163 }
145164}
146165
166+func newSigningAlgsIssuerMiddleware(m *mockoidc.MockOIDC) func(http.Handler) http.Handler {
167+ return func(next http.Handler) http.Handler {
168+ return http.HandlerFunc(func(rw http.ResponseWriter, req *http.Request) {
169+ p := providerJSON{
170+ Issuer: m.Issuer(),
171+ AuthURL: m.AuthorizationEndpoint(),
172+ TokenURL: m.TokenEndpoint(),
173+ JWKsURL: m.JWKSEndpoint(),
174+ UserInfoURL: m.UserinfoEndpoint(),
175+ SupportedSigningAlgs: []string{"RS256", "HS256"},
176+ }
177+ data, err := json.Marshal(p)
178+ if err != nil {
179+ rw.WriteHeader(500)
180+ }
181+ rw.Write(data)
182+ })
183+ }
184+}
185+
147186func newBadRequestMiddleware() func(http.Handler) http.Handler {
148187 return func(next http.Handler) http.Handler {
149188 return http.HandlerFunc(func(rw http.ResponseWriter, req *http.Request) {
pkg/providers/oidc/provider_verifier.go+15−6
@@ -43,6 +43,10 @@ type ProviderVerifierOptions struct {
4343 // SkipIssuerVerification skips verification of ID token issuers.
4444 // When false, ID Token Issuers must match the OIDC discovery URL.
4545 SkipIssuerVerification bool
46+
47+ // SupportedSigningAlgs is the list of signature algorithms supported by the
48+ // provider.
49+ SupportedSigningAlgs []string
4650}
4751
4852// validate checks that the required options are present before attempting to create
@@ -76,9 +80,10 @@ func (p ProviderVerifierOptions) toVerificationOptions() IDTokenVerificationOpti
7680// toOIDCConfig returns an oidc.Config based on the configured options.
7781func (p ProviderVerifierOptions) toOIDCConfig() *oidc.Config {
7882 return &oidc.Config{
79− ClientID: p.ClientID,
80− SkipIssuerCheck: p.SkipIssuerVerification,
81− SkipClientIDCheck: true,
83+ ClientID: p.ClientID,
84+ SkipIssuerCheck: p.SkipIssuerVerification,
85+ SkipClientIDCheck: true,
86+ SupportedSigningAlgs: p.SupportedSigningAlgs,
8287 }
8388}
8489
@@ -112,21 +117,25 @@ type verifierBuilder func(*oidc.Config) *oidc.IDTokenVerifier
112117func getVerifierBuilder(ctx context.Context, opts ProviderVerifierOptions) (verifierBuilder, DiscoveryProvider, error) {
113118 if opts.SkipDiscovery {
114119 // Instead of discovering the JWKs URK, it needs to be specified in the opts already
115− return newVerifierBuilder(ctx, opts.IssuerURL, opts.JWKsURL), nil, nil
120+ return newVerifierBuilder(ctx, opts.IssuerURL, opts.JWKsURL, opts.SupportedSigningAlgs), nil, nil
116121 }
117122
118123 provider, err := NewProvider(ctx, opts.IssuerURL, opts.SkipIssuerVerification)
119124 if err != nil {
120125 return nil, nil, fmt.Errorf("error while discovery OIDC configuration: %v", err)
121126 }
122− verifierBuilder := newVerifierBuilder(ctx, opts.IssuerURL, provider.Endpoints().JWKsURL)
127+ verifierBuilder := newVerifierBuilder(ctx, opts.IssuerURL, provider.Endpoints().JWKsURL, provider.SupportedSigningAlgs())
123128 return verifierBuilder, provider, nil
124129}
125130
126131// newVerifierBuilder returns a function to create a IDToken verifier from an OIDC config.
127−func newVerifierBuilder(ctx context.Context, issuerURL, jwksURL string) verifierBuilder {
132+func newVerifierBuilder(ctx context.Context, issuerURL, jwksURL string, supportedSigningAlgs []string) verifierBuilder {
128133 keySet := oidc.NewRemoteKeySet(ctx, jwksURL)
129134 return func(oidcConfig *oidc.Config) *oidc.IDTokenVerifier {
135+ if len(supportedSigningAlgs) > 0 {
136+ oidcConfig.SupportedSigningAlgs = supportedSigningAlgs
137+ }
138+
130139 return oidc.NewVerifier(issuerURL, keySet, oidcConfig)
131140 }
132141}
pkg/providers/oidc/provider_verifier_test.go+1−1
@@ -4,7 +4,7 @@ import (
44 "context"
55 "time"
66
7− "github.com/dgrijalva/jwt-go"
7+ "github.com/golang-jwt/jwt"
88 "github.com/oauth2-proxy/mockoidc"
99 . "github.com/onsi/ginkgo"
1010 . "github.com/onsi/ginkgo/extensions/table"