@@ -45,6 +45,7 @@ type JWTSigningKey interface {
45
45
SignKey () interface {}
46
46
VerifyKey () interface {}
47
47
ToJWK () (map [string ]string , error )
48
+ PreProcessToken (* jwt.Token )
48
49
}
49
50
50
51
type hmacSingingKey struct {
@@ -75,9 +76,25 @@ func (key hmacSingingKey) ToJWK() (map[string]string, error) {
75
76
}, nil
76
77
}
77
78
79
+ func (key hmacSingingKey ) PreProcessToken (* jwt.Token ) {}
80
+
78
81
type rsaSingingKey struct {
79
82
signingMethod jwt.SigningMethod
80
83
key * rsa.PrivateKey
84
+ id string
85
+ }
86
+
87
+ func newRSASingingKey (signingMethod jwt.SigningMethod , key * rsa.PrivateKey ) (rsaSingingKey , error ) {
88
+ kid , err := createPublicKeyFingerprint (key .Public ().(* rsa.PublicKey ))
89
+ if err != nil {
90
+ return rsaSingingKey {}, err
91
+ }
92
+
93
+ return rsaSingingKey {
94
+ signingMethod ,
95
+ key ,
96
+ base64 .RawURLEncoding .EncodeToString (kid ),
97
+ }, nil
81
98
}
82
99
83
100
func (key rsaSingingKey ) IsSymmetric () bool {
@@ -99,23 +116,36 @@ func (key rsaSingingKey) VerifyKey() interface{} {
99
116
func (key rsaSingingKey ) ToJWK () (map [string ]string , error ) {
100
117
pubKey := key .key .Public ().(* rsa.PublicKey )
101
118
102
- kid , err := createPublicKeyFingerprint (pubKey )
103
- if err != nil {
104
- return nil , err
105
- }
106
-
107
119
return map [string ]string {
108
120
"kty" : "RSA" ,
109
121
"alg" : key .SigningMethod ().Alg (),
110
- "kid" : base64 . RawURLEncoding . EncodeToString ( kid ) ,
122
+ "kid" : key . id ,
111
123
"e" : base64 .RawURLEncoding .EncodeToString (big .NewInt (int64 (pubKey .E )).Bytes ()),
112
124
"n" : base64 .RawURLEncoding .EncodeToString (pubKey .N .Bytes ()),
113
125
}, nil
114
126
}
115
127
128
+ func (key rsaSingingKey ) PreProcessToken (token * jwt.Token ) {
129
+ token .Header ["kid" ] = key .id
130
+ }
131
+
116
132
type ecdsaSingingKey struct {
117
133
signingMethod jwt.SigningMethod
118
134
key * ecdsa.PrivateKey
135
+ id string
136
+ }
137
+
138
+ func newECDSASingingKey (signingMethod jwt.SigningMethod , key * ecdsa.PrivateKey ) (ecdsaSingingKey , error ) {
139
+ kid , err := createPublicKeyFingerprint (key .Public ().(* ecdsa.PublicKey ))
140
+ if err != nil {
141
+ return ecdsaSingingKey {}, err
142
+ }
143
+
144
+ return ecdsaSingingKey {
145
+ signingMethod ,
146
+ key ,
147
+ base64 .RawURLEncoding .EncodeToString (kid ),
148
+ }, nil
119
149
}
120
150
121
151
func (key ecdsaSingingKey ) IsSymmetric () bool {
@@ -137,21 +167,20 @@ func (key ecdsaSingingKey) VerifyKey() interface{} {
137
167
func (key ecdsaSingingKey ) ToJWK () (map [string ]string , error ) {
138
168
pubKey := key .key .Public ().(* ecdsa.PublicKey )
139
169
140
- kid , err := createPublicKeyFingerprint (pubKey )
141
- if err != nil {
142
- return nil , err
143
- }
144
-
145
170
return map [string ]string {
146
171
"kty" : "EC" ,
147
172
"alg" : key .SigningMethod ().Alg (),
148
- "kid" : base64 . RawURLEncoding . EncodeToString ( kid ) ,
173
+ "kid" : key . id ,
149
174
"crv" : pubKey .Params ().Name ,
150
175
"x" : base64 .RawURLEncoding .EncodeToString (pubKey .X .Bytes ()),
151
176
"y" : base64 .RawURLEncoding .EncodeToString (pubKey .Y .Bytes ()),
152
177
}, nil
153
178
}
154
179
180
+ func (key ecdsaSingingKey ) PreProcessToken (token * jwt.Token ) {
181
+ token .Header ["kid" ] = key .id
182
+ }
183
+
155
184
// createPublicKeyFingerprint creates a fingerprint of the given key.
156
185
// The fingerprint is the sha256 sum of the PKIX structure of the key.
157
186
func createPublicKeyFingerprint (key interface {}) ([]byte , error ) {
@@ -199,13 +228,13 @@ func CreateJWTSingingKey(algorithm string, key interface{}) (JWTSigningKey, erro
199
228
if ! ok {
200
229
return nil , jwt .ErrInvalidKeyType
201
230
}
202
- return ecdsaSingingKey { signingMethod , privateKey }, nil
231
+ return newECDSASingingKey ( signingMethod , privateKey )
203
232
case * jwt.SigningMethodRSA :
204
233
privateKey , ok := key .(* rsa.PrivateKey )
205
234
if ! ok {
206
235
return nil , jwt .ErrInvalidKeyType
207
236
}
208
- return rsaSingingKey { signingMethod , privateKey }, nil
237
+ return newRSASingingKey ( signingMethod , privateKey )
209
238
default :
210
239
secret , ok := key .([]byte )
211
240
if ! ok {
0 commit comments