IBM RT C Python Создать рабочий элемент - PullRequest
0 голосов
/ 28 мая 2020

В настоящее время я ищу сценарий python, который может помочь в создании рабочего элемента с использованием полезной нагрузки XML. Я пробовал RTCClient, но это не очень поможет в будущем, и поэтому я ищу скрипт через библиотеку запросов из Python

Я пробовал команды cURL, и мне удалось создать рабочий элемент в RT C, но когда Я пытаюсь повторить то же самое через Python Requests, мне не повезло с этим. Ниже приведен фрагмент, который я использую для достижения того же. Во время последнего GET я получаю сообщение об ошибке HTML, поскольку «Javascript отключен или недоступен в вашем браузере». Я считаю, что моя аутентификация не работает должным образом через Python, тогда как то же самое отлично работает с cURL

Может ли кто-нибудь помочь в исправлении синтаксиса ниже

RTCCookieURL = 'https://clmtest:9443/jazz/authenticated/identity'
RTCGetCookie = requests.get(RTCCookieURL, verify=False)
RTCCookies=RTCGetCookie.cookies
print(RTCCookies)
RTCAuthURL = 'https://clmtest:9443/jazz/authenticated/j_security_check'
RTCHeaders = {
'Accept': 'text/xml',
'Content-Type': 'application/x-oslc-cm-change-request+xml'
}
RTCAuth = requests.get(RTCAuthURL, auth=HTTPBasicAuth('uname','pwd'), verify=False,      allow_redirects=True)
print(RTCAuth.cookies)
RTCGetCatalog = requests.get('https://clmtest:9443/jazz/oslc/workitems/catalog', verify=False,     cookies=RTCAuth.cookies)
print(RTCGetCatalog.content)

1 Ответ

0 голосов
/ 03 июля 2020

Думаю, вы пытаетесь воспроизвести пример, который я где-то видел, используя Curl для входа в систему в два этапа - GET для сбора файлов cookie, затем POST (потому что данные -d содержатся в команде Curl) для проверки подлинности формы , с явным сохранением файлов cookie в GET и применением этих файлов cookie к последующей команде (командам).

Вы должны использовать сеанс запросов, потому что он выполняет всю ie обработку за вас.

Справочный материал находится здесь, см. Ниже заголовок FORM challenge https://jazz.net/wiki/bin/view/Main/NativeClientAuthentication. При правильной обработке, при выполнении запроса, требующего входа в систему, ответ указывает на это и сообщает вам, где go для аутентификации, что является гораздо лучшим планом, чем просто жесткое кодирование URL-адресов, как это делает ваш код, и как это делает простой пример ниже.

Примечания:

  1. Один момент, о котором вам следует позаботиться: для аутентификации на сервере приложений настроен тайм-аут, и выполнение явного входа в систему будет работать только для последующих запросов до тех пор, пока этот таймаут не будет ' t истек, и тогда вы получите вызов, который, если вы его проигнорируете, начнете получать 403 ответа. По сути, лучше вообще не использовать явный вход в систему, а просто всегда пытаться сделать фактический запрос, который вы хотите сделать, и проверить заголовки ответов (даже если запрос получает 200, например whoami перед входом в систему, см. Код ), чтобы найти необходимость аутентификации, а затем выполнить вход и, наконец, воспроизвести исходный запрос, который не имел бы никакого эффекта, поскольку аутентификация была необходима. Возьмите подход к обработке каждого запроса, подобный этому, тогда истечение срока аутентификации автоматически обрабатывается повторной аутентификацией.
  2. В приведенном ниже коде используются жестко заданные URL-адреса, поэтому он не будет работать, если, например, контекст jts root изменится с / jts. В более надежной реализации есть несколько жестко запрограммированных URL-адресов - очевидно, ваш код должен знать URL-адрес приложения, например https://myserver.com: 9443 / ccm1 , и тогда я думаю, что требуется только минимальное кодирование - например, j_security_check и rootservices - все остальные URL-адреса должны быть найдены из корневых служб (каталог проекта) или из содержимого / заголовков в ответах.
  3. ccm и qm выполняют аутентификацию сами, но rm делегирует jts для аутентификации - индикаторы для authrequired сообщает вам, куда go, поэтому вам не нужно (не следует) жестко кодировать различия.
  4. Как указано в справочных материалах, прямой вход в систему при попытке не работает на 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)
...