Как получить токен доступа в SPI с блокировкой ключей?

#keycloak

#Скрытый доступ

Вопрос:

Пример использования:
Из EventListenerProvider для события я хочу выполнить аутентифицированный вызов REST для одного из наших защищенных сервисов keycloak. Для этого мне нужен токен.

Сначала я просто тестирую печать токена, чтобы проверить, удалось ли это.

   public void onEvent(final Event event) {
        Keycloak k = Keycloak.getInstance("http://localhost:8080/auth", "myrealm", "myemail@gmail.com", "password", "myclient");
        AccessTokenResponse t = k.tokenManager().getAccessToken();
        logger.info(t.getSessionState());
        logger.info(t.getToken());
   }
  

К сожалению, и session_state, и токен равны нулю.

Все данные верны, URL, область … и т.д. В противном случае мы бы знали об этом. Keycloak ничего не регистрирует, просто молча возвращает null.
Кроме того, я могу использовать приведенный выше код из любого другого места, и это работает! Я могу использовать его из простого метода Java main () и он все еще работает. Получение токена вручную через postman также работает.

Что не так с поставщиком скрытого доступа? Как я могу получить доступ для определенного пользователя?

Ответ №1:

Вы можете использовать следующий пример для создания accessToken:

 public String getAccessToken(UserModel userModel, KeycloakSession keycloakSession) {
    KeycloakContext keycloakContext = keycloakSession.getContext();

    AccessToken token = new AccessToken();
    token.subject(userModel.getId());
    token.issuer(Urls.realmIssuer(keycloakContext.getUri().getBaseUri(), keycloakContext.getRealm().getName()));
    token.issuedNow();
    token.expiration((int) (token.getIat()   60L)); //Lifetime of 60 seconds

    KeyWrapper key = keycloakSession.keys().getActiveKey(keycloakContext.getRealm(), KeyUse.SIG, "RS256");

    return new JWSBuilder().kid(key.getKid()).type("JWT").jsonContent(token).sign(new AsymmetricSignatureSignerContext(key));
  }
  

Обратите внимание, что вам также необходимо указать <module name="org.keycloak.keycloak-services"/> в вашей jboss-deployment-structure.