Думаю, вы пытаетесь воспроизвести пример, который я где-то видел, используя Curl для входа в систему в два этапа - GET для сбора файлов cookie, затем POST (потому что данные -d содержатся в команде Curl) для проверки подлинности формы , с явным сохранением файлов cookie в GET и применением этих файлов cookie к последующей команде (командам).
Вы должны использовать сеанс запросов, потому что он выполняет всю ie обработку за вас.
Справочный материал находится здесь, см. Ниже заголовок FORM challenge https://jazz.net/wiki/bin/view/Main/NativeClientAuthentication. При правильной обработке, при выполнении запроса, требующего входа в систему, ответ указывает на это и сообщает вам, где go для аутентификации, что является гораздо лучшим планом, чем просто жесткое кодирование URL-адресов, как это делает ваш код, и как это делает простой пример ниже.
Примечания:
- Один момент, о котором вам следует позаботиться: для аутентификации на сервере приложений настроен тайм-аут, и выполнение явного входа в систему будет работать только для последующих запросов до тех пор, пока этот таймаут не будет ' t истек, и тогда вы получите вызов, который, если вы его проигнорируете, начнете получать 403 ответа. По сути, лучше вообще не использовать явный вход в систему, а просто всегда пытаться сделать фактический запрос, который вы хотите сделать, и проверить заголовки ответов (даже если запрос получает 200, например whoami перед входом в систему, см. Код ), чтобы найти необходимость аутентификации, а затем выполнить вход и, наконец, воспроизвести исходный запрос, который не имел бы никакого эффекта, поскольку аутентификация была необходима. Возьмите подход к обработке каждого запроса, подобный этому, тогда истечение срока аутентификации автоматически обрабатывается повторной аутентификацией.
- В приведенном ниже коде используются жестко заданные URL-адреса, поэтому он не будет работать, если, например, контекст jts root изменится с / jts. В более надежной реализации есть несколько жестко запрограммированных URL-адресов - очевидно, ваш код должен знать URL-адрес приложения, например https://myserver.com: 9443 / ccm1 , и тогда я думаю, что требуется только минимальное кодирование - например,
j_security_check
и rootservices
- все остальные URL-адреса должны быть найдены из корневых служб (каталог проекта) или из содержимого / заголовков в ответах. - ccm и qm выполняют аутентификацию сами, но rm делегирует jts для аутентификации - индикаторы для authrequired сообщает вам, куда go, поэтому вам не нужно (не следует) жестко кодировать различия.
- Как указано в справочных материалах, прямой вход в систему при попытке не работает на Tomcat, только Liberty . Также обратитесь к другому примечанию о воспроизведении исходного запроса для Tomcat.
Этот код ниже воспроизводит то, что я помню о последовательности входа в Curl, работает для входа в систему с помощью формы в Liberty с использованием реестра пользователей Liberty, и это с чем я это тестировал. YMMV с другими механизмами аутентификации, и это определенно не будет работать для Jazz Authorization Server, который выполняет другое перенаправление для входа в систему.
import requests
import urllib3
# Disable the InsecureRequestWarning - pointless having warnings when
# accessing temporary servers which only ever have self-signed certs
urllib3.disable_warnings(urllib3.exceptions.InsecureRequestWarning)
SERVER = "https://clmtest:9443"
JTSCookieURL = SERVER+'/ccm/authenticated/identity'
JTSAuthURL = SERVER+'/ccm/j_security_check'
JTSWHOAMI = SERVER+"/ccm/whoami"
RootServices = SERVER+'/ccm/rootservices'
USERNAME='fred'
PWD = 'fred'
# get a session - use this for *every* request to the server
s = requests.session()
# when not authenticated, whoami returns 200 with HTML :-( - but it's a good test of authentication success
GetWhoAmI = s.get(JTSWHOAMI, verify=False)
print( f"{GetWhoAmI=}" )
# whoami when authenticated returns the user id - this is always on the jts
# or when not authenticated returns html
if GetWhoAmI.content != SERVER+"/jts/users/"+USERNAME:
print( "NOT AUTHENTICATED YET!!!")
else:
raise Exception( "We are authenticated which should never happen before we login" )
#
# This works for (default) form authentication using Liberty user registry
#
# do a get to load up session with cookies
GetCookie = s.get(JTSCookieURL, verify=False)
print( f"{GetCookie=}" )
# do a post to authenticate
Auth = s.post(JTSAuthURL, data = { 'j_username': USERNAME, 'j_password': PWD}, verify=False,allow_redirects=True)
print(f"{Auth=}")
# now you can get protected resource - whoami
GetWhoAmI = s.get(JTSWHOAMI, verify=False)
print( f"{GetWhoAmI=}" )
if GetWhoAmI.text != SERVER+"/jts/users/"+USERNAME:
# print( "NOT AUTHENTICATED!!!")
raise Exception( "NOT AUTHENTICATED" )
else:
print( "HURRAY WE ARE AUTHENTICATED" )
# now you can get protected resources, starting with rootservices
GetRootServices = s.get(RootServices, verify=False)
print( f"{GetRootServices=}" )
#print(GetRootServices.content)