Позволяет ли Keycloak получать токены id через веб-интерфейс - PullRequest
0 голосов
/ 30 января 2019

Я исследую, как возможно пройти аутентификацию в кластере Kubernetes 1.13 с помощью OpenID Connect и Keycloak.Я новичок в этой области.

Это видео YouTube («Использовать Open ID Connect для сервера API Kubernetes») выполняет часть того, что я хочу.Идентификационный токен первоначально получается путем выполнения HTTP-запроса (с curl) к Keycloak со ссылкой на тип предоставления password.Затем полученный токен впоследствии используется в дальнейших HTTP-запросах к API Kubernetes.Это работает, но имеет тот недостаток, что клиенты напрямую обрабатывают постоянные учетные данные пользователей.

Не будет ли лучше, если токен будет выпущен защищенной веб-страницей, которая также требует аутентификации через Keycloak (на этот раз с кодом авторизации типа предоставления)) и ничего не сделал кроме отображения нового токена?Такие токены (временные учетные данные) можно затем, например, вручную скопировать в kubeconfigs для дальнейшего использования?

Предоставляет ли Keycloak такие интерактивные веб-страницы (рядом с конечными точками REST для получения токенов программно) или это выходит за рамки?Если второе, есть ли другие стандартные компоненты для таких задач?

ОБНОВЛЕНИЕ Эта иллюстрация из документации Kubernetes , возможно, делает более ясным то, что яищуНа шаге 1 пользователь должен войти в провайдер Identity, чтобы получить токены, которые затем можно настроить на kubectl.Поддерживает ли Keycloak этот шаг, то есть предлагает ли веб-страницу, где пользователи могут войти в систему, чтобы получить свои токены?

1 Ответ

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

Если я в состоянии понять ваш вопрос, поэтому вы хотите получить маркер доступа через Java-код, поэтому вот код, который вы можете написать и вызвать

  String obtainAccessToken = obtainAccessToken(username, password);
  putRequest.addHeader("Authorization", "bearer " + obtainAccessToken);
  putRequest.addHeader("content-type", MediaType.APPLICATION_JSON);

Вот метод, который вы должны вызвать

public String obtainAccessToken(String UserName, String pwd)
    {
        AuthzClient authzClient = AuthzClient.create(configuration);
        AccessTokenResponse accessTokenResponse = authzClient.obtainAccessToken(UserName, pwd);
        String token = accessTokenResponse.getToken();
        return token;
    }

Вот метод get realm

public Response getAllRealms() {
        ObjectMapper mapper = JacksonObjectMapperProvider.getObjectMapper();
        CloseableHttpResponse response = null;
        List<SureRealmRepresentation> realmList = new ArrayList<SureRealmRepresentation>();
        int status;
        try {
            String urlGetAllRealms = URL + "/admin/realms";
            CloseableHttpClient httpclient = HttpClients.createDefault();
            HttpGet getRequest = new HttpGet(urlGetAllRealms);
            String obtainAccessToken = obtainAccessToken(username, password);
            getRequest.addHeader("Authorization", "bearer " + obtainAccessToken);
            getRequest.addHeader("content-type", MediaType.APPLICATION_JSON);
            response = httpclient.execute(getRequest);
            status = response.getStatusLine().getStatusCode();
            String responseBody = EntityUtils.toString(response.getEntity());
            if (status == 200) {
                RealmRepresentation[] realmArray = mapper.readValue(responseBody, RealmRepresentation[].class);
}
catch (Exception e) {
            if (e instanceof Exception) {
                throw (Exception) e;
            } else {
                throw ErrorHandler.wrap(new Exception("EroorType : "+ e.toString()));
            }
        }
...