Войдите в серверное приложение IBM Rational Quality Manager с помощью аутентификации FORM-BASED
Я не могу понять, что я делаю неправильно, когда пытаюсь войти в IBM Rational Quality Manager из RESTClient. Может быть, кто-то найдет этот вопрос очень простым, чтобы помочь мне, но я наткнулся на него вчера и не могу решить эту проблему около двух дней. Все отлично работает, если я использую утилиту curl.exe:
set COOKIES=cookies.txt
set USER=jts
set PASSWORD=jts
set HOST="https://jazz.server.com:9443/qm"
curl -k -c %COOKIES% "%HOST%/authenticated/identity"
curl -k -L -b %COOKIES% -c %COOKIES% -d j_username=%USER% -d j_password=%PASSWORD% "%HOST%/authenticated/j_security_check"
Вы можете видеть, что у меня хороший результат с параметром JSESSIONID, возвращенным с куки:
# Netscape HTTP Cookie File
# https://curl.haxx.se/docs/http-cookies.html
# This file was generated by libcurl! Edit at your own risk.
#HttpOnly_jazz.server.com FALSE / TRUE 0 LtpaToken2 0VkNWt7dIquUiEJJ4XlPqEgsIKW/PJD2x4ckihZTCC6Iofo+KGtXYUuWhwk8wLnQZCxA0SP9/lgkWte/sH3/3k1HFFbM7UX07pFbh/MxVBcGtzY9Yr2YC6T3jZClxVDOU2R6fQk1SAu8/6Mia9LgrBnqsvauldoChU0ZFEDhI/ogHbyUKsOhM8gZNx8kJrkUCj0NPOci07UjKgILCorDZoiw5uYAIyC07ZBS6CY3juxkwgkYXwRCbyhpZY6dEeQg+CE97OwFhQCO7KesrflVF6xGRmEiz7f5DDG7oscqM72HJ9SF4zSMgKBko38l60ba
#HttpOnly_jazz.server.com FALSE / TRUE 0 JSESSIONID 0000bzfBh88AbZ6yGgn-IVAccGA:34261533-f9f3-43a1-a58d-95e3dfca7322
#HttpOnly_jazz.server.com FALSE /qm/authenticated/ TRUE 0 X-com-ibm-team-foundation-auth-loop-avoidance false
Но если я использую RESTClient, я делаю первый запрос GET:
Method: GET<br>
URI: https://jazz.server.com:9443/qm/authenticated/identity
Возвращаемые заголовки:
Status Code: 200 OK
Cache-Control: no-cache="set-cookie, set-cookie2"
Content-Encoding: gzip
Content-Language: en-US
Content-Length: 1028
Content-Type: text/html; charset=UTF-8
Date: Mon, 18 Sep 2017 17:33:06 GMT
Expires: Thu, 01 Dec 1994 16:00:00 GMT
Set-Cookie: JazzFormAuth=Form; Path=/qm; Secure
X-Powered-By: Servlet/3.0
X-com-ibm-team-repository-web-auth-msg: authrequired
Затем я делаю второй запрос POST:
Method: POST<br>
URI: https://jazz.server.com:9443/qm/authenticated/j_security_check?j_username=jts&j_password=jts
Возвращенные заголовки:
Status Code: 400 Bad Request
Connection: Close
Content-Language: en-US
Content-Length: 757
Content-Type: text/html;UTF-8
Date: Mon, 18 Sep 2017 18:35:02 GMT
X-Powered-By: Servlet/3.0
Может кто-нибудь сказать мне, в чем здесь разница? Почему это не работает? Большое спасибо за любую помощь заранее! Я сейчас на самом деле в тупике!
1 ответ
Я испытал те же проблемы, что и у вас. К сожалению, настройки хранилища cookie недостаточно, вам нужно вручную извлечь значение jsession и отправить его в виде заголовка подделки межсайтового запроса. Я опубликую выдержку из сценария powershell, который делает именно это, он должен быть понятным и переносимым для других сред сценариев и программирования. Я сократил строки до 3 основных шагов:
# fetch required cookies with a "failed" attempt at reaching a location
# that requires auth
./curl.exe -v -k -L `
--cookie $cookies `
--cookie-jar $cookies `
"${server}authenticated/identity"
# now that we have the cookies, we can send our login information with proper
# cookies and credentials
./curl.exe -v -k -L `
--cookie $cookies `
--cookie-jar $cookies `
--data j_username=$username `
--data j_password=$password `
"${server}j_security_check"
# get the cookie value that we need to pass as a special header
$pattern = "JSESSIONID\s+([^\s]+)"
$cookieValue = Select-String -Path $cookies -Pattern $pattern |
%{ $_.matches } |
%{ $_.groups[1].value } |
Select-Object -Unique
# we now have the cookies and also the jsessionid that we need.
./curl.exe -v -k -L `
--cookie $cookies `
--cookie-jar $cookies `
--header X-Jazz-CSRF-Prevent:$cookieValue `
-- other stuff to complete the call.
Обратите внимание на строку со второй по последнюю, где заголовок X-Jazz-CSRF-Prevent установлен на идентификатор JSESSION. Это важный момент, который теряется при попытке имитировать взаимодействие с браузером из обычной среды командной строки.