#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.