在未获得用户批准的情况下生成用户API密钥

我正在使用 Discourse 无头模式,并且能够使用管理员 API 密钥获取用户信息,但有人建议为每个用户生成一个用户 API。所以我想改用这种方法,但我不想让用户必须导航到一个新的 UI 来“批准”我为他们创建的 API。

所以,我的解决方案是程序化地提交确认。从 GET 请求到 ‘/user-api-key/new’,我能够解析出 ‘form’ 元素数据,但我无法 POST 请求到 ‘/user-api-key/’,因为我会收到 CSRF 错误。

我已经为 discourse connect 禁用了 CSRF 保护,但 api-key 是否有其他保护措施?
SiteSetting.discourse_connect_csrf_protection

如果没有,我将不会使用用户 API 密钥,直到我能够创建它们而没有 UI 中断。

提前致谢!

显然,一个可能有效的解决方案在以前的版本中存在,但我没有看到任何更新的版本:

1 个赞

也许我们正在构建相同的东西 :slight_smile: 尽管我的只是部分无头。

我怀疑没有,而且这是故意的。

我一直在想同样的事情,但我想在我的情况下这没关系——我并没有试图隐藏 Discourse。

需要注意的一点是,用户 API 密钥与管理员所有用户 API 密钥默认应用不同的速率限制:https://meta.discourse.org/t/available-settings-for-global-rate-limits-and-throttling/78612。

用户 API 速率限制:
DISCOURSE_MAX_USER_API_REQS_PER_MINUTE:默认 20
DISCOURSE_MAX_USER_API_REQS_PER_DAY:默认 2880

管理员 API 速率限制:
DISCOURSE_MAX_ADMIN_API_REQS_PER_MINUTE:60

如果您的应用程序连接到自托管的 Discourse 站点,您很可能可以覆盖管理员 API 速率限制。如果您的应用程序连接到托管的 Discourse 实例,用户 API 速率限制提供了更大的灵活性。使用管理员 API 速率限制,您最终不得不将所有请求放入一个速率受限的队列中。

编辑:与其使用 用户 API 密钥规范 来生成密钥,不如使用管理员 API 密钥来生成用户 API 密钥。这样可以避免用户必须批准应用程序的问题。

请注意,下面发布的密钥是针对我的本地主机域的,因此发布它没有风险。

unescaped key params: {key:description:sally} {key:username:sally} {key:scopes:[scope_id:topics:write]} {key:scopes:[key:write]} {key:scopes:[name:write]} {key:scopes:[params:[topic_id]]} {key:scopes:[urls:[/posts (POST)]]} {key:scopes:[selected:true]}

❯ curl -X POST \"http://localhost:4200/admin/api/keys\" \
      -H \"Api-Key: $api_key\" \
      -H \"Api-Username: system\" \
      -H \"Content-Type: application/json\" \
      -d $json
{\"key\":{\"id\":29,\"key\":\"f5c6307b51dd2882bde525dc9775fe7504b55c93fa40177b650f9e6b77a9d25b\",\"truncated_key\":\"f5c6\",\"description\":\"sally\",\"last_used_at\":null,\"created_at\":\"2024-06-02T00:44:19.944Z\",\"updated_at\":\"2024-06-02T00:44:19.944Z\",\"revoked_at\":null,\"user\":{\"id\":3,\"username\":\"sally\",\"avatar_template\":\"/user_avatar/127.0.0.1/sally/{size}/58_2.png\"},\"api_key_scopes\":[{\"resource\":\"topics\",\"action\":\"write\",\"parameters\":[\"topic_id\"],\"urls\":[\"/posts (POST)\"],\"allowed_parameters\":{},\"key\":\"write\"}]}}

无论哪种情况,您最终都会得到一个需要以某种方式管理的 API 密钥。我假设是加密并保存到数据库中。

5 个赞

您的前端在使用 React 吗?我愿意寻找合作方式来减少冗余并提高代码可靠性。我认为通过 SSO 进行身份验证是最难的部分。所以,希望从这里开始一切顺利。

是的,这是一个 Remix/React Router 应用。所以前端是 React,后端是 Node。

我已经和它打交道好几年了。如果您有任何疑问,请在此处给我发消息。

我正在尝试制作一个能很好地与托管 Discourse 站点的速率限制配合使用的东西。这一直是棘手的部分。用户 API 密钥似乎是处理它的可能方法,但也有每个 IP 地址的速率限制,所以我又回到了只使用单个 API 密钥并排队所有 API 请求。

1 个赞

This topic was automatically closed 30 days after the last reply. New replies are no longer allowed.