【发布时间】:2018-01-22 15:16:26
【问题描述】:
我正在尝试连接到在 apache 代理后面运行的 Jira REST API。我尝试使用 python-jira 模块来完成这项任务,只要我绕过 apache 代理授权直接连接到 Jira,它就可以正常工作。但是,随着 apache 代理启动,我不断收到“Err: 401 Unauthorized”错误。
问题是我需要提供两次授权凭据,一次用于代理,一次用于 Jira。
所有测试都在我的本地虚拟机上完成。
- apache 代理在标准端口 80 上运行,并将 127.0.0.1/jira 重定向到 127.0.0.1:8080/jira
- jira us 在 8080 端口上运行
这是有效的 curl 命令,其中:
- jirauser - 用于授权 jirapass 的 jira 用户
- 用于授权的jirapassword
- dGVzdDp3d3c= - 是 base64 编码的 proxyuser:proxypass 字符串
它实际上正在运行并产生结果
curl -u 'jirauser:jirapass' -X GET -H "Authorization: Basic dGVzdDp3d3c=" -H "Content-Type: application/json" "http://127.0.0.1/jira/rest/api/2/search?jql=key=DEV4"
对于 python-jira 模块,我认为我需要调整“选项”参数以将“授权:基本 dGVzdDp3d3c =”添加到“标题”列表中,但不知何故它不起作用。
from jira import JIRA, JIRAError
import sys
username="Jira_username"
password="Jira_password"
jira_options = {
'server': 'http://127.0.0.1/jira',
'verify': True,
'headers' : {
'X-Atlassian-Token': 'no-check',
'Cache-Control': 'no-cache',
'Content-Type': 'application/json',
'Authorization': 'Token token="dGVzdDp3d3c\="'
}
}
try:
jira = JIRA(
options = jira_options,
basic_auth = (username,password),
validate = True,
)
except JIRAError as e:
print("Failed in Jira connection initialisation with error [%s]" % e)
sys.exit()
我也尝试使用 requests 库进行直接调用
r = requests.get('http://127.0.0.1/jira/rest/api/2/search?jql=key=DEV4',auth=('jirauser','jirapass'),headers={'Content-Type': 'application/json','Authorization': "基本 %s " % "dGVzdDp3d3c="})
但结果又是:401错误
我真的很困惑为什么 curl 命令有效但 python 代码失败这里有什么问题? (由于 curl 正在工作,我认为这不是环境设置中的问题)
【问题讨论】:
-
您是否尝试过删除授权标头?这似乎与 basic_auth 冲突。当我连接到 jira 时,我通常不会传递额外的选项,也没有任何问题。
-
我在没有授权标头的情况下开始了我的测试,但它不起作用。问题是我需要首先通过代理授权(这就是我发现我需要 Authorization 标头的地方),然后通过使用 basic_auth 的 Jira 授权。我在上面显示的 CURL 请求有效。问题是如何让 python 做同样的工作。那是我开始尝试将授权参数插入标题的时候。
-
也许这会有所帮助? stackoverflow.com/questions/30872740/…