我有一个与JIRA Cloud实例交互的Google App Engine Python应用程序。
到目前为止,该应用程序使用基本身份验证对 JIRA 进行了 urlfetch
次调用,但由于它现在在 POST 和 GET 上进行了数十次单独的 REST 调用,我希望使用 cookie 身份验证可以在一定程度上减少延迟。
工作的基本身份验证代码示例:
result = urlfetch.fetch(jira_url,
deadline=60,
headers={"Authorization": "Basic %s" %
base64.b64encode("%s:%s" % (username, password))
})
和饼干替代品:
result = urlfetch.fetch(jira_url,
deadline=60,
headers={"X-Atlassian-Token": "no-check",
"Cookie": "JSESSIONID=529…snip…C4C"
})
我使用说明成功检索了 JSESSIONID,但 cookie 查询只会返回"401 - Unauthorized" error while loading this page.
错误,就好像 cookie 已过期一样。
{
"errorMessages" : [
"You do not have the permission to see the specified issue.",
"Login Required"
],
"errors" : {}
}
我正在从Memcache召回cookie,因为大多数交互都是从任务队列进行的,并且必然是一个单独的线程,但是cookie是在召回之前立即生成的。
cookie 未过期。问题的原因是 JSESSIONID 不是成功验证后续请求所需的唯一 cookie。
我遇到了同样的问题,并通过重新发送我在创建会话时从服务器获得的所有 cookie 来解决它。就我而言(JIRA 服务器托管在 Atlassian Cloud),这些必需的 cookie 是:atlassian.xsrf.token 和 studio.crowd.tokenkey。
我在这里发布了一篇详细的文章:JIRA REST API:Cookie-based Authentication。代码示例是 C# 格式的,但总体思路应该很清楚。