首页 > 解决方案 > IBM RTC Python 创建工作项

问题描述

我目前正在寻找可以帮助使用 XML 有效负载创建工作项的 python 脚本。我尝试了 RTCClient 但它对未来没有太大帮助,因此我正在通过 Python 的 Requests 库寻找脚本

我尝试了 cURL 命令,并且能够在 RTC 中创建工作项,但是当我尝试通过 Python 请求重复相同的操作时,我没有任何运气来实现它。下面是我用来实现相同目的的片段。在我上一次 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)

标签: pythonpython-3.7ibm-rational

解决方案


我猜您正在尝试复制我在某处看到的使用 Curl 分两步登录的示例 - 一个 GET 收集 cookie 然后一个 POST(因为 -d 数据包含在 Curl 命令中)进行表单身份验证,显式在 GET 上保存 cookie 并将这些 cookie 应用于后续命令。

您应该使用 requests 会话,因为它会为您完成所有 cookie 处理。

参考资料在这里,请参阅下面的标题FORM 挑战 https://jazz.net/wiki/bin/view/Main/NativeClientAuthentication。如果处理得当,当发出需要登录的请求时,响应会指出这一点并告诉您去哪里进行身份验证,这比像您的代码那样简单地对 URL 进行硬编码以及下面的简单示例是一个更好的计划。

笔记:

  1. 您应该注意的一点 - 身份验证在应用服务器上配置了超时,并且只要该超时未过期,进行显式登录将仅适用于后续请求,然后您将收到一个挑战,如果您忽略它,您将开始收到 403 响应。基本上,通常最好不要使用显式登录,而是始终尝试发出您想要发出的实际请求并检查响应标头(即使请求获得 200,例如登录前的 whoami,请参阅代码) 寻找身份验证的需要,然后进行登录,最后重放原始请求,由于需要身份验证,该请求不会产生任何影响。采取像这样处理每个请求的方法,然后通过重新身份验证自动处理身份验证到期。
  2. 下面的代码使用硬编码的 URL,因此如果 jts 上下文根从 /jts 更改,则将不起作用。在更健壮的实现中,几乎没有硬编码的 url - 显然您的代码需要知道应用程序的 URL,例如https://myserver.com:9443/ccm1然后我认为只需要最少的编码 - 例如j_security_checkrootservices- 每个其他 url 应该从根服务(项目目录)或响应中的内容/标题中找到。
  3. ccm 和 qm 自己进行身份验证,但 rm 委托给 jts 进行身份验证 - authrequired 的指示符告诉您去哪里,因此您不需要(不应该)对差异进行硬编码。
  4. 如参考资料中所述,您尝试直接登录时在 Tomcat 上不起作用,只有 Liberty。另请参阅有关重放 Tomcat 的原始请求的其他说明。

下面的代码复制了我对 Curl 登录序列的记忆,适用于使用 Liberty 用户注册表的 Form 登录 Liberty,这就是我对其进行测试的内容。YMMV 与其他身份验证机制,这绝对不适用于 Jazz 授权服务器,它为登录执行不同的重定向。

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)

推荐阅读