diff --git a/changelog/unreleased/switch-jwt-lib.md b/changelog/unreleased/switch-jwt-lib.md new file mode 100644 index 0000000000..a6b7fee269 --- /dev/null +++ b/changelog/unreleased/switch-jwt-lib.md @@ -0,0 +1,5 @@ +Enhancement: Replace unmaintained jwt library + +The old library [github.com/dgrijalva/jwt-go](https://github.com/dgrijalva/jwt-go) is unmaintained and was replaced by the community maintained fork [github.com/golang-jwt/jwt](https://github.com/golang-jwt/jwt). + +https://github.com/owncloud/ocis/pull/2386 diff --git a/go.mod b/go.mod index 134f67d7c3..fa90fc731e 100644 --- a/go.mod +++ b/go.mod @@ -26,7 +26,6 @@ require ( github.com/cs3org/go-cs3apis v0.0.0-20210802070913-970eec344e59 github.com/cs3org/reva v1.11.1-0.20210812105259-756bdced1d22 github.com/cznic/b v0.0.0-20181122101859-a26611c4d92d // indirect - github.com/dgrijalva/jwt-go v3.2.0+incompatible github.com/disintegration/imaging v1.6.2 github.com/glauth/glauth v1.1.3-0.20210729125545-b9aecdfcac31 github.com/go-chi/chi v4.1.2+incompatible @@ -34,6 +33,7 @@ require ( github.com/go-logr/logr v0.4.0 github.com/go-ozzo/ozzo-validation/v4 v4.2.1 github.com/gofrs/uuid v3.3.0+incompatible + github.com/golang-jwt/jwt/v4 v4.0.0 github.com/golang/freetype v0.0.0-20170609003504-e2365dfdc4a0 github.com/golang/protobuf v1.5.2 github.com/gopherjs/gopherjs v0.0.0-20200217142428-fce0ec30dd00 // indirect diff --git a/go.sum b/go.sum index f7c126ad99..336a4c3c2e 100644 --- a/go.sum +++ b/go.sum @@ -455,6 +455,8 @@ github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69 github.com/goji/httpauth v0.0.0-20160601135302-2da839ab0f4d/go.mod h1:nnjvkQ9ptGaCkuDUx6wNykzzlUixGxvkme+H/lnzb+A= github.com/golang-jwt/jwt v3.2.2+incompatible h1:IfV12K8xAKAnZqdXVzCZ+TOjboZ2keLg81eXfW3O+oY= github.com/golang-jwt/jwt v3.2.2+incompatible/go.mod h1:8pz2t5EyA70fFQQSrl6XZXzqecmYZeUEB8OUGHkxJ+I= +github.com/golang-jwt/jwt/v4 v4.0.0 h1:RAqyYixv1p7uEnocuy8P1nru5wprCh/MH2BIlW5z5/o= +github.com/golang-jwt/jwt/v4 v4.0.0/go.mod h1:/xlHOz8bRuivTWchD4jCa+NbatV+wEUSzwAxVc6locg= github.com/golang/freetype v0.0.0-20170609003504-e2365dfdc4a0 h1:DACJavvAHhabrF08vX0COfcOBJRhZ8lUbR+ZWIs0Y5g= github.com/golang/freetype v0.0.0-20170609003504-e2365dfdc4a0/go.mod h1:E/TSTwGwJL78qG/PmXZO1EjYhfJinVAhrmmHX6Z8B9k= github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= diff --git a/proxy/pkg/middleware/oidc_auth.go b/proxy/pkg/middleware/oidc_auth.go index f225dd96b5..81f05acfd4 100644 --- a/proxy/pkg/middleware/oidc_auth.go +++ b/proxy/pkg/middleware/oidc_auth.go @@ -2,17 +2,17 @@ package middleware import ( "context" - "encoding/json" "net/http" "strings" "time" - "github.com/dgrijalva/jwt-go" + "github.com/golang-jwt/jwt/v4" gOidc "github.com/coreos/go-oidc" "github.com/owncloud/ocis/ocis-pkg/log" "github.com/owncloud/ocis/ocis-pkg/oidc" "github.com/owncloud/ocis/ocis-pkg/sync" + "github.com/owncloud/ocis/proxy/pkg/config" "golang.org/x/oauth2" ) @@ -27,12 +27,13 @@ func OIDCAuth(optionSetters ...Option) func(next http.Handler) http.Handler { tokenCache := sync.NewCache(options.UserinfoCacheSize) h := oidcAuth{ - logger: options.Logger, - providerFunc: options.OIDCProviderFunc, - httpClient: options.HTTPClient, - oidcIss: options.OIDCIss, - tokenCache: &tokenCache, - tokenCacheTTL: options.UserinfoCacheTTL, + logger: options.Logger, + providerFunc: options.OIDCProviderFunc, + httpClient: options.HTTPClient, + oidcIss: options.OIDCIss, + TokenManagerConfig: options.TokenManagerConfig, + tokenCache: &tokenCache, + tokenCacheTTL: options.UserinfoCacheTTL, } return func(next http.Handler) http.Handler { @@ -69,13 +70,14 @@ func OIDCAuth(optionSetters ...Option) func(next http.Handler) http.Handler { } type oidcAuth struct { - logger log.Logger - provider OIDCProvider - providerFunc func() (OIDCProvider, error) - httpClient *http.Client - oidcIss string - tokenCache *sync.Cache - tokenCacheTTL time.Duration + logger log.Logger + provider OIDCProvider + providerFunc func() (OIDCProvider, error) + httpClient *http.Client + oidcIss string + tokenCache *sync.Cache + tokenCacheTTL time.Duration + TokenManagerConfig config.TokenManager } func (m oidcAuth) getClaims(token string, req *http.Request) (claims map[string]interface{}, status int) { @@ -124,19 +126,15 @@ func (m oidcAuth) getClaims(token string, req *http.Request) (claims map[string] func (m oidcAuth) extractExpiration(token string) time.Time { defaultExpiration := time.Now().Add(m.tokenCacheTTL) - s := strings.SplitN(token, ".", 4) - if len(s) != 3 { - return defaultExpiration - } - - b, err := jwt.DecodeSegment(s[1]) + t, err := jwt.Parse(token, func(t *jwt.Token) (interface{}, error) { + return []byte(m.TokenManagerConfig.JWTSecret), nil + }) if err != nil { return defaultExpiration } - at := &jwt.StandardClaims{} - err = json.Unmarshal(b, at) - if err != nil || at.ExpiresAt == 0 { + at, ok := t.Claims.(jwt.StandardClaims) + if !ok || at.ExpiresAt == 0 { return defaultExpiration }