Python请求访问JAMF遭SSO重定向,无法获取Session Token求助
解决JAMF SSO无JS限制获取Session Token的问题
当请求被重定向到SSO页面并提示需点击Continue按钮时,本质是需要提交页面内的SAML表单。因为requests不执行JavaScript,所以需要手动解析并提交这个表单,步骤如下:
- 解析SSO页面的SAML表单,提取提交地址和所有隐藏字段(如
SAMLRequest、RelayState) - 使用同一个Session提交表单,模拟点击Continue按钮的操作
- 提交表单后重新请求目标页面,即可获取Session Token
修改后的代码
首先安装依赖:
pip install beautifulsoup4
修改getSessionToken函数:
def getSessionToken(): import cookielib import requests from bs4 import BeautifulSoup jar = cookielib.CookieJar() s = requests.Session() s.cookies = jar # 初始登录请求 resp = s.post(f'{JAMF_HOST}/?failover', data={'username': JAMF_USERNAME, 'password': JAMF_PASSWORD, 'resetUsername': ''}) if resp.status_code != 200: print("Failed to Authenticate!") exit(1) # 处理SSO的SAML表单(模拟点击Continue按钮) soup = BeautifulSoup(resp.content, 'html.parser') saml_form = soup.find('form') if saml_form: form_action = saml_form.get('action') # 处理相对路径的action if not form_action.startswith('http'): form_action = f'{JAMF_HOST}{form_action}' # 提取所有表单字段 form_data = {} for input_tag in saml_form.find_all('input'): name = input_tag.get('name') value = input_tag.get('value') if name: form_data[name] = value # 提交表单 resp = s.post(form_action, data=form_data) if resp.status_code not in (200, 302): print("Failed to submit SSO form!") exit(1) # 请求目标页面获取session-token params = {"id": 29, "o": "r", "v": "management"} resp = s.get(f'{JAMF_HOST}/legacy/computers.html', params=params) # 提取session-token for line in resp.content.splitlines(): if b"session-token" in line: cleaned_line = line.decode('utf-8').translate(None, '<>\"') return cleaned_line.split('=')[-1] print("Unable to find session token") return None
关键说明
- Session复用:始终使用同一个
requests.Session()实例,自动维护登录过程中的Cookie,确保身份验证状态持续有效 - 表单解析:通过BeautifulSoup定位SAML表单,避免硬编码字段名,适配不同SSO页面的结构
- 路径处理:判断表单action是否为完整URL,避免相对路径导致的请求错误
内容的提问来源于stack exchange,提问作者Vibelord
相关产品推荐
相关产品推荐

