Skip to content

Commit f16db6b

Browse files
authored
Parse signing key and encryption key only if JARM response is present (#71)
1 parent 9db2f3b commit f16db6b

File tree

2 files changed

+41
-35
lines changed

2 files changed

+41
-35
lines changed

internal/oauth2/oauth2.go

Lines changed: 26 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -190,28 +190,17 @@ func RequestPAR(
190190

191191
func WaitForCallback(clientConfig ClientConfig, serverConfig ServerConfig, hc *http.Client) (request Request, err error) {
192192
var (
193-
srv = http.Server{}
194-
redirectURL *url.URL
195-
signingKey jose.JSONWebKey
196-
encryptionKey jose.JSONWebKey
197-
done = make(chan struct{})
193+
srv = http.Server{}
194+
redirectURL *url.URL
195+
done = make(chan struct{})
198196
)
199197

200198
if redirectURL, err = url.Parse(clientConfig.RedirectURL); err != nil {
201199
return request, errors.Wrapf(err, "failed to parse redirect url: %s", clientConfig.RedirectURL)
202200
}
203201

204-
if signingKey, err = ReadKey(SigningKey, serverConfig.JWKsURI, hc); err != nil {
205-
return request, errors.Wrapf(err, "failed to read signing key from %s", serverConfig.JWKsURI)
206-
}
207-
208-
if clientConfig.EncryptionKey != "" {
209-
if encryptionKey, err = ReadKey(EncryptionKey, clientConfig.EncryptionKey, hc); err != nil {
210-
return request, errors.Wrapf(err, "failed to read encryption key from %s", clientConfig.EncryptionKey)
211-
}
212-
}
213-
214202
srv.Addr = redirectURL.Host
203+
215204
if redirectURL.Path == "" {
216205
redirectURL.Path = "/"
217206
}
@@ -234,9 +223,28 @@ func WaitForCallback(clientConfig ClientConfig, serverConfig ServerConfig, hc *h
234223
request.URL = r.URL
235224
request.Form = r.PostForm
236225

237-
if err = request.ParseJARM(signingKey, encryptionKey); err != nil {
238-
log.Fatal(err)
239-
return
226+
if request.Get("response") != "" {
227+
var (
228+
signingKey jose.JSONWebKey
229+
encryptionKey jose.JSONWebKey
230+
)
231+
232+
if signingKey, err = ReadKey(SigningKey, serverConfig.JWKsURI, hc); err != nil {
233+
log.Fatal(err)
234+
return
235+
}
236+
237+
if clientConfig.EncryptionKey != "" {
238+
if encryptionKey, err = ReadKey(EncryptionKey, clientConfig.EncryptionKey, hc); err != nil {
239+
log.Fatal(err)
240+
return
241+
}
242+
}
243+
244+
if err = request.ParseJARM(signingKey, encryptionKey); err != nil {
245+
log.Fatal(err)
246+
return
247+
}
240248
}
241249

242250
w.Header().Add("Content-Type", "text/html")

internal/oauth2/request.go

Lines changed: 15 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -215,26 +215,24 @@ func (r *Request) ParseJARM(signingKey interface{}, encryptionKey interface{}) e
215215

216216
r.JARM = map[string]interface{}{}
217217

218-
if response != "" {
219-
if nestedToken, err = jwt.ParseSignedAndEncrypted(response); err != nil {
220-
if token, err2 = jwt.ParseSigned(response); err2 != nil {
221-
return errors.Wrapf(multierror.Append(err, err2), "failed to parse JARM response")
222-
}
223-
} else if encryptionKey != nil {
224-
if token, err = nestedToken.Decrypt(encryptionKey); err != nil {
225-
return errors.Wrapf(err, "failed to decrypt encrypted JARM response")
226-
}
227-
} else {
228-
return errors.New("no encryption key path")
218+
if nestedToken, err = jwt.ParseSignedAndEncrypted(response); err != nil {
219+
if token, err2 = jwt.ParseSigned(response); err2 != nil {
220+
return errors.Wrapf(multierror.Append(err, err2), "failed to parse JARM response")
229221
}
230-
231-
if signingKey == nil {
232-
return errors.New("no signing key path")
222+
} else if encryptionKey != nil {
223+
if token, err = nestedToken.Decrypt(encryptionKey); err != nil {
224+
return errors.Wrapf(err, "failed to decrypt encrypted JARM response")
233225
}
226+
} else {
227+
return errors.New("no encryption key path")
228+
}
234229

235-
if err = token.Claims(signingKey, &r.JARM); err != nil {
236-
return err
237-
}
230+
if signingKey == nil {
231+
return errors.New("no signing key path")
232+
}
233+
234+
if err = token.Claims(signingKey, &r.JARM); err != nil {
235+
return err
238236
}
239237

240238
return nil

0 commit comments

Comments
 (0)