带有SAP客户端的CSRF令牌Flask请求

时间:2017-12-07 14:39:23

标签: python flask sap csrf

我有以下Python代码。我正在尝试将一些数据发送到SAP系统。我打开了一个会话,如何从会话中获取csrf-token值?我已尝试使用client.cookies['csrftoken']查找它,但它会引发错误,可能是因为CSRF令牌不存在或者我没有使用正确的密钥名来获取CSRF令牌值。

早些时候,我尝试过没有使用简单的get请求打开会话,并且能够获取CSRF令牌值,但我认为令牌不成立,并且发现需要会话来维护令牌值。

打印print client.cookies只提供<RequestsCookieJar[<Cookie sap-usercontext=sap-client=100 for 34.239.8.24/>]>,打印print.client.headers提供{'Connection': 'keep-alive', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'User-Agent': 'python-requests/2.9.1'}。如何从此处找到CSRF令牌?

URL = "https://34.239.8.24:44300/sap/opu/odata/sap/ZRECEASY_PO_GL_POST_SRV/ZRECEASY_PO_GL_POSTSet"
    auth_get_po_data ='S4H_FIN','Welcome1'

    data = { "BUKR": 1710,"EBELN": 4500000004, "EBELP": 10,"EINDT": "20161103","OPEN_AMT": "3,000.00","PERC_REC_AMT": 0,"REC_AMT": 0, "ITEM_AMT": "3,000.00","INV_AMT": 0,"WAERS": "USD", "UPD_BY": "","UPD_DAT": "", "INV_APP": "", "SAKTO": "null", "KOSTL": "null", "AUFNR": "", "DESC": "", "KUNNR_NAM": "", "KUNNR": "", "COMMENT": "" }

    client = requests.session()

    client.get(URL, verify=False)
    print client.cookies  
    csrftoken = client.cookies['csrftoken']
    print csrftoken

    login_data = dict(username="S4H_FIN", password="Welcome1", csrftoken=csrftoken, next='/')
    r = client.post(URL, data=data, auth=auth_get_po_data, verify=False, headers=dict(Referer=URL))
    print (r.text)

1 个答案:

答案 0 :(得分:0)

可以通过先前对ABAP服务器的服务调用来检索这样的令牌。为此,首先在无变化调用(GET,HEAD,OPTIONS)上,客户端必须通过将HTTP标头X-CSRF-Token设置为值Fetch来获取此标记。 ABAP服务器在同一标头中返回CSRF令牌,并可使用标头X-CSRF-Token用于后续的服务器状态更改调用。 (如SAP在线帮助中所述) https://help.sap.com/saphelp_nw74/helpdata/de/55/74ed6c93654ee4999b4d07cdda532c/frameset.htm 最好的祝福, 安德烈