You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

调用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.19 12:40:29