2016-02-25 92 views
0

我有一個與JIRA Cloud實例交互的Google App Engine Python應用程序。使用使用urlfetch的JSESSIONID Cookie身份驗證時,JIRA REST API調用失敗

迄今爲止,應用程序使用基本認證調用了JIRA的urlfetch,但是因爲它現在正在創建許多單獨的REST調用POST和GET我希望使用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" : {} 
} 

我回顧從內存緩存中的cookie,因爲大多數的相互作用是從任務隊列製成,不一定是單獨的線程,但召回之前剛剛生成的cookie。

回答

3

Cookie未過期。問題的原因是JSESSIONID不是成功驗證後續請求所需的唯一cookie。

我遇到了同樣的問題,並通過重新發送創建會話時從服務器獲得的所有Cookie來解決此問題。在我的情況下(JIRA服務器託管在Atlassian Cloud)這些必需的cookie是:atlassian.xsrf.token和studio.crowd.tokenkey。

我在這裏發表了一篇詳細的文章:JIRA REST API: Cookie-based Authentication。代碼示例是用C#編寫的,但總體思路應該清晰。