组织启用2FA无管理员权限时Python如何连接自托管Jira API
可行解决方案(均无需Jira管理员权限)
你不需要在OAuth方案上继续投入时间,自托管Jira的OAuth1.0a鉴权确实必须由管理员提前创建Application Link,普通用户无配置权限。以下三个方案按落地优先级从高到低测试即可:
方案1:Bearer请求头直接拼接OTP码(原生支持,最推荐)
自托管Jira(Server/Data Center版本)原生支持PAT+OTP的拼接校验逻辑,不需要额外配置特殊请求头,直接将当前有效6位OTP码拼在已生成的PAT后面,用英文冒号分隔,放在原有Authorization头里即可完成校验。
示例代码:
import requests JIRA_BASE_URL = "https://你的自托管Jira域名" PERSONAL_ACCESS_TOKEN = "你已创建的PAT字符串" # 若使用TOTP类认证器(如Google Authenticator、微软验证器),可直接输入当前6位动态码;也可接入pyotp库通过TOTP种子本地生成,无需手动输入 CURRENT_OTP = input("请输入当前6位OTP验证码:") headers = { "Authorization": f"Bearer {PERSONAL_ACCESS_TOKEN}:{CURRENT_OTP}", "Accept": "application/json" } # 首次请求带OTP完成2FA校验 response = requests.get(f"{JIRA_BASE_URL}/rest/api/2/myself", headers=headers) response.raise_for_status() print("连接成功,当前登录用户:", response.json()["displayName"]) # 同一会话后续的所有API请求无需重复携带OTP,直接复用requests的Session保持连接即可 session = requests.Session() session.headers.update(headers) # 后续请求直接调用session.get()/session.post()即可正常访问
注意:OTP为一次性校验凭证,仅需要在会话首次请求时携带,校验通过后同一会话的后续请求不会再触发2FA拦截。
方案2:复用浏览器登录态Cookie(适配第三方SSO 2FA场景)
如果你们的Jira 2FA是通过第三方SSO插件(如Okta、Azure AD、企业身份认证系统等)实现,方案1的原生拼接逻辑不生效时,可以直接复用你网页端登录后的Cookie访问API,全程不需要管理员权限:
- 用浏览器正常登录Jira,完成2FA校验进入主页
- 打开浏览器开发者工具(按F12唤起)- 应用(Application)- Cookie - 选中你的Jira域名
- 复制
JSESSIONID和atlassian.xsrf.token两个字段的值 - 请求时直接携带这两个Cookie即可,示例代码:
import requests JIRA_BASE_URL = "https://你的自托管Jira域名" cookie_dict = { "JSESSIONID": "从浏览器复制的JSESSIONID值", "atlassian.xsrf.token": "从浏览器复制的xsrf token值" } resp = requests.get(f"{JIRA_BASE_URL}/rest/api/2/myself", cookies=cookie_dict) resp.raise_for_status() print("连接成功,当前登录用户:", resp.json()["displayName"])
该方案缺点是Cookie有有效期(通常为数小时到数天,依组织安全策略而定),过期后重新从浏览器复制新值即可;优点是完全适配所有类型的2FA/SSO逻辑,只要你本人能正常登录网页版Jira就能用。
方案3:申请账号级API 2FA豁免(适合长期无人值守脚本)
如果你的脚本需要长期稳定运行,不想每次手动输入OTP或更新Cookie,可以直接联系组织内的Jira管理员,给你的个人账号开启「API访问豁免2FA」的用户级权限,该权限不需要你本人具备项目/系统管理员角色,开启后你已生成的PAT可以直接作为Bearer token调用API,不会再触发OTP校验。
内容的提问来源于stack exchange,提问作者Liz
相关产品推荐
相关产品推荐

