Как войти в spring форму для входа в систему с помощью CURL?
Я работаю над проектом springMVC, в котором аутентификация пользователя основана на безопасности spring.
идея состоит в том, чтобы мобильное (андроидное) приложение могло отправлять какие-то данные в бэкэнд.
Итак, прежде чем моя рука загрязнена в разработке Android, я решил издеваться над формой входа в систему, используя CURL.
форма входа на нашем сайте следующая:
http://localhost:8080/app/user/login
и я использую следующую команду:
curl -F 'username=admin&password=admin' http://localhost:8080/app/user/login
но все же я получу страницу входа, другими словами, я не могу пройти аутентификацию пользователя на основе макетной ситуации.
просто отметить: для каждого запроса защита spring создаст токен рандомизации, что-то похожее на:
8863F732ADDE24CD167F4EF502A4333D
как мне пройти регистрационную форму на основе безопасности spring с использованием макетной ситуации (либо CURL
, либо HTTPClient
)
Ответы
Ответ 1
Используйте cURL
следующим образом:
curl -d j_username=admin -d j_password=admin -L http://localhost:8080/app/j_spring_security_check
CSRF
Если вы получаете что-то вроде Expected CSRF token not found. Has your session expired?
, это означает, что защита маркера CSRF включена. Чтобы проверить его с помощью cURL, вам нужен куки файл и сам токен CSRF.
Следующая команда будет записывать все файлы cookie в файл с именем cookie
и распечатывать токен CSRF. Spring Имя параметра маркера безопасности по умолчанию _csrf
, если вы его изменили, вам также нужно изменить grep csrf
.
curl --cookie-jar cookie -L http://localhost:8080/app/j_spring_security_check | grep csrf
Затем вы можете выполнить следующую команду, которая будет передавать все файлы cookie из файла. Не забудьте заменить |your_token_value|
на фактическое значение, которое выводится предыдущей командой (и _csrf
имя параметра, если вы его изменили).
curl --cookie cookie -d "j_username=admin&j_password=admin&_csrf=|your_token_value|" -L http://localhost:8080/app/j_spring_security_check
От Spring Безопасность 3.x до 4.x
Обратите внимание, что в Spring значение безопасности 4.x по умолчанию для login-processing-url
изменено с /j_spring_security_check
на POST /login
, значение по умолчанию для username-parameter
изменилось с j_username
на username
и значение по умолчанию для password-parameter
изменен с j_password
на password
. Если приложение явно предоставляет эти атрибуты, для миграции не требуется никаких действий.
Ответ 2
Основываясь на самом голосовавшем ответе, я написал следующее script:
#!/usr/bin/env bash
curl --cookie-jar cookie -L http://localhost:PORT/secureDomain/secureURL
TOKEN=$( cat cookie | grep 'XSRF' | cut -f7 )
curl --cookie cookie -u admin:admin -d "_csrf=$TOKEN" -L http://localhost:PORT/secureDomain/secureURL
Работает для Spring Безопасность 4.
Ответ 3
Вы должны настроить spring для поддержки базовой проверки подлинности. Затем добавьте к вашему запросу следующий заголовок:
- name:
Authorization
- значение:
base64(username:password)
Это означает, что имя пользователя и пароль должны быть объединены в одну строку с :
в качестве разделителя и затем преобразованы с использованием преобразования BASE64
.
Ответ 4
Если CSRF включен, вам нужно записать значение токена из вывода каждого запроса, чтобы использовать его в следующем.
BASEURL="http://localhost:8080/hac"
csrf=$(curl --silent --cookie-jar cookies.txt -L "$BASEURL/login.jsp" | egrep -o -m1 "[a-z0-9]{8}-[a-z0-9]{4}-[a-z0-9]{4}-[a-z0-9]{4}-[a-z0-9]{12}")
csrf=$(curl --silent --cookie cookies.txt --cookie-jar cookies.txt -L "$BASEURL/j_spring_security_check" --data "j_username=$USERNAME&j_password=$PASSWORD&_csrf=$csrf" | egrep -o -m1 "[a-z0-9]{8}-[a-z0-9]{4}-[a-z0-9]{4}-[a-z0-9]{4}-[a-z0-9]{12}" )
Вы можете выставить больше команд таким образом, обновляя значение $csrf
каждый раз.
Это работало на Spring безопасности 3.
Ответ 5
Этот скрипт работал для меня с Spring Boot 2.1.6 и Spring Security 5.1.5:
# Obtain the CSRF token _plus_ the JSESSIONID cookie to go along with it.
export CSRF_TOKEN=$(curl -s -c cookies.txt -L http://localhost:8080/login | \
grep -Eo "name=\"_csrf\" value=\"[0-9a-z-]+\"" | cut -d= -f3 | tr -d '"')
echo "Found csrf token: $CSRF_TOKEN"
# Login with the username and password, reading from (-b) and updating (-c) the cookie jar file.
curl -s -c cookies.txt -b cookies.txt -X POST \
-F "username=admin" -F "password=password" -F "_csrf=$CSRF_TOKEN" http://localhost:8080/login
SESSION_ID=$(grep "JSESSIONID" cookies.txt | cut -f 7)
echo "Got session token: $SESSION_ID"
# Finally, execute authorized API action
curl -sL -b cookies.txt "http://localhost:8080/authorized/url"
Ответ 6
Мне недостаточно использовать только опции -d. Наше веб-приложение размещено на Tomcat, находится в папке webapps/ROOT и имеет следующую конфигурацию:
<form-login login-page="/login.jsp"
authentication-success-handler-ref="appAuthenticationSuccessHandler"
authentication-failure-handler-ref="appAuthenticationFailureHandler"
username-parameter="j_username"
password-parameter="j_password"
login-processing-url="/j_spring_security_check"/>
<csrf disabled="true"/>
<headers>
<frame-options policy="SAMEORIGIN"/>
</headers>
Следующее работает для отправки запроса POST нашему веб-приложению (при условии, что Tomcat прослушивает порт 8080):
curl -i -H "Content-Type: application/x-www-form-urlencoded" -c cookies.txt -H "Origin: http://localhost:8080/" -d "j_username=USERNAME&j_password=PASSWORD" -X POST http://localhost:8080/j_spring_security_check
curl -i -d @JSON_FILE -H "Content-Type: application/json" -H "Origin: http://localhost:8080/" -b cookies.txt -X POST http://localhost:8080/URL
Замените USERNAME, PASSWORD, JSON_FILE и URL-адрес своим собственным.