Авторизация Quarkus MicroProfile JWT через JWKS

Я пытаюсь использовать конечную точку JWKS для предоставления открытого ключа для проверки подписи JWT. В моем application.properties я установил следующее:

mp.jwt.verify.publickey.location = http://localhost:1080/jwks

Похоже, что это действительно используется:

2019-08-17 18:02:28,593 DEBUG [io.sma.jwt.con.JWTAuthContextInfoProvider] (executor-thread-1) init, mpJwtPublicKey=NONE, mpJwtIssuer=NONE, mpJwtLocation=http://localhost:1080/jwks
2019-08-17 18:02:28,599 DEBUG [io.sma.jwt.aut.AbstractBearerTokenExtractor] (executor-thread-1) tokenHeaderName = Authorization
2019-08-17 18:02:28,643 DEBUG [io.qua.sma.jwt.run.aut.JwtIdentityManager] (executor-thread-1) verify, id=null, credential=io.quarkus.smallrye.jwt.runtime.auth.JWTCredential@780ca7ed
2019-08-17 18:02:28,719 DEBUG [io.sma.jwt.aut.pri.KeyLocationResolver] (executor-thread-1) Trying location as JWK(S)...

При попытке запроса к конечной точке в этом приложении происходит сбой:

2019-08-17 18:02:29,048 WARN  [io.sma.jwt.aut.pri.DefaultJWTTokenParser] (executor-thread-1) Token is invalid: JWT (claims->{"identityType":"user","authorities":[],"accountId":"0812081208","userId":"ybx8912jq59","iat":1566086374,"exp":1566089974}) rejected due to invalid claims. Additional details: [[17] Unexpected exception thrown from validator org.jose4j.jwt.consumer.IssValidator: java.lang.NullPointerException at org.jose4j.jwt.consumer.IssValidator.expectedValue(IssValidator.java:72); org.jose4j.jwt.consumer.IssValidator.validate(IssValidator.java:59); ...omitted...]
2019-08-17 18:02:29,050 DEBUG [io.qua.sma.jwt.run.aut.JwtIdentityManager] (executor-thread-1) failed, id=null, credential=io.quarkus.smallrye.jwt.runtime.auth.JWTCredential@780ca7ed: org.wildfly.security.auth.server.RealmUnavailableException: Failed to verify token
        at io.quarkus.smallrye.jwt.runtime.auth.MpJwtValidator.validateClaimsSet(MpJwtValidator.java:44)

Насколько я могу понять из этой трассировки стека, id=null может быть проблемой? Мне больше не о чем говорить, поскольку я могу подтвердить, что этот JWT действителен, поскольку я тот, кто его сгенерировал, и его можно проверить с помощью других приложений.

У меня нет доступа для добавления других полей / значений в этот JWT, поскольку я не владею системой аутентификации. Есть ли способ обойти это?


person Jim Wharton    schedule 18.08.2019    source источник


Ответы (1)


NPE от IssValidator предполагает, что вы, вероятно, столкнулись с этим https://bitbucket.org/b_c/jose4j/issues/135/issvalidator-throws-nullpointerexception, что означает, что ваш токен нуждается в заявлении эмитента iss или для потребителя JWT не нужно настраивать требование iss, не используя какие-либо setExpectedIssuer[s] методы на построителе.

person Brian Campbell    schedule 18.08.2019
comment
также никогда не используйте простой http для конечной точки JWKS в реальном использовании - person Brian Campbell; 18.08.2019
comment
Нет, это только локальный режим разработчика (эта конечная точка возвращает фиктивный объект JSON). Поскольку это кваркус, ожидаемые эмитенты устанавливаются свойством приложения, а не построителем. Мне сложно понять, как использовать вместо этого конструктор. - person Jim Wharton; 19.08.2019