Подтвердить что ты не робот

Как войти в 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)

4b9b3361

Ответ 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-адрес своим собственным.