Java-клиент для обновления токена Keycloak - PullRequest
0 голосов
/ 29 июня 2018

Представь себе,

Ниже приведены 2 клиента (2 микросервиса) в режиме блокировки клавиш.

  • отдых-сервис-1
  • остальное обслуживание-2

Ниже приводится роль в rest-service-2

  • сервис-2-пользователь

Для обслуживания звонка обслуживания, то есть: rest-service-1 звонки rest-service-2

'rest-service-1' настроен со следующими значениями в Keycloak

Access Type: confidential
Service Account Enabled: Yes

Кроме того, в разделе «Роли учетной записи службы» для rest-service-1 добавлена ​​/ сопоставлена ​​следующая роль

Role for client rest-service-2: service-2-user

После настройки 2 клиентов и служебной учетной записи для вызова клиента в keyclock. Я создал проект Spring boot 2.0.3 и использовал следующий код для получения токена.

@Bean
public AuthzClient authzClient(KeycloakSpringBootProperties kcProperties) {
  //org.keycloak.authorization.client.Configuration
  Configuration configuration =
      new Configuration(kcProperties.getAuthServerUrl(), 
                        kcProperties.getRealm(), 
                        kcProperties.getResource(),
                        kcProperties.getCredentials(), null);

  return AuthzClient.create(configuration);
}

Вот как я получаю токен доступа

@Autowired
private AuthzClient authzClient;

public AccessTokenResponse token() {
  return authzClient.obtainAccessToken();
}

Следующий токен получен:

{
  "access_token": ${access-token},
  "expires_in": 300,
  "refresh_expires_in": 1800,
  "refresh_token": ${refresh-token},
  "token_type": "bearer",
  "id_token": null,
  "not-before-policy": 0,
  "session_state": "6f284b2f-5bb6-4018-8acd-b83923ebb7d7",
  "scope": "profile email"
}

Примечание. Я заменил токены на короткие / короткие.

ВОПРОС:

Как использовать токен обновления, указанный выше, и получить новый токен доступа. AuthzClient поддерживает это? Если да, то как мне это сделать?

Нужно ли создавать новый экземпляр TokenCallable и получать токен? Если да, то как создать экземпляр TokenCallable?

Безопасен ли поток TokenCallable?

1 Ответ

0 голосов
/ 08 февраля 2019

Вы не можете сделать это явно с помощью AuthzClient lib. Тем не менее, вы можете использовать некоторые из его методов. Вот как я решил это:

public AccessTokenResponse refreshToken(String refreshToken) {
    String url = kcProperties.getAuthServerUrl() + "/realms/" + kcProperties.getRealm() + "/protocol/openid-connect/token";
    String clientId = kcProperties.getResource();
    String secret = (String) kcProperties.getCredentials().get("secret");
    Http http = new Http(kcConfig, (params, headers) -> {});

    return http.<AccessTokenResponse>post(url)
            .authentication()
                .client()
            .form()
                .param("grant_type", "refresh_token")
                .param("refresh_token", refreshToken)
                .param("client_id", clientId)
                .param("client_secret", secret)
            .response()
                .json(AccessTokenResponse.class)
            .execute();
}
...