调用Duo Security /frame/prompt接口返回会话过期的问题排查
Duo Security自动化登录卡在Request 5步骤
我尝试用用户名和密码自动化登录集成Duo Security的门户,后续还要实现门户内操作,流程参考了@ajschauer在Stack Overflow的帖子,但卡在了Request 5步骤。
我的Python代码如下:
TARGET_URL = "https://..." session = Requests.Session() # Request 1 r1 = s.get(TARGET_URL) # Request 2 url2 = r1.url credentials = { "j_username": "username", "j_password": "password", "_eventId_proceed": ""} r2 = s.post(url2, data=credentials) # Parse information from Request 2 to use in Request 3 i1 = r2.text.index("data-host") i2 = r2.text.index("frameborder") data = r2.text[i1:i2] data = data.splitlines() data_host = data[0].split('"')[1] data_sig_request = data[1].split('"')[1] data_sig_request = data_sig_request[:data_sig_request.index(":APP")] data_post_action = data[2].split('"')[1] parent = "https://IDPZURL..." + data_post_action parent = parent.replace('/','%2F').replace(':','%3A').replace(';','%3B').replace('=','%3D').replace('?','%3F') # Request 3 url3 = "https://" + data_host + "/frame/web/v1/auth?tx=" + data_sig_request + "&parent=" + parent + "&v=2.6" headers3 = {'Referer': 'https://IDPZURL...'} s.headers.update(headers3) r3 = s.post(url3) # Request 4 url4 = url3.replace('=e1s1', '=e1s2') formdata4 = { 'tx': data_sig_request, 'parent': url2.replace('=e1s1','=e1s2'), 'v': '2.6', } r4 = s.post(url4, data=formdata4) # Parse information from Request 4 for use in Request 5 ss8 = re.search('value="',r4.text) ss9 = re.search('">\n<input type="hidden" id="js_parent" name="js_parent" value="', r4.text) sid = r4.text[ss8.span(0)[1]:ss9.span(0)[0]] sid = sid.replace('=','=').replace('|','|') # Request 5 url5 = "https://" + data_host + "/frame/prompt" # 我不确定该使用哪个factor,因为登录时从未要求任何形式的2FA formdata5 = { 'sid': sid, 'factor': 'Duo Push', 'device': 'phone1', } r5 = s.post(url5, data=formdata5) print(r5.text)
执行后返回结果:
{"stat": "FAIL", "message": "Your session has expired. Please try again."}
Request 4的响应中包含前缀为"AUTH..."的有效SID,格式如下:
<input type="hidden" id="js_cookie" name="js_cookie" value="AUTH...">
按照@ajschauer的方案,我需要从Request 5的响应中解析txid等信息,但该请求始终返回失败状态。我用Safari和Edge抓包分析登录流程,未发现对/frame/prompt的POST请求,但后续请求会用到该接口应返回的数据。
我查找了GitHub上的相关Issue,但无法适配到我的代码中——我的请求均未返回JSON数据,没法用sid=response.json()['response']["sid"]这类逻辑。我还尝试用该GitHub项目登录目标IDPZ地址,同样报错。
请问如何解决该问题?
内容的提问来源于stack exchange,提问作者Kid I3uu
相关产品推荐
相关产品推荐

