如何从Keycloak管理员cli v6.0.1中调用testLDAPConnection方法?

时间:2019-07-30 21:14:37

标签: keycloak keycloak-services

我们刚刚将Keycloak服务器从版本3升级到了版本6.0.1。 我们有一些自定义脚本,与Keycloak admin cli一起使用,用于测试LDAP用户存储连接。

然而,方法testLDAPConnection在版本6.0.1中似乎不再起作用,因为它返回不允许的HTTP 405方法

似乎testLDAPConnection方法已更改,并且不接受GET请求,而仅接受POST请求。 Admin CLI documentation指出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:未知操作:null” < / strong>。

该方法似乎可以实现,但参数发送不正确。 我在源代码中注意到,只有testLDAPConnection方法具有FormParam参数类型,因此我的猜测是admin cli不知道如何设置这些参数。

我已经在Keycloak问题积压中搜索了此问题,但找不到任何东西。

有人遇到此问题或有任何解决办法的想法吗?

1 个答案:

答案 0 :(得分:0)

在Keycloak v7中似乎也是一个问题,所以我决定创建一个脚本来解决此问题。

基本上,我请求一个令牌,然后使用该令牌调用 testLDAPConnection API。

这是脚本:

#!/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>