使用 urlfetch 使用 JSESSIONID cookie 身份验证时,JIRA REST API 调用失败

JIRA REST API calls fail when using JSESSIONID cookie authentication using urlfetch

我有一个与 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))
                        })

和 cookie 替代:

result = urlfetch.fetch(jira_url,
                        deadline=60,
                        headers={"X-Atlassian-Token": "no-check", 
                        "Cookie": "JSESSIONID=529…snip…C4C"
                        })

我使用说明成功检索到了 JSESSIONID,但 cookie 查询只会出现 return "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#写的,但是大意应该很清楚。