通过 Discourse API 访问,key 或 user 被拒绝

作为版主,我想为 discourse 论坛使用 API。通常它已激活,并且我设法获得了一个 API 密钥。我使用了这个脚本:

我设法检索了一个 32 个字符长的密钥(是这样吗?),并且在我账户的安全设置中,该应用程序显示了这些权限:

读取所有
写入所有
实时更新
推送通知到外部服务
读取和清除通知
读取用户会话信息
创建一次性登录令牌

这看起来不错。但是,当我尝试使用以下脚本访问时:

from pydiscourse import DiscourseClient

client = DiscourseClient(
        'https://forum.example.com',
        api_username='tflidd',
        api_key='388b79103056fede1d3223dae032df99')

client.user("tflidd")

这是一个 Python 库,所以我认为它应该可以工作。api_key 具有这种特定格式,它不是实际的密钥。我收到了用户名或 API 密钥无效的错误。

我应该使用我的用户名还是应用程序名称?
API 密钥至少是正确的格式吗,也许解密时出了什么问题?

如果我像这里一样使用 curl (Discourse-user-notes API - #4 by codetricity):

curl https://forum.example.com/t/95783.json\ -H 'Api-Key: 388b79103056fede1d3223dae032df99'\ -H 'Api-Username: tflidd'

我也收到一个错误:
{"errors":["You are not permitted to view the requested resource. The API username or key is invalid."],"error_type":"invalid_access"}

如果我在已登录的网页浏览器中打开相同的 URL 和 json,网页浏览器会显示正确的 json 对象。所以主题存在,并且我有权限访问它(这甚至是一个公开的主题)。

我只是版主,没有直接的管理员访问权限。如果你有关于日志的提示,我可以向管理员请求更多信息。

如果这很重要,已安装的版本是:3.2.0.beta4-dev

DiscourseClient Python 库旨在与 管理员 API 密钥(管理员 → API)配合使用。
您从 generate_api_key 生成的是 客户端 API 密钥
您需要改用 API-User-KeyAPI-User-Username 标头。
例如:

curl https://forum.example.com/t/95783.json -H 'Api-User-Key: 388b79103056fede1d3223dae032df99' -H 'Api-User-Username: tflidd'

:+1: 这可以工作,你不知道我花了多少时间。

但是 API 端点与此处描述的相同

(如果是,最好不仅提及如何使用管理员 API 密钥进行身份验证,还要提及客户端 API 密钥)

对于 pydiscourse 客户端,有一个 hacky 的解决方法可以使用不同的标头:

from pydiscourse import DiscourseClient

client = DiscourseClient(
        'https://forum.example.com',
        api_username='tflidd',
        api_key='388b79103056fede1d3223dae032df99')

headers = {
            "Accept": "application/json; charset=utf-8",
            "User-Api-Key": '388b79103056fede1d3223dae032df99',
            "User-Api-Username": 'tflidd',
        }

slug = "abc"
topic_id = 1234

client.topic(slug=slug, topic_id=topic_id, override_request_kwargs=override_request_kwargs)
1 个赞