是否可以在单独的连接中使用基于Jira cookie的身份验证?



我正在尝试为Jira创建一个命令行客户端,但我真的不想存储用户名/密码,而且我不想在每个请求中都输入我的密码。

Jira 他们有一个基于cookie的API,但它看起来不像我想象的那样工作。

具体来说,当使用Python的requests库时,如果我有一个Session对象,我认为与Jira保持连接,我只能重用cookie。

但是,如果我尝试说,使requests.post请求和requests.get请求到REST URL,它以401失败并告诉我,我没有经过身份验证。哦,如果我创建一个Session,我可以做

session.post(.../rest/auth/1/session)
print(session.get(.../rest/auth/1/session).status_code)

我将得到我期望的200。

我注意到在请求响应头中有另一个cookie:

atlassian.xsrf.token=SOMETHING|RANDOM|lout

但是我在文档中没有看到任何相关内容

是否有可能这样做,或者如果我想在请求之间断开连接,我是否必须存储用户名/密码?

您是正确的,会话是必需的。来自文档:

  1. 客户端通过JIRA REST API为用户创建一个新的会话。JIRA返回一个会话对象,它包含会话的信息,包括会话cookie。客户端存储此会话对象。
  2. 客户端现在可以在头中为所有后续的JIRA REST API请求设置cookie。

换句话说,会话对于基于cookie的身份验证令牌的请求、接收和使用是不可或缺的。

同时,atlassian.xsrf.token将被atlassian注入,以防止跨站伪造和劫持会话/cookie。

在我看来,这是你简单但安全的选择:

  1. 对于脚本的每次调用,使用会话来请求-接收-保留cookie(然后,一旦所有API调用完成,让所有内容被丢弃)
  2. Base64对您的用户名和密码进行编码,将其存储在单独的文件中(如果您选择加密),并让脚本收集(并解密)它,然后将其放置在授权头中。请参阅在python脚本中隐藏密码(仅限不安全混淆)。

如果您遵循不在每次向API发送请求时都进行授权的目标,则应该使用基于cookie的身份验证/rest/auth/1/session(而不是Basic Auth)发送(POST)身份验证请求以获得令牌。然后,您将在随后对API的进一步请求(在Cookie头中)中使用获得的令牌,而无需授权每个请求。

注意API文档中缺失的重要部分:您应该发送用户名,而不是电子邮件,以基于cookie的方式进行授权。尽管这两种变体都适用于基本身份验证,但只有user适用于基于cookie的身份验证。

最新更新