Как вызвать метод testLDAPConnection из Keycloak admin cli v6.0.1?

Мы только что обновили наш сервер Keycloak с версии 3 до версии 6.0.1. У нас есть специальный сценарий, который мы используем вместе с клиентской панелью администратора Keycloak для тестирования возможности подключения к пользовательскому хранилищу LDAP.

Однако кажется, что метод testLDAPConnection больше не работает в версии 6.0.1, поскольку он возвращает HTTP 405 Method not allowed.

Похоже, что метод testLDAPConnection был изменен и не принимает запрос GET, а только запрос POST. В документации CLI администратора говорится, что testLDAPConnection метод все еще можно использовать по-старому:

    $ kcadm.sh get testLDAPConnection -q action=testConnection -q bindCredential=secret -q bindDn=uid=admin,ou=system -q connectionUrl=ldap://localhost:10389 -q useTruststoreSpi=ldapsOnly

Это не удастся с HTTP 405.

Я пробовал использовать глагол create следующим образом:

$ kcadm.sh create testLDAPConnection -s action=testConnection -s bindCredential=secret -s bindDn=uid=admin,ou=system -s connectionUrl=ldap://localhost:10389 -s useTruststoreSpi=ldapsOnly

Я ожидал, что это действие вернет код HTTP 204, но вместо этого оно приводит к сообщению об ошибке: «Ошибка теста LDAP», причина «KC-SERVICES0054: Unknown action: null» .

Кажется, что метод доступен, но параметры не отправляются должным образом. В исходном коде я заметил, что только метод testLDAPConnection имеет типы параметров FormParam, поэтому я предполагаю, что клиентский интерфейс администратора не знает, как их установить.

Я искал эту проблему в журнале регистрации проблем с Keycloak, но ничего не нашел.

У кого-нибудь была эта проблема или есть идеи, как ее исправить?


person mexi    schedule 30.07.2019    source источник
comment
У меня точно такая же ошибка. Обнаружена ошибка в системе отслеживания проблем Keycloak (issues.jboss .org / browse /), но ответа пока нет ...   -  person gdupin    schedule 04.09.2019
comment
Подтверждено, что это проблема в kcadmin, а также в документации. Должно быть исправлено в версии 9.0.1   -  person mexi    schedule 19.12.2019


Ответы (1)


Похоже, это проблема также и в Keycloak v7, поэтому я решил создать сценарий для решения этой проблемы.

Обычно я запрашиваю токен, а затем использую токен для вызова API testLDAPConnection.

Вот сценарий:

#!/bin/bash

KC_USERNAME=$1
KC_PASSWORD=$2
KC_SERVER=$3
KC_CLIENT_ID=$4
KC_CLIENT_SECRET=$5
REALM_NAME_IMPORT=$6
KC_CONTEXT=auth
CURL_OPTS="-k --noproxy $KC_SERVER"

# Request Token
KC_RESPONSE=$( \
   curl $CURL_OPTS -X POST \
        -H "Content-Type: application/x-www-form-urlencoded" \
        -d "username=$KC_USERNAME" \
        -d "password=$KC_PASSWORD" \
        -d 'grant_type=password' \
        -d "client_id=$KC_CLIENT_ID" \
        -d "client_secret=$KC_CLIENT_SECRET" \
        "http://$KC_SERVER/$KC_CONTEXT/realms/master/protocol/openid-connect/token" \
    | jq .
)

# Split token
KC_ACCESS_TOKEN=$(echo $KC_RESPONSE| jq -r .access_token)

# Verify if there is an acces token 
if [ $KC_ACCESS_TOKEN  ]; then

    echo "Token acquired successfully"
    exec 3>&1 

    # iterate through the hostnames csv file
    while IFS="," read -r cluster hostname bindcredential; do

        # Test if the given pair of LDAP host name and password is valid 
        KC_RESPONSE_LDAP_TEST=$( \
            curl -w "%{http_code}" -o >(cat>&3) $CURL_OPTS \
                -X POST \
                -H "Content-Type: application/x-www-form-urlencoded" \
                -H "Authorization: Bearer $KC_ACCESS_TOKEN" \
                -d "action=testAuthentication&bindCredential=$bindcredential&bindDn=cn=root,o=test,c=ro&connectionTimeout=&connectionUrl=ldap://$hostname:389/&realm=$REALM_NAME_IMPORT&useTruststoreSpi=ldapsOnly" \
                "http://$KC_SERVER/$KC_CONTEXT/admin/realms/$REALM_NAME_IMPORT/testLDAPConnection"  \
    | jq .
)
        # if the response is valid(204) we continue do whatever we want to
        if [ "$KC_RESPONSE_LDAP_TEST" == "204" ]; then
            echo "Keycloak testAuthentication for configuration "$hostname" was successful."
         else
            echo "ERROR: Couldn't connect with "$hostname" or authentication failed (incorrect password)"
        fi

    done < ldaps.csv

else
    echo "UNAUTHORIZED. No access token available"
fi

и запускаю скрипт из командной строки:

./testLDAPConnection.sh <username> <password> <keycloak_server> <client_id> <client_secret> <realm_to_operate>
person mexi    schedule 08.11.2019