Skip to content

Commit 0ba1639

Browse files
committed
fix(authorization): verification against private keys from disk failed
1 parent c5b9d19 commit 0ba1639

File tree

2 files changed

+68
-2
lines changed

2 files changed

+68
-2
lines changed

authorization/src/main/kotlin/org/modelix/authorization/ModelixJWTUtil.kt

Lines changed: 25 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ import com.nimbusds.jose.JWSHeader
66
import com.nimbusds.jose.JWSObject
77
import com.nimbusds.jose.JWSSigner
88
import com.nimbusds.jose.JWSVerifier
9+
import com.nimbusds.jose.KeySourceException
910
import com.nimbusds.jose.crypto.MACSigner
1011
import com.nimbusds.jose.crypto.RSASSASigner
1112
import com.nimbusds.jose.crypto.factories.DefaultJWSVerifierFactory
@@ -69,7 +70,11 @@ class ModelixJWTUtil {
6970
val keySelectors: List<JWSKeySelector<SecurityContext>> = hmacKeys.map { it.toPair() }.map {
7071
SingleKeyJWSKeySelector<SecurityContext>(it.first, SecretKeySpec(it.second, it.first.name))
7172
} + jwkSources.map {
72-
JWSAlgorithmFamilyJWSKeySelector.fromJWKSource<SecurityContext>(it)
73+
try {
74+
JWSAlgorithmFamilyJWSKeySelector.fromJWKSource<SecurityContext>(it)
75+
} catch (ex: KeySourceException) {
76+
throw KeySourceException("Couldn't retrieve JWKs from $it", ex)
77+
}
7378
}
7479

7580
processor.jwsKeySelector = if (keySelectors.size == 1) keySelectors.single() else CompositeJWSKeySelector(keySelectors)
@@ -328,6 +333,10 @@ class ModelixJWTUtil {
328333
override fun readFile(): JWKSet {
329334
return JWKSet(ensureValidKey(JWK.parseFromPEMEncodedObjects(file.readText())))
330335
}
336+
337+
override fun toString(): String {
338+
return "PemFileJWKSet[$file]"
339+
}
331340
}
332341

333342
private open inner class FileJWKSet<C : SecurityContext>(val file: File) : JWKSource<C> {
@@ -340,12 +349,26 @@ class ModelixJWTUtil {
340349

341350
override fun get(jwkSelector: JWKSelector, context: C?): List<JWK?>? {
342351
val jwks = cached.takeIf { System.currentTimeMillis() - loadedAt < fileRefreshTime.inWholeMilliseconds }
343-
?: readFile().also {
352+
?: readFile().let { jwks ->
353+
JWKSet(
354+
jwks.keys.flatMap { key ->
355+
if (key.isPrivate) {
356+
listOf(key, key.toPublicJWK())
357+
} else {
358+
listOf(key)
359+
}
360+
},
361+
)
362+
}.also {
344363
cached = it
345364
loadedAt = System.currentTimeMillis()
346365
}
347366
return jwkSelector.select(jwks)
348367
}
368+
369+
override fun toString(): String {
370+
return "FileJWKSet[$file]"
371+
}
349372
}
350373

351374
companion object {

authorization/src/test/kotlin/org/modelix/authorization/RSATest.kt

Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -318,4 +318,47 @@ class RSATest {
318318
verifyingUtil.verifyToken(tokenString)
319319
}
320320
}
321+
322+
@Test
323+
fun `can verify own tokens`() {
324+
val privateKeyPem1 = """
325+
-----BEGIN RSA PRIVATE KEY-----
326+
MIIEogIBAAKCAQEAyB+2c/hRX7lhcTKHOom13F7dVnujy1XndcYp4y42NIxRZDui
327+
mOU/inkH6tJsclIftPeYSWnSTWRc5ZG268pRMjD6rMCxCTyo1S7VGuXtdPbfL1ma
328+
kCYfpKALBZdLgrYVkor49CP2cBdKPldYUT7+EpqFxXkaeL073bS3vPPdxN/riuYu
329+
3df3tLe9+st6Tr6+rv1+HK+dRegPok8ryMOogT96QyF7ygLDQ1WW/v/CZI5y+jW1
330+
xEpWnHRkRqHWTtIMjWN6WK+ez1kg4tlQDWmMn4bywmTPRs38weLEMnTUrjfrOxOc
331+
59rWOyE7b186RrDf1F1ezLiVUlLA9L7ThydM3QIDAQABAoIBAEXspsCgrDYpPP3j
332+
bNKsWWn1j5rvOo0KqARDyFEDzZbQzIOcPrTzrR8CKR0IhzHutftyY7iLDBtUjQz9
333+
vA9pMrO532zLK1CR7GAIrBdo7W5n8BXIVjQ1zeqkrRU4Bv9WBfWdL12Gz03dJWjg
334+
9g/1VatEaKdWKES1whw2T9jq0Ls/7/uRTtL31g6SnI/UW5RnZe4TQhNtnTltts6T
335+
eHUU7MjKIlB4VQrHx8up/QdsMIvXihv72jm374nZe6U3e8HmuGb71qXA4YPFju5c
336+
Aict16PVNUTb2ZAylH33NB0k1LlHaCbkQM+Cy3jhhtb1XERXt7tDyS/hiC++HG6b
337+
jlAvqzUCgYEA27OjEbEbw60ca9goC/mafZoDofZWA3aNI+TR15EsFAYQHtoE4DLy
338+
Nrlm0syqqJJwf117jLhu+KpKrJtb36XqfUqnwwISAilnr6OnPT47qs8dbrRIxnap
339+
COh9yw0YerLFPuJ9HTPZMCWs7ufDcXJyuRfjL25lq/kv7jGD6jHRvnMCgYEA6TAG
340+
PK/OyIizT4OtdzNbejQ7W+9wi4tfhjF8OMmgQb6kpsmSmhoaFCQ5SAg9MwqbL2q1
341+
3XSEkPXljONqWmkQZ/2Eo4WHveOKoKj/07LiRucs5jjHyr5pea80z5lTnE8i7MJX
342+
eNSTqi3b9WnV0J0EHhg7qgAbH/q+c5gtiqgkI28CgYB9z0ONSQdmKUaCNzjPirK+
343+
RCjaYW7l8shmCo1jzT0ZhlNK53wtSt9LGSZZhlwfxiPnu4eZkK/zc8jpSNn2m1NJ
344+
RiwFTrUzSbSXbrbBKlcOvCXVlCWsiJzJfiEy2p/u+1paZWZSB7PSj3CVKmDQIUKy
345+
3Yv6SFSugzbARtiMjtTWIwKBgGFKDyAcvap/FkjTiHkWLVFkH2vxD0S5RoaHeOt8
346+
e+dSMgIAUbEHuN+0aU27WkVEZJC49d3KclDEtxw7+bB060pnxIIxAPxhxgHX4Lyj
347+
grLQWrRG9lyJaxpA1kjTEMZDYi/juXkJP/6dmYrfuDyMdh5UP/hiiO6jv/gcgsu5
348+
8THzAoGAUGCnccd4JAXK3/rmkCLT++M18G6ik+qaTMdhGnC9opTDWDvxWF6jHj7w
349+
4/wol7RQf0qmWZr6sSg+dg/cEOvAxBDiayl7WALnEpGhh2+aKkDVIy7JSTOm3fkO
350+
P1Z2sotIDXrYJrdKl/BvWh80ifVYjHp9J/cOhMSyj/HCMhxexhY=
351+
-----END RSA PRIVATE KEY-----
352+
""".trimIndent().trim()
353+
354+
val privateKeyFile = File.createTempFile("modelix_rsa_test", ".pem")
355+
privateKeyFile.deleteOnExit()
356+
privateKeyFile.writeText(privateKeyPem1)
357+
358+
val util = ModelixJWTUtil()
359+
util.loadKeysFromFiles(privateKeyFile)
360+
361+
val tokenString = util.createAccessToken("[email protected]", listOf())
362+
util.verifyToken(tokenString)
363+
}
321364
}

0 commit comments

Comments
 (0)