Skip to content

Redirect to end_session_endpoint for idp_initiated logon when it is configured #13344

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 2 commits into from
Mar 28, 2025
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
13 changes: 10 additions & 3 deletions deps/rabbitmq_management/priv/www/js/oidc-oauth/helper.js
Original file line number Diff line number Diff line change
Expand Up @@ -154,9 +154,9 @@ export function oidc_settings_from(resource_server) {
automaticSilentRenew: true,
revokeAccessTokenOnSignout: true
}
if (resource_server.end_session_endpoint != "") {
if (resource_server.oauth_end_session_endpoint != "") {
oidcSettings.metadataSeed = {
end_session_endpoint: resource_server.end_session_endpoint
end_session_endpoint: resource_server.oauth_end_session_endpoint
}
}
if (resource_server.oauth_client_secret != "") {
Expand Down Expand Up @@ -214,6 +214,9 @@ export function oauth_initialize(authSettings) {
if (resource_server) {
oauth.sp_initiated = resource_server.sp_initiated
oauth.authority = resource_server.oauth_provider_url
if (resource_server.oauth_end_session_endpoint != "") {
oauth.oauth_end_session_endpoint = resource_server.oauth_end_session_endpoint
}
if (!resource_server.sp_initiated) return oauth;
else oauth_initialize_user_manager(resource_server)
}
Expand Down Expand Up @@ -311,7 +314,11 @@ export function oauth_initiateLogout() {
})

} else {
go_to_authority()
if (oauth.oauth_end_session_endpoint != null) {
location.href = oauth.oauth_end_session_endpoint
}else {
go_to_authority()
}
}
}

Expand Down
2 changes: 1 addition & 1 deletion deps/rabbitmq_management/src/rabbit_mgmt_wm_auth.erl
Original file line number Diff line number Diff line change
Expand Up @@ -72,7 +72,7 @@ oauth_provider_to_map(OAuthProvider) ->
end,
case OAuthProvider#oauth_provider.end_session_endpoint of
undefined -> Map0;
V -> maps:put(end_session_endpoint, V, Map0)
V -> maps:put(oauth_end_session_endpoint, V, Map0)
end.

skip_unknown_mgt_resource_servers(ManagementProps, OAuth2Resources) ->
Expand Down
14 changes: 7 additions & 7 deletions deps/rabbitmq_management/test/rabbit_mgmt_wm_auth_SUITE.erl
Original file line number Diff line number Diff line change
Expand Up @@ -788,31 +788,31 @@ should_return_oauth_client_id_z(Config) ->

should_not_return_end_session_endpoint(Config) ->
assert_attribute_not_defined_for_oauth_resource_server(authSettings(),
Config, rabbit, end_session_endpoint).
Config, rabbit, oauth_end_session_endpoint).

should_return_end_session_endpoint_0(Config) ->
assertEqual_on_attribute_for_oauth_resource_server(authSettings(),
Config, rabbit, end_session_endpoint, ?config(logout_url_0, Config)).
Config, rabbit, oauth_end_session_endpoint, ?config(logout_url_0, Config)).

should_return_end_session_endpoint_1(Config) ->
assertEqual_on_attribute_for_oauth_resource_server(authSettings(),
Config, rabbit, end_session_endpoint, ?config(logout_url_1, Config)).
Config, rabbit, oauth_end_session_endpoint, ?config(logout_url_1, Config)).

should_return_oauth_resource_server_a_without_end_session_endpoint(Config) ->
assert_attribute_not_defined_for_oauth_resource_server(authSettings(),
Config, a, end_session_endpoint).
Config, a, oauth_end_session_endpoint).

should_return_oauth_resource_server_a_with_end_session_endpoint_0(Config) ->
assertEqual_on_attribute_for_oauth_resource_server(authSettings(),
Config, a, end_session_endpoint, ?config(logout_url_0, Config)).
Config, a, oauth_end_session_endpoint, ?config(logout_url_0, Config)).

should_return_oauth_resource_server_a_with_end_session_endpoint_1(Config) ->
assertEqual_on_attribute_for_oauth_resource_server(authSettings(),
Config, a, end_session_endpoint, ?config(logout_url_1, Config)).
Config, a, oauth_end_session_endpoint, ?config(logout_url_1, Config)).

should_return_oauth_resource_server_a_with_end_session_endpoint_2(Config) ->
assertEqual_on_attribute_for_oauth_resource_server(authSettings(),
Config, a, end_session_endpoint, ?config(logout_url_2, Config)).
Config, a, oauth_end_session_endpoint, ?config(logout_url_2, Config)).

should_return_mgt_oauth_resource_rabbit_without_authorization_endpoint_params(Config) ->
assert_attribute_not_defined_for_oauth_resource_server(authSettings(),
Expand Down
15 changes: 13 additions & 2 deletions selenium/bin/components/fakeportal
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,10 @@ ensure_fakeportal() {
}

init_fakeportal() {
FAKEPORTAL_URL=${FAKEPORTAL_URL:-http://fakeportal:3000}
FAKEPORTAL_URL=${FAKEPORTAL_URL:-https://fakeportal:3000}
FAKEPORTAL_CONFIG_PATH=${FAKEPORTAL_CONFIG_PATH:-oauth/fakeportal}
FAKEPORTAL_CONFIG_DIR=$(realpath ${TEST_DIR}/${FAKEPORTAL_CONFIG_PATH})

FAKEPORTAL_DIR=${SCRIPT}/../../fakeportal
CLIENT_ID="${CLIENT_ID:-rabbit_idp_user}"
CLIENT_SECRET="${CLIENT_SECRET:-rabbit_idp_user}"
Expand All @@ -32,6 +35,9 @@ init_fakeportal() {
print "> CLIENT_ID: ${CLIENT_ID}"
print "> CLIENT_SECRET: ${CLIENT_SECRET}"
print "> RABBITMQ_URL: ${RABBITMQ_URL}"

generate-ca-server-client-kpi fakeportal $FAKEPORTAL_CONFIG_DIR

}
start_fakeportal() {
begin "Starting fakeportal ..."
Expand All @@ -40,6 +46,10 @@ start_fakeportal() {
kill_container_if_exist fakeportal
mocha_test_tag=($(md5sum $SELENIUM_ROOT_FOLDER/package.json))

MOUNT_FAKEPORTAL_CONF_DIR=$CONF_DIR/fakeportal
mkdir -p $MOUNT_FAKEPORTAL_CONF_DIR
cp ${FAKEPORTAL_CONFIG_DIR}/*.pem $MOUNT_FAKEPORTAL_CONF_DIR

docker run \
--detach \
--name fakeportal \
Expand All @@ -52,7 +62,8 @@ start_fakeportal() {
--env CLIENT_ID="${CLIENT_ID}" \
--env CLIENT_SECRET="${CLIENT_SECRET}" \
--env NODE_EXTRA_CA_CERTS=/etc/uaa/ca_uaa_certificate.pem \
-v ${TEST_CONFIG_DIR}/uaa:/etc/uaa \
-v ${TEST_CONFIG_PATH}/uaa:/etc/uaa \
-v ${MOUNT_FAKEPORTAL_CONF_DIR}:/etc/fakeportal \
-v ${FAKEPORTAL_DIR}:/code/fakeportal \
mocha-test:${mocha_test_tag} run fakeportal

Expand Down
68 changes: 68 additions & 0 deletions selenium/bin/components/oauth2-proxy
Original file line number Diff line number Diff line change
@@ -0,0 +1,68 @@
#!/usr/bin/env bash

OAUTH2_PROXY_DOCKER_IMAGE=bitnami/oauth2-proxy:7.7.1

ensure_oauth2-proxy() {
if docker ps | grep oauth2-proxy &> /dev/null; then
print "oauth2-proxy already running ..."
else
start_oauth2-proxy
fi
}
init_oauth2-proxy() {
KEYCLOAK_CONFIG_PATH=${KEYCLOAK_CONFIG_PATH:-oauth/keycloak}
KEYCLOAK_CONFIG_DIR=$(realpath ${TEST_DIR}/${KEYCLOAK_CONFIG_PATH})

OAUTH2_PROXY_CONFIG_PATH=${OAUTH2_PROXY_CONFIG_PATH:-oauth/oauth2-proxy}
OAUTH2_PROXY_CONFIG_DIR=$(realpath ${TEST_DIR}/${OAUTH2_PROXY_CONFIG_PATH})
OAUTH2_PROXY_URL=${OAUTH_PROVIDER_URL}

print "> KEYCLOAK_CONFIG_DIR: ${KEYCLOAK_CONFIG_DIR}"
print "> KEYCLOAK_URL: ${KEYCLOAK_URL}"
print "> KEYCLOAK_DOCKER_IMAGE: ${KEYCLOAK_DOCKER_IMAGE}"

print "> OAUTH2_PROXY_CONFIG_DIR: ${OAUTH2_PROXY_CONFIG_DIR}"
print "> OAUTH2_PROXY_URL: ${OAUTH2_PROXY_URL}"
print "> OAUTH2_PROXY_DOCKER_IMAGE: ${OAUTH2_PROXY_DOCKER_IMAGE}"

generate-ca-server-client-kpi oauth2-proxy $OAUTH2_PROXY_CONFIG_DIR

}
start_oauth2-proxy() {
begin "Starting oauth2-proxy ..."

init_oauth2-proxy
kill_container_if_exist oauth2-proxy

MOUNT_OAUTH2_PROXY_CONF_DIR=$CONF_DIR/oauth2-proxy
MOUNT_KEYCLOAK_CONF_DIR=$CONF_DIR/keycloak

mkdir -p $MOUNT_OAUTH2_PROXY_CONF_DIR
mkdir -p $MOUNT_KEYCLOAK_CONF_DIR
${BIN_DIR}/gen-oauth2-proxy-yaml ${OAUTH2_PROXY_CONFIG_DIR} $ENV_FILE $MOUNT_OAUTH2_PROXY_CONF_DIR/alpha-config.yaml
print "> EFFECTIVE OAUTH2_PROXY_CONFIG_FILE: $MOUNT_OAUTH2_PROXY_CONF_DIR/alpha-config.yaml"
cp ${OAUTH2_PROXY_CONFIG_DIR}/*.pem $MOUNT_OAUTH2_PROXY_CONF_DIR
cp ${KEYCLOAK_CONFIG_DIR}/*.pem $MOUNT_KEYCLOAK_CONF_DIR

docker run \
--detach \
--name oauth2-proxy \
--net ${DOCKER_NETWORK} \
--publish 8442:8442 \
--env OAUTH2_PROXY_COOKIE_SECRET=${OAUTH2_PROXY_COOKIE_SECRET} \
--env OAUTH2_PROXY_EMAIL_DOMAINS="*" \
--env OAUTH2_PROXY_COOKIE_DOMAINS="" \
--env OAUTH2_PROXY_WHITELIST_DOMAINS="*" \
--env OAUTH2_PROXY_COOKIE_CSRF_PER_REQUEST="true" \
--env OAUTH2_PROXY_COOKIE_CSRF_EXPIRE="5m" \
--env OAUTH2_PROXY_REDIRECT_URL="https://oauth2-proxy:8442/oauth2/callback" \
--env OAUTH2_PROXY_TLS_KEY_FILE=/etc/oauth2-proxy/certs/server_oauth2-proxy_key.pem \
--env OAUTH2_PROXY_TLS_CERT_FILE=/etc/oauth2-proxy/certs/server_oauth2-proxy_certificate.pem \
-v ${MOUNT_KEYCLOAK_CONF_DIR}:/etc/keycloak \
-v ${MOUNT_OAUTH2_PROXY_CONF_DIR}:/etc/oauth2-proxy \
${OAUTH2_PROXY_DOCKER_IMAGE} --alpha-config /etc/oauth2-proxy/alpha-config.yaml --cookie-secure=true

wait_for_oidc_endpoint oauth2-proxy $OAUTH2_PROXY_URL $MOUNT_OAUTH2_PROXY_CONF_DIR/ca_oauth2-proxy_certificate.pem
end "oauth2-proxy is ready"

}
20 changes: 20 additions & 0 deletions selenium/bin/gen-oauth2-proxy-yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
#!/usr/bin/env bash
SCRIPT="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"

#set -x

TEST_PATH=${1:?First parameter is the directory env and config files are relative to}
ENV_FILE=${2:?Second parameter is a comma-separated list of .env file which has exported template variables}
FINAL_CONFIG_FILE=${3:?Forth parameter is the name of the final config file. It is relative to where this script is run from}

source $ENV_FILE

parentdir="$(dirname "$FINAL_CONFIG_FILE")"
mkdir -p $parentdir

echo "" > $FINAL_CONFIG_FILE

for f in $($SCRIPT/find-template-files $TEST_PATH "alpha-config" "yaml")
do
envsubst < $f >> $FINAL_CONFIG_FILE
done
74 changes: 63 additions & 11 deletions selenium/bin/suite_template
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@ tabs 1
declare -i PADDING_LEVEL=0
declare -i STEP=1
declare -a REQUIRED_COMPONENTS
declare -a INIT_ONLY_COMPONENTS

find_selenium_dir() {
TEST_PATH=$1
Expand Down Expand Up @@ -112,6 +113,7 @@ init_suite() {

begin "Initializing suite $SUITE ..."
print "> REQUIRED_COMPONENTS: ${REQUIRED_COMPONENTS[*]}"
print "> INIT_ONLY_COMPONENTS: ${INIT_ONLY_COMPONENTS[*]}"
print "> TEST_CASES_DIR: ${TEST_CASES_DIR} "
print "> TEST_CONFIG_DIR: ${TEST_CONFIG_DIR} "
print "> DOCKER_NETWORK: ${DOCKER_NETWORK} "
Expand Down Expand Up @@ -218,20 +220,37 @@ wait_for_oidc_endpoint_docker() {
calculate_rabbitmq_url() {
echo "${RABBITMQ_SCHEME:-http}://$1${PUBLIC_RABBITMQ_PATH:-$RABBITMQ_PATH}"
}

calculate_forward_proxy_url() {
PROXIED_URL=$1
PROXY_HOSTNAME=$2
PROXY_PORT=$3
SCHEME=$(echo "$PROXIED_URL" | cut -d: -f1)
PATH=$(echo "$PROXIED_URL" | cut -d/ -f4-)
echo "$SCHEME://$PROXY_HOSTNAME:$PROXY_PORT/$PATH"
}
wait_for_url() {
BASE_URL=$1
BASE_URL=$1
if [[ $BASE_URL == *"localhost"** ]]; then
wait_for_url_local $BASE_URL
wait_for_url_local $@
else
wait_for_url_docker $BASE_URL
wait_for_url_docker $@
fi
}
wait_for_url_local() {
url=$1
proxy=${2:-none}
proxy_user=${3:-none}
proxy_pass=$4
curl_args="-L -f -v"
max_retry=10
counter=0
until (curl -L -f -v $url >/dev/null 2>&1)
if [[ "$proxy" != "none" && "$proxy" != "" ]]; then
curl_args="--proxy ${proxy} ${curl_args}"
fi
if [[ "$proxy_user" != "none" && "$proxy_user" != "" ]]; then
curl_args="--proxy-user ${proxy_user}:${proxy_pass} ${curl_args}"
fi
until (curl $curl_args $url >/dev/null 2>&1)
do
print "Waiting for $url to start (local)"
sleep 5
Expand All @@ -244,7 +263,14 @@ wait_for_url_docker() {
url=$1
max_retry=10
counter=0
until (docker run --net ${DOCKER_NETWORK} --rm curlimages/curl:7.85.0 -L -f -v $url >/dev/null 2>&1)
curl_args="-L -f -v"
if [[ "$proxy" != "none" && "$proxy" != "" ]]; then
curl_args="--proxy ${proxy} ${curl_args}"
fi
if [[ "$proxy_user" != "none" && "$proxy_user" != "" ]]; then
curl_args="--proxy-user ${proxy_user}:${proxy_pass} ${curl_args}"
fi
until (docker run --net ${DOCKER_NETWORK} --rm curlimages/curl:7.85.0 $curl_args $url >/dev/null 2>&1)
do
print "Waiting for $url to start (docker)"
sleep 5
Expand Down Expand Up @@ -377,7 +403,8 @@ profiles_with_local_or_docker() {
generate_env_file() {
begin "Generating env file ..."
mkdir -p $CONF_DIR
${BIN_DIR}/gen-env-file $TEST_CONFIG_DIR $ENV_FILE
${BIN_DIR}/gen-env-file $TEST_CONFIG_DIR ${ENV_FILE}.tmp
grep -v '^#' ${ENV_FILE}.tmp > $ENV_FILE
source $ENV_FILE
end "Finished generating env file."
}
Expand Down Expand Up @@ -475,6 +502,9 @@ generate-client-keystore-if-required() {
fi
}

initOnly() {
determine_init_only_components $@
}
run() {
runWith rabbitmq
}
Expand Down Expand Up @@ -525,6 +555,12 @@ elif [[ "$COMMAND" == "stop-rabbitmq" ]]
test_local ${BASH_REMATCH[1]}
fi
}
determine_init_only_components() {
for (( i=1; i<=$#; i++)) {
eval val='$'$i
INIT_ONLY_COMPONENTS+=( "$val" )
}
}
determine_required_components_including_rabbitmq() {
for (( i=1; i<=$#; i++)) {
eval val='$'$i
Expand Down Expand Up @@ -560,7 +596,7 @@ run_on_docker_with() {
build_mocha_image
start_selenium

trap teardown_components EXIT
trap "teardown_components" EXIT

start_components
test
Expand Down Expand Up @@ -637,11 +673,27 @@ ensure_components() {
start_components() {
for i in "${REQUIRED_COMPONENTS[@]}"
do
start="start_$i"
$start
local ret=$(is_init_only_component $i)
if [[ $ret == 1 ]]
then
init="init_$i"
$init
else
start="start_$i"
$start
fi
done
}

is_init_only_component() {
for i in "${INIT_ONLY_COMPONENTS[@]}"
do
if [[ $i == $1 ]]
then
return 1
fi
done
return 0
}
teardown_components() {
skip_rabbitmq=${1:-false}

Expand Down
Loading
Loading