为什么使用不记名令牌对 Confluence 进行 API 调用在 Python 中不起作用?

问题描述 投票:0回答:1

我在使用 Python 的请求进行 API 调用时遇到一些奇怪的问题。我看过类似的问题,但它们都指向我已经实施的解决方案。

我尝试使用个人访问令牌 (PAT) 访问 Confluence 页面,但收到错误 401,当我检查令牌页面时,似乎从未使用过该令牌。

问题似乎不在于令牌的连接或有效性,因为:

  • 我尝试了很多代币
  • curl 调用有效
  • 使用
    auth=(user, pass)
    而不是令牌进行身份验证。
  • 来自子进程的curl 调用也可以工作。

看起来请求没有正确传递数据。我做错了什么?

import requests
token = 'abcdefg'
page_id = 12345

url = f'https://my.confluence.instance.com/rest/api/content/{page_id}'
h = {
    'Accept': 'Application/json',
    'Authorization': f'Bearer {token}'
}

response = requests.get(url, headers=h)
print(response.status_code)  # Prints 401

import subprocess
response = subprocess.run(
    f'curl -H "Authorization: Bearer {token}" {url}',
    shell=True,
    capture_output=True,
    text=True,
)
print(response)  # Correctly prints JSON with page information
python python-requests bearer-token confluence
1个回答
0
投票

我已经发现问题了。我在 .netrc 中有一些主机的凭据信息。默认情况下,请求强制使用来自 .netrc 的数据进行身份验证

我已经通过忽略.netrc解决了这个问题:

import requests
token = 'abcdefg'
page_id = 12345

url = f'https://my.confluence.instance.com/rest/api/content/{page_id}'
h = {
    'Accept': 'Application/json',
    'Authorization': f'Bearer {token}'
}

with requests.Session() as session:
    session.trust_env = False
    response = session.get(url, headers=h)

print(response.status_code)  # Prints 200!
© www.soinside.com 2019 - 2024. All rights reserved.