mirror of
https://github.com/oauth2-proxy/oauth2-proxy.git
synced 2026-10-18 13:18:26 +02:00
chore: Updated go-jwt to v5
This commit is contained in:
@@ -58,8 +58,6 @@ type ErrorPageOpts struct {
|
||||
func (e *errorPageWriter) WriteErrorPage(rw http.ResponseWriter, opts ErrorPageOpts) {
|
||||
rw.WriteHeader(opts.Status)
|
||||
|
||||
// We allow unescaped template.HTML since it is user configured options
|
||||
/* #nosec G203 */
|
||||
data := struct {
|
||||
Title string
|
||||
Message string
|
||||
@@ -76,7 +74,7 @@ func (e *errorPageWriter) WriteErrorPage(rw http.ResponseWriter, opts ErrorPageO
|
||||
StatusCode: opts.Status,
|
||||
Redirect: opts.RedirectURL,
|
||||
RequestID: opts.RequestID,
|
||||
Footer: template.HTML(e.footer),
|
||||
Footer: template.HTML(e.footer), // #nosec G203 -- We allow unescaped template.HTML since it is user configured options
|
||||
Version: e.version,
|
||||
}
|
||||
|
||||
|
||||
@@ -55,8 +55,6 @@ type signInPageWriter struct {
|
||||
// WriteSignInPage writes the sign-in page to the given response writer.
|
||||
// It uses the redirectURL to be able to set the final destination for the user post login.
|
||||
func (s *signInPageWriter) WriteSignInPage(rw http.ResponseWriter, req *http.Request, redirectURL string, statusCode int) {
|
||||
// We allow unescaped template.HTML since it is user configured options
|
||||
/* #nosec G203 */
|
||||
t := struct {
|
||||
ProviderName string
|
||||
SignInMessage template.HTML
|
||||
@@ -69,14 +67,14 @@ func (s *signInPageWriter) WriteSignInPage(rw http.ResponseWriter, req *http.Req
|
||||
LogoData template.HTML
|
||||
}{
|
||||
ProviderName: s.providerName,
|
||||
SignInMessage: template.HTML(s.signInMessage),
|
||||
SignInMessage: template.HTML(s.signInMessage), // #nosec G203 -- We allow unescaped template.HTML since it is user configured options
|
||||
StatusCode: statusCode,
|
||||
CustomLogin: s.displayLoginForm,
|
||||
Redirect: redirectURL,
|
||||
Version: s.version,
|
||||
ProxyPrefix: s.proxyPrefix,
|
||||
Footer: template.HTML(s.footer),
|
||||
LogoData: template.HTML(s.logoData),
|
||||
Footer: template.HTML(s.footer), // #nosec G203 -- We allow unescaped template.HTML since it is user configured options
|
||||
LogoData: template.HTML(s.logoData), // #nosec G203 -- We allow unescaped template.HTML since it is user configured options
|
||||
}
|
||||
|
||||
err := s.template.Execute(rw, t)
|
||||
|
||||
@@ -72,7 +72,7 @@ func newSecretInjector(name string, source *options.SecretSource) (valueInjector
|
||||
return nil, fmt.Errorf("error getting secret value: %v", err)
|
||||
}
|
||||
|
||||
return newInjectorFunc(func(header http.Header, session *sessionsapi.SessionState) {
|
||||
return newInjectorFunc(func(header http.Header, _ *sessionsapi.SessionState) {
|
||||
header.Add(name, string(value))
|
||||
}), nil
|
||||
}
|
||||
|
||||
@@ -114,9 +114,8 @@ func (j *jwtSessionLoader) getBasicToken(token string) (string, error) {
|
||||
|
||||
// check user, user+password, or just password for a token
|
||||
if j.jwtRegex.MatchString(user) {
|
||||
// Support blank passwords or magic `x-oauth-basic` passwords - nothing else
|
||||
/* #nosec G101 */
|
||||
if password == "" || password == "x-oauth-basic" {
|
||||
if password == "x-oauth-basic" || // #nosec G101 -- Support blank passwords or magic `x-oauth-basic` passwords, nothing else
|
||||
password == "" {
|
||||
return user, nil
|
||||
}
|
||||
} else if j.jwtRegex.MatchString(password) {
|
||||
|
||||
@@ -14,7 +14,7 @@ import (
|
||||
"time"
|
||||
|
||||
"github.com/coreos/go-oidc/v3/oidc"
|
||||
"github.com/golang-jwt/jwt"
|
||||
"github.com/golang-jwt/jwt/v5"
|
||||
middlewareapi "github.com/oauth2-proxy/oauth2-proxy/v7/pkg/apis/middleware"
|
||||
sessionsapi "github.com/oauth2-proxy/oauth2-proxy/v7/pkg/apis/sessions"
|
||||
. "github.com/onsi/ginkgo"
|
||||
@@ -401,7 +401,7 @@ Nnc3a3lGVWFCNUMxQnNJcnJMTWxka1dFaHluYmI4Ongtb2F1dGgtYmFzaWM=`
|
||||
type idTokenClaims struct {
|
||||
Email string `json:"email,omitempty"`
|
||||
Verified *bool `json:"email_verified,omitempty"`
|
||||
jwt.StandardClaims
|
||||
jwt.RegisteredClaims
|
||||
}
|
||||
|
||||
type tokenToSessionTableInput struct {
|
||||
@@ -451,13 +451,12 @@ Nnc3a3lGVWFCNUMxQnNJcnJMTWxka1dFaHluYmI4Ongtb2F1dGgtYmFzaWM=`
|
||||
},
|
||||
Entry("with no email", tokenToSessionTableInput{
|
||||
idToken: idTokenClaims{
|
||||
StandardClaims: jwt.StandardClaims{
|
||||
Audience: "asdf1234",
|
||||
ExpiresAt: expiresFuture.Unix(),
|
||||
Id: "id-some-id",
|
||||
IssuedAt: time.Now().Unix(),
|
||||
RegisteredClaims: jwt.RegisteredClaims{
|
||||
Audience: jwt.ClaimStrings{"asdf1234"},
|
||||
ExpiresAt: jwt.NewNumericDate(expiresFuture),
|
||||
IssuedAt: jwt.NewNumericDate(time.Now()),
|
||||
Issuer: "https://issuer.example.com",
|
||||
NotBefore: 0,
|
||||
NotBefore: jwt.NewNumericDate(time.Time{}),
|
||||
Subject: "123456789",
|
||||
},
|
||||
},
|
||||
@@ -468,13 +467,12 @@ Nnc3a3lGVWFCNUMxQnNJcnJMTWxka1dFaHluYmI4Ongtb2F1dGgtYmFzaWM=`
|
||||
}),
|
||||
Entry("with a verified email", tokenToSessionTableInput{
|
||||
idToken: idTokenClaims{
|
||||
StandardClaims: jwt.StandardClaims{
|
||||
Audience: "asdf1234",
|
||||
ExpiresAt: expiresFuture.Unix(),
|
||||
Id: "id-some-id",
|
||||
IssuedAt: time.Now().Unix(),
|
||||
RegisteredClaims: jwt.RegisteredClaims{
|
||||
Audience: jwt.ClaimStrings{"asdf1234"},
|
||||
ExpiresAt: jwt.NewNumericDate(expiresFuture),
|
||||
IssuedAt: jwt.NewNumericDate(time.Now()),
|
||||
Issuer: "https://issuer.example.com",
|
||||
NotBefore: 0,
|
||||
NotBefore: jwt.NewNumericDate(time.Time{}),
|
||||
Subject: "123456789",
|
||||
},
|
||||
Email: "foo@example.com",
|
||||
@@ -487,13 +485,12 @@ Nnc3a3lGVWFCNUMxQnNJcnJMTWxka1dFaHluYmI4Ongtb2F1dGgtYmFzaWM=`
|
||||
}),
|
||||
Entry("with a non-verified email", tokenToSessionTableInput{
|
||||
idToken: idTokenClaims{
|
||||
StandardClaims: jwt.StandardClaims{
|
||||
Audience: "asdf1234",
|
||||
ExpiresAt: expiresFuture.Unix(),
|
||||
Id: "id-some-id",
|
||||
IssuedAt: time.Now().Unix(),
|
||||
RegisteredClaims: jwt.RegisteredClaims{
|
||||
Audience: jwt.ClaimStrings{"asdf1234"},
|
||||
ExpiresAt: jwt.NewNumericDate(expiresFuture),
|
||||
IssuedAt: jwt.NewNumericDate(time.Now()),
|
||||
Issuer: "https://issuer.example.com",
|
||||
NotBefore: 0,
|
||||
NotBefore: jwt.NewNumericDate(time.Time{}),
|
||||
Subject: "123456789",
|
||||
},
|
||||
Email: "foo@example.com",
|
||||
|
||||
@@ -4,7 +4,7 @@ import (
|
||||
"context"
|
||||
"time"
|
||||
|
||||
"github.com/golang-jwt/jwt"
|
||||
"github.com/golang-jwt/jwt/v5"
|
||||
"github.com/oauth2-proxy/mockoidc"
|
||||
. "github.com/onsi/ginkgo"
|
||||
. "github.com/onsi/ginkgo/extensions/table"
|
||||
@@ -90,7 +90,7 @@ var _ = Describe("ProviderVerifier", func() {
|
||||
|
||||
type verifierTableInput struct {
|
||||
modifyOpts func(*ProviderVerifierOptions)
|
||||
modifyClaims func(*jwt.StandardClaims)
|
||||
modifyClaims func(claims *jwt.RegisteredClaims)
|
||||
expectedError string
|
||||
}
|
||||
|
||||
@@ -109,11 +109,11 @@ var _ = Describe("ProviderVerifier", func() {
|
||||
Expect(err).ToNot(HaveOccurred())
|
||||
|
||||
now := time.Now()
|
||||
claims := jwt.StandardClaims{
|
||||
Audience: m.Config().ClientID,
|
||||
claims := jwt.RegisteredClaims{
|
||||
Audience: jwt.ClaimStrings{m.Config().ClientID},
|
||||
Issuer: m.Issuer(),
|
||||
ExpiresAt: now.Add(1 * time.Hour).Unix(),
|
||||
IssuedAt: now.Unix(),
|
||||
ExpiresAt: jwt.NewNumericDate(now.Add(1 * time.Hour)),
|
||||
IssuedAt: jwt.NewNumericDate(now),
|
||||
Subject: "user",
|
||||
}
|
||||
if in.modifyClaims != nil {
|
||||
@@ -136,8 +136,8 @@ var _ = Describe("ProviderVerifier", func() {
|
||||
},
|
||||
Entry("with the default opts and claims", &verifierTableInput{}),
|
||||
Entry("when the audience is mismatched", &verifierTableInput{
|
||||
modifyClaims: func(j *jwt.StandardClaims) {
|
||||
j.Audience = "OtherClient"
|
||||
modifyClaims: func(j *jwt.RegisteredClaims) {
|
||||
j.Audience = jwt.ClaimStrings{"OtherClient"}
|
||||
},
|
||||
expectedError: "audience from claim aud with value [OtherClient] does not match with any of allowed audiences",
|
||||
}),
|
||||
@@ -145,12 +145,12 @@ var _ = Describe("ProviderVerifier", func() {
|
||||
modifyOpts: func(p *ProviderVerifierOptions) {
|
||||
p.ExtraAudiences = []string{"ExtraIssuer"}
|
||||
},
|
||||
modifyClaims: func(j *jwt.StandardClaims) {
|
||||
j.Audience = "ExtraIssuer"
|
||||
modifyClaims: func(j *jwt.RegisteredClaims) {
|
||||
j.Audience = jwt.ClaimStrings{"ExtraIssuer"}
|
||||
},
|
||||
}),
|
||||
Entry("when the issuer is mismatched", &verifierTableInput{
|
||||
modifyClaims: func(j *jwt.StandardClaims) {
|
||||
modifyClaims: func(j *jwt.RegisteredClaims) {
|
||||
j.Issuer = "OtherIssuer"
|
||||
},
|
||||
expectedError: "failed to verify token: oidc: id token issued by a different provider",
|
||||
@@ -159,13 +159,13 @@ var _ = Describe("ProviderVerifier", func() {
|
||||
modifyOpts: func(p *ProviderVerifierOptions) {
|
||||
p.SkipIssuerVerification = true
|
||||
},
|
||||
modifyClaims: func(j *jwt.StandardClaims) {
|
||||
modifyClaims: func(j *jwt.RegisteredClaims) {
|
||||
j.Issuer = "OtherIssuer"
|
||||
},
|
||||
}),
|
||||
Entry("when the token has expired", &verifierTableInput{
|
||||
modifyClaims: func(j *jwt.StandardClaims) {
|
||||
j.ExpiresAt = time.Now().Add(-1 * time.Hour).Unix()
|
||||
modifyClaims: func(j *jwt.RegisteredClaims) {
|
||||
j.ExpiresAt = jwt.NewNumericDate(time.Now().Add(-1 * time.Hour))
|
||||
},
|
||||
expectedError: "failed to verify token: oidc: token is expired",
|
||||
}),
|
||||
|
||||
@@ -122,7 +122,7 @@ func (m *multiUpstreamProxy) registerRewriteHandler(upstream options.Upstream, h
|
||||
|
||||
rewrite := newRewritePath(rewriteRegExp, upstream.RewriteTarget, writer)
|
||||
h := alice.New(rewrite).Then(handler)
|
||||
m.serveMux.MatcherFunc(func(req *http.Request, match *mux.RouteMatch) bool {
|
||||
m.serveMux.MatcherFunc(func(req *http.Request, _ *mux.RouteMatch) bool {
|
||||
return rewriteRegExp.MatchString(req.URL.Path)
|
||||
}).Handler(h)
|
||||
|
||||
|
||||
@@ -30,10 +30,8 @@ func Validate(o *options.Options) error {
|
||||
msgs = parseSignatureKey(o, msgs)
|
||||
|
||||
if o.SSLInsecureSkipVerify {
|
||||
// InsecureSkipVerify is a configurable option we allow
|
||||
/* #nosec G402 */
|
||||
insecureTransport := &http.Transport{
|
||||
TLSClientConfig: &tls.Config{InsecureSkipVerify: true},
|
||||
TLSClientConfig: &tls.Config{InsecureSkipVerify: true}, // #nosec G402 -- InsecureSkipVerify is a configurable option we allow
|
||||
}
|
||||
http.DefaultClient = &http.Client{Transport: insecureTransport}
|
||||
} else if len(o.Providers[0].CAFiles) > 0 {
|
||||
|
||||
Reference in New Issue
Block a user