Как использовать @IdToken в приложениях Quarkus, когда application-type = service?

Я могу получить доступ к @IdToken при запуске этого руководства Quarkus: https://quarkus.io/guides/security-openid-connect-web-authentication. Он использует quarkus.oidc.application-type = web-app.

Однако, когда я пытаюсь получить доступ к @IdToken в этом другом руководстве Quarkus (https://quarkus.io/guides/security-openid-connect), я получаю следующее исключение:

io.quarkus.oidc.OIDCException: Current identity is not associated with an ID token

Единственное различие, которое я вижу, заключается в том, что во втором руководстве используется quarkus.oidc.application-type = service, который используется по умолчанию.

Я попытался передать как токен доступа, так и токен идентификатора, которые я получил из Keycloak ранее, в заголовке авторизации, но безуспешно.

Как я могу заставить @IdToken работать для защиты служебных приложений, как во втором руководстве?

Чтобы воспроизвести, скопируйте этот фрагмент в https://github.com/quarkusio/quarkus-quickstarts/blob/master/security-openid-connect-quickstart/src/main/java/org/acme/security/openid/connect/UsersResource.java:

@Inject
@IdToken
JsonWebToken idToken;

@GET
@RolesAllowed("user")
@Path("/myname")
public String getUserName() {
   return idToken.getName();
}

Спасибо!


person Niklas Heidloff    schedule 02.07.2020    source источник


Ответы (1)


Приложения Quarkus OIDC service могут работать только с токенами-носителями, поступающими с заголовком авторизации HTTP. Приложения Quarkus OIDC web-app извлекают идентификатор и токены доступа из ответа на предоставление кода авторизации. Таким образом, для приложения service вы можете получить имя непосредственно из токена доступа. Если токен доступа непрозрачный / двоичный, то имя пользователя будет возвращено с ответом на просмотр токена, и к нему можно будет получить доступ из Principal.getName() (поддерживается начиная с Quarkus 1.6.0.CR1) HTH

person Sergey Beryozkin    schedule 02.07.2020
comment
Спасибо, Сергей! Это то, что я сделал в качестве обходного пути. Я думаю, что это довольно сбивает с толку. Я думал, что токены JWT содержат токены идентификаторов и токены доступа, к которым можно получить доступ через аннотации. - person Niklas Heidloff; 15.07.2020