Skip to content

Commit 18cb28d

Browse files
authored
Merge pull request #3 from aviva-verde/VER-5669-v2
fix(VER-5669): add SignerProvider to jwt package
2 parents aed9f25 + 85c2abb commit 18cb28d

File tree

1 file changed

+23
-5
lines changed

1 file changed

+23
-5
lines changed

jwt/jwt.go

+23-5
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ package jwt
1010

1111
import (
1212
"context"
13+
"crypto/rsa"
1314
"encoding/json"
1415
"fmt"
1516
"io"
@@ -48,6 +49,11 @@ type Config struct {
4849
//
4950
PrivateKey []byte
5051

52+
// SignerProvider is a function that is used to create a Signer from the
53+
// PrivateKeyID which is then used to sign JWT payloads. This takes
54+
// precedence over default signer using the PrivateKey.
55+
SignerProvider func(privateKeyID string) (Signer, error)
56+
5157
// PrivateKeyID contains an optional hint indicating which key is being
5258
// used.
5359
PrivateKeyID string
@@ -101,10 +107,6 @@ type jwtSource struct {
101107
}
102108

103109
func (js jwtSource) Token() (*oauth2.Token, error) {
104-
pk, err := internal.ParseKey(js.conf.PrivateKey)
105-
if err != nil {
106-
return nil, err
107-
}
108110
hc := oauth2.NewClient(js.ctx, nil)
109111
claimSet := &jws.ClaimSet{
110112
Iss: js.conf.Email,
@@ -126,7 +128,23 @@ func (js jwtSource) Token() (*oauth2.Token, error) {
126128
}
127129
h := *defaultHeader
128130
h.KeyID = js.conf.PrivateKeyID
129-
payload, err := jws.Encode(&h, claimSet, pk)
131+
var err error
132+
payload := ""
133+
if js.conf.SignerProvider == nil {
134+
var pk *rsa.PrivateKey
135+
pk, err = internal.ParseKey(js.conf.PrivateKey)
136+
if err != nil {
137+
return nil, err
138+
}
139+
payload, err = jws.Encode(&h, claimSet, pk)
140+
} else {
141+
var signer jws.Signer
142+
signer, err = js.conf.SignerProvider(h.KeyID)
143+
if err != nil {
144+
return nil, err
145+
}
146+
payload, err = jws.EncodeWithSigner(&h, claimSet, signer)
147+
}
130148
if err != nil {
131149
return nil, err
132150
}

0 commit comments

Comments
 (0)