cURL-аутентификация с помощью mod_auth_openidc и keycloak

У меня есть сервер аутентификации, на котором работает Keycloak, и веб-сервер Apache2 с mod_auth_openidc для авторизации OAuth2.

С помощью браузеров я могу успешно перехватить доступ к защищенному ресурсу, чтобы перенаправить пользователя на страницу входа в Keycloak. После успешного входа в систему пользователь будет перенаправлен на ссылку ресурса.

С помощью Postman я также могу получить токен доступа JWT с потоком предоставления пароля, а затем использовать токен доступа для доступа к защищенному ресурсу. Код cURL, предоставленный почтальоном, указывает, что также требуется файл cookie mod_auth_openidc_session.

Затем я пытаюсь выполнить двухэтапную команду cURL в Linux CLI.

Сначала я извлекаю токен доступа, используя поток предоставления пароля, как показано ниже. Я инициировал механизм cookie для захвата файлов cookie сеанса, предоставленных mod_auth_openidc.

# RETRIEVE ACCESS TOKEN JSON
curl -L -b ./cookie.jar -c ./cookie.jar -d 'client_id=CLIENT_ID' -d 'client_secret=368127b1-1ee0-4f3f-8429-29e9a93daf9a' -d 'username=USERNAME' -d 'password=PASSWORD' -d 'grant_type=password' 'https://AUTH_SERVER:PORT/auth/realms/REALM/protocol/openid-connect/token

# PARSE ACCESS TOKEN
access_token=`echo $response|jq '.access_token'|cut -d\" -f2`

Затем, используя носитель токена доступа в заголовке и файле cookie jar, я пытаюсь получить доступ к защищенному ресурсу.

curl -b ./cookie.jar -c ./cookie.jar --insecure -L -X GET 'https://RESOURCE_SERVER:PORT/protected_content' --header "'Authorization: Bearer "$access_token"'"

Однако меня все равно перенаправили на страницу входа в Keycloak, а файл cookie сеанса не записывается в файл jar cookie.

Вот записанный jar-файл cookie с удаленной / замененной конфиденциальной информацией.

# Netscape HTTP Cookie File
# https://curl.haxx.se/docs/http-cookies.html
# This file was generated by libcurl! Edit at your own risk.

#HttpOnly_[AUTH_SERVER]     FALSE   /auth/realms/master/    TRUE    0       KC_RESTART      eyJhbGciOiJIUzI1NiIsInR5cCIgOiAiSldUIiwia2lkIiA6ICI2Y2ZiNjYwOC1kMTlhLTQwZGUtOWJiYS04NzcxOTkzZTIwMWUifQ.eyJjaWQi[REDACTED]4aHhkVDBGZmhBZEVTSm8iLCJub25jZSI6IndTYXNYOWhGeGIxd1hKakNrS2FLMXVadVRGX3ZOZzRGVUZnMTJyYXFWbVkifX0.53645krpwlFnJ09cHAcZhNCci-DhGigu4soN5CVsZQ0
#HttpOnly_[AUTH_SERVER]     FALSE   /auth/realms/master/    TRUE    0       AUTH_SESSION_ID_LEGACY  6a23b139-05ba-4d22-b9e3-9ae857074814.[AUTH_SERVER]
#HttpOnly_[AUTH_SERVER]     FALSE   /auth/realms/master/    TRUE    0       AUTH_SESSION_ID 6a23b139-05ba-4d22-b9e3-9ae857074814.[AUTH_SERVER]
#HttpOnly_[RESOURCE_SERVER]     FALSE   /       TRUE    0       mod_auth_openidc_state_XGEq0YKJAwSt8hxdT0FfhAdESJo      NVc9Mk1FmN[REDACTED]lydKVtOw0iL-Y9iZMjzcUinutFPn74rmVvI_ERV3C8Wn1Euio8pID0jEAmu9NEfY_MEeuzOzqe6w7I20HZUNQHX0uh_vXR8

Может ли кто-нибудь сказать мне, что я сделал не так в двухэтапном процессе аутентификации / авторизации cURL?


person wwwdavid34    schedule 27.10.2020    source источник


Ответы (1)


При установке заголовка Authorization у вас есть одинарные кавычки внутри двойных кавычек. Это означает, что вместо ожидания Authorization: Bearer token сервер получает 'Authorization: Bearer token'. Вы можете проверить содержимое ваших заголовков, используя параметр подробного -v.

Следующая команда должна работать должным образом:

curl --header "Authorization: Bearer $access_token" -b ./cookie.jar -c ./cookie.jar --insecure -L -X GET https://RESOURCE_SERVER:PORT/protected_content' 

При желании, если вам нужны двойные кавычки вокруг токена, используйте следующее:

--header "Authorization: Bearer \"$access_token\""

Боковое примечание: чтобы не перезаписывать существующие файлы cookie в cookie.jar, используйте другое имя файла для хранения файлов cookie от запроса к авторизованному файлу.

person bagljas    schedule 27.10.2020
comment
Спасибо! После некоторого исследования я понял, что пытаюсь выполнить аутентификацию OAuth20 с токеном доступа, в то время как я установил для mod_auth_opneidc значение AuthType = openid-connect. По сути, это заставило мой сервер ресурсов отвечать только на доступ браузера, но не на запросы OAuth20 носителя токена. Я пытаюсь сделать именно так, как описано в этой теме (github.com/zmartzone/mod_auth_openidc/ вопросов / 102). Функция добавлена ​​в mod_auth_openidc ›2.2.0. - person wwwdavid34; 05.11.2020