Skip to content

Commit 4985100

Browse files
Replace JWT library for signing tokens (#1308)
1 parent 9cc8453 commit 4985100

File tree

5 files changed

+50
-62
lines changed

5 files changed

+50
-62
lines changed

go.mod

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,9 +4,9 @@ go 1.19
44

55
require (
66
github.com/apache/thrift v0.16.0
7-
github.com/cristalhq/jwt/v3 v3.1.0
87
github.com/facebookgo/clock v0.0.0-20150410010913-600d898af40a
98
github.com/gogo/protobuf v1.3.2
9+
github.com/golang-jwt/jwt/v5 v5.2.0
1010
github.com/golang/mock v1.5.0
1111
github.com/marusama/semaphore/v2 v2.5.0
1212
github.com/opentracing/opentracing-go v1.1.0

go.sum

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -28,8 +28,6 @@ github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDk
2828
github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc=
2929
github.com/codahale/hdrhistogram v0.0.0-20161010025455-3a0bb77429bd/go.mod h1:sE/e/2PUdi/liOCUjSTXgM1o87ZssimdTWN964YiIeI=
3030
github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E=
31-
github.com/cristalhq/jwt/v3 v3.1.0 h1:iLeL9VzB0SCtjCy9Kg53rMwTcrNm+GHyVcz2eUujz6s=
32-
github.com/cristalhq/jwt/v3 v3.1.0/go.mod h1:XOnIXst8ozq/esy5N1XOlSyQqBd+84fxJ99FK+1jgL8=
3331
github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
3432
github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=
3533
github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
@@ -63,6 +61,8 @@ github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q=
6361
github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q=
6462
github.com/gogo/status v1.1.0 h1:+eIkrewn5q6b30y+g/BJINVVdi2xH7je5MPJ3ZPK3JA=
6563
github.com/gogo/status v1.1.0/go.mod h1:BFv9nrluPLmrS0EmGVvLaPNmRosr9KapBYd5/hpY1WM=
64+
github.com/golang-jwt/jwt/v5 v5.2.0 h1:d/ix8ftRUorsN+5eMIlF4T6J8CAt9rch3My2winC1Jw=
65+
github.com/golang-jwt/jwt/v5 v5.2.0/go.mod h1:pqrtFR0X4osieyHYxtmOUWsAWrfe1Q5UVIyoH402zdk=
6666
github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q=
6767
github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A=
6868
github.com/golang/mock v1.2.0/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A=

internal/common/auth/service_wrapper.go

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -23,10 +23,10 @@ package auth
2323
import (
2424
"context"
2525

26-
"go.uber.org/yarpc"
27-
26+
"github.com/golang-jwt/jwt/v5"
2827
"go.uber.org/cadence/.gen/go/cadence/workflowserviceclient"
2928
"go.uber.org/cadence/.gen/go/shared"
29+
"go.uber.org/yarpc"
3030
)
3131

3232
const (
@@ -45,11 +45,12 @@ type AuthorizationProvider interface {
4545
}
4646

4747
type JWTClaims struct {
48+
jwt.RegisteredClaims
49+
4850
Sub string
4951
Name string
5052
Groups string // separated by space
5153
Admin bool
52-
Iat int64
5354
TTL int64
5455
}
5556

internal/jwt_authorization.go

Lines changed: 19 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -23,12 +23,14 @@ package internal
2323
import (
2424
"time"
2525

26-
"github.com/cristalhq/jwt/v3"
26+
"github.com/golang-jwt/jwt/v5"
2727

2828
"go.uber.org/cadence/internal/common/auth"
2929
"go.uber.org/cadence/internal/common/util"
3030
)
3131

32+
const internalIssuer = "internal-jwt"
33+
3234
type JWTAuthProvider struct {
3335
PrivateKey []byte
3436
}
@@ -40,24 +42,28 @@ func NewAdminJwtAuthorizationProvider(privateKey []byte) auth.AuthorizationProvi
4042
}
4143

4244
func (j *JWTAuthProvider) GetAuthToken() ([]byte, error) {
43-
claims := auth.JWTClaims{
44-
Admin: true,
45-
Iat: time.Now().Unix(),
46-
TTL: 60 * 10,
47-
}
4845
key, err := util.LoadRSAPrivateKey(j.PrivateKey)
4946
if err != nil {
5047
return nil, err
5148
}
52-
signer, err := jwt.NewSignerRS(jwt.RS256, key)
53-
if err != nil {
54-
return nil, err
49+
50+
ttl := int64(60 * 10)
51+
claims := auth.JWTClaims{
52+
RegisteredClaims: jwt.RegisteredClaims{
53+
Issuer: internalIssuer,
54+
IssuedAt: jwt.NewNumericDate(time.Now()),
55+
ExpiresAt: jwt.NewNumericDate(time.Now().Add(time.Second * time.Duration(ttl))),
56+
},
57+
Admin: true,
58+
TTL: ttl, // keeping for backwards compatibility
5559
}
56-
builder := jwt.NewBuilder(signer)
57-
token, err := builder.Build(claims)
58-
if token == nil {
60+
61+
tokenString, err := jwt.NewWithClaims(jwt.SigningMethodRS256, claims).SignedString(key)
62+
63+
if err != nil {
5964
return nil, err
6065
}
6166

62-
return token.Raw(), nil
67+
return []byte(tokenString), nil
68+
6369
}

internal/jwt_authorization_test.go

Lines changed: 24 additions & 43 deletions
Original file line numberDiff line numberDiff line change
@@ -21,60 +21,41 @@
2121
package internal
2222

2323
import (
24-
"encoding/json"
25-
"io/ioutil"
24+
"os"
2625
"testing"
2726

28-
"github.com/cristalhq/jwt/v3"
29-
"github.com/stretchr/testify/suite"
30-
27+
"github.com/golang-jwt/jwt/v5"
28+
"github.com/stretchr/testify/assert"
3129
"go.uber.org/cadence/internal/common/auth"
3230
"go.uber.org/cadence/internal/common/util"
3331
)
3432

35-
type (
36-
jwtAuthSuite struct {
37-
suite.Suite
38-
key []byte
39-
}
40-
)
41-
42-
func TestJWTAuthSuite(t *testing.T) {
43-
suite.Run(t, new(jwtAuthSuite))
44-
}
45-
46-
func (s *jwtAuthSuite) SetupTest() {
47-
var err error
48-
s.key, err = ioutil.ReadFile("./common/auth/credentials/keytest")
49-
s.NoError(err)
50-
}
51-
52-
func (s *jwtAuthSuite) TearDownTest() {
53-
}
54-
55-
func (s *jwtAuthSuite) TestCorrectTokenCreation() {
56-
authorizer := NewAdminJwtAuthorizationProvider(s.key)
33+
func TestCorrectTokenCreation(t *testing.T) {
34+
key, err := os.ReadFile("./common/auth/credentials/keytest")
35+
assert.NoError(t, err)
36+
authorizer := NewAdminJwtAuthorizationProvider(key)
5737
authToken, err := authorizer.GetAuthToken()
58-
s.NoError(err)
38+
assert.NoError(t, err)
5939

60-
// Decrypting token, it should be enough to make sure authtoken is not empty, this is one steap ahead of that
61-
publicKeyStr, err := ioutil.ReadFile("./common/auth/credentials/keytest.pub")
62-
s.NoError(err)
40+
// Decrypting token, it should be enough to make sure authtoken is not empty, this is one step ahead of that
41+
publicKeyStr, err := os.ReadFile("./common/auth/credentials/keytest.pub")
42+
assert.NoError(t, err)
6343
publicKey, err := util.LoadRSAPublicKey(publicKeyStr)
64-
s.NoError(err)
65-
verifier, err := jwt.NewVerifierRS(jwt.RS256, publicKey)
66-
s.NoError(err)
67-
token, err := jwt.ParseAndVerifyString(string(authToken), verifier)
68-
s.NoError(err)
44+
assert.NoError(t, err)
45+
parser := jwt.NewParser(jwt.WithValidMethods([]string{jwt.SigningMethodRS256.Name}))
6946
var claims auth.JWTClaims
70-
_ = json.Unmarshal(token.RawClaims(), &claims)
71-
s.Equal(claims.Admin, true)
72-
s.Equal(claims.Groups, "")
73-
s.Equal(claims.TTL, int64(60*10))
74-
}
7547

76-
func (s *jwtAuthSuite) TestIncorrectPrivateKeyForTokenCreation() {
48+
_, err = parser.ParseWithClaims(string(authToken), &claims, func(token *jwt.Token) (interface{}, error) {
49+
return publicKey, nil
50+
})
51+
52+
assert.NoError(t, err)
53+
assert.Equal(t, true, claims.Admin)
54+
assert.Equal(t, "", claims.Groups)
55+
assert.Equal(t, int64(60*10), claims.TTL)
56+
}
57+
func TestIncorrectPrivateKeyForTokenCreation(t *testing.T) {
7758
authorizer := NewAdminJwtAuthorizationProvider([]byte{})
7859
_, err := authorizer.GetAuthToken()
79-
s.EqualError(err, "failed to parse PEM block containing the private key")
60+
assert.EqualError(t, err, "failed to parse PEM block containing the private key")
8061
}

0 commit comments

Comments
 (0)