无法创建“单用户”级别 API 密钥,始终默认为“所有用户”

复现步骤:

  1. 打开 https://yourdiscoursedomain.com/admin/api/keys
  2. 选择新建密钥
  3. 将用户级别选择为“单个用户”
  4. 创建密钥
  5. 创建后打开密钥详情
  6. 用户级别显示为“所有用户”

我不太清楚这两种用户级别选项的区别,但这看起来明显是一个 bug。

(我使用的是托管版 Discourse 服务)

您是否也选择了要为其创建 API 密钥的用户?

大多数情况下,您需要的是“所有用户”API 密钥。但在某些情况下,尤其是使用 discourse_theme 时,必须使用用户密钥。

您打算用 API 做什么?

1 个赞

如果按照您列出的步骤操作,我可以复现该问题。在为单个用户创建 API 密钥时,Discourse 期望在表单的“用户”字段中添加用户名:

如果“用户级别”选择了“单个用户”,但“用户”字段中未添加用户名,则会创建一个“所有用户”的 API 密钥。我期望此时应显示一条错误信息,类似于在未填写描述的情况下提交表单时发生的情况。

3 个赞

我想创建一个类似“机器人”的用户,用于从特定类别中检索帖子。此 Discourse 实例仅支持 GSuite 认证,因此无法再创建任意用户。我原本以为,对于“单用户”密钥,系统会允许我输入想要分配给机器人的新用户名,但现在我发现用户名必须是已存在的用户。用户名输入框没有任何验证提示,因此并不清楚我不能随意输入名称(就像我为 Slack 传入 Webhook 所做的那样)。提交时,系统在查找我输入的用户名后静默失败,并转而创建了一个“所有用户”类型的密钥。

我想这更多是一个可用性问题,而非功能性问题。我发现这里的文档令人困惑,因为它完全没有解释“用户级别”字段,除了在帖子下方的某条评论中提到过一次“所有用户”类型外,再无其他说明。

一个适用于所有用户的 API 密钥即可生效,除非你希望该“机器人”无法读取某些类别。

这是你的用户名选择器组件吗,@j.jaffeux

不,这不是一个 select-kit 组件。问题在于我们仅检查 description 是否存在,而未检查 username。userMode(single/all)只是一个客户端值,因此当模型在服务器端进行验证时,它只知道我们请求了一个 key,以及我们是否提供了用户。这应该会改善情况,我会请 David 进行审查:FIX: prevents saving an apparently single key as an all key by jjaffeux · Pull Request #9000 · discourse/discourse · GitHub

7 个赞