非管理员用户可以自行发放API密钥吗?

你好 :waving_hand:

我正在开发一个用于向 Discourse 论坛发布帖子的 GitHub Action。
我找到了发布 API,但文档中提到 Discourse 用户需要从管理面板创建 API 密钥,然而非管理员用户并没有管理面板。对此我有几个问题:

  • API 密钥是否也设计用于非管理员用户?
  • 如果是的话,非管理员用户如何创建自己的 API 密钥?
  • 如果是的话,要为非管理员用户启用 API 密钥,是否有必要的设置?
    • 论坛的偏好设置页面没有创建 API 密钥的界面。因此我猜测,应该有一些设置允许用户生成自己的 API 密钥。

提前感谢!:folded_hands:

1 个赞

你好 @KengoTODA,欢迎加入!:slight_smile: :wave:

User API keys specification 对您所描述的内容会有所帮助。

3 个赞

谢谢!我已经查看了“API 密钥生成流程”部分。

我理解这是针对能够提供 auth_redirect URL 的 Web 应用程序。对于 CLI 或 GitHub Actions,是否有推荐的实现方式?

如果这是用于 GitHub Action,您可能最好创建一个仅限所需操作的受限 API 密钥,但确实需要管理员权限才能创建此密钥。

4 个赞

对于命令行程序,如果需要,您可以启动一个本地 Web 服务器并使用 http://localhost:XXXXX/callback 网址。该应用也采用了类似的做法。

3 个赞

好的,我试试看,谢谢你的支持!

1 个赞

您可以按照 Generate User API Keys for testing 的说明创建用户 API 密钥。

2 个赞

我正在 这个分支 上工作,并成功使用 localhost 作为重定向 URL 运行了命令。但是,在我点击授权按钮后,页面 https://meta.discourse.org/user-api-key 报告了一个 JS 错误,导致操作无法继续。虽然 Ruby 脚本 可以正常工作,但当我添加 auth_redirect 参数时也会失败。

以下是浏览器控制台中报告的异常:

Uncaught TypeError: Cannot set property 'isReadOnly' of undefined
    at Function.createCurrent (_application-42d4413fabab7a4b12e0c25fb01f736af560aa283089071a8493f37c9b042a4a.js:44867)
    at Function.current (_application-42d4413fabab7a4b12e0c25fb01f736af560aa283089071a8493f37c9b042a4a.js:8816)
    at Object.initialize (_application-42d4413fabab7a4b12e0c25fb01f736af560aa283089071a8493f37c9b042a4a.js:70403)
    at Object.i.initialize (_application-42d4413fabab7a4b12e0c25fb01f736af560aa283089071a8493f37c9b042a4a.js:7001)
    at _ember_jquery-189e46ebcb33594b835e782fd1ce916ec750bc0cf980ebc4fb7796649161a18d.js:49660
    at i.each (_ember_jquery-189e46ebcb33594b835e782fd1ce916ec750bc0cf980ebc4fb7796649161a18d.js:67904)
    at i.walk (_ember_jquery-189e46ebcb33594b835e782fd1ce916ec750bc0cf980ebc4fb7796649161a18d.js:67891)
    at n.each (_ember_jquery-189e46ebcb33594b835e782fd1ce916ec750bc0cf980ebc4fb7796649161a18d.js:67858)
    at n.topsort (_ember_jquery-189e46ebcb33594b835e782fd1ce916ec750bc0cf980ebc4fb7796649161a18d.js:67758)
    at t._runInitializer (_ember_jquery-189e46ebcb33594b835e782fd1ce916ec750bc0cf980ebc4fb7796649161a18d.js:49667)

我将附上 JS 代码分析的截图。看起来 siteAttributes 应该是一个有效的值,但当前却是 undefined。如果您有任何建议,请告诉我。谢谢!

我正在调查此问题。

JS 抛出了错误,因为 /user-api-key 的 POST 方法返回 403 状态码,且控制器中的 build_not_found_page 方法 未调用存储预加载值的 preload_anonymous_data 方法。

当我添加 auth_redirect 参数时,服务器返回 403 状态码并附带 \u003ch1 class=\"title\"\u003eOops! That page is private.\u003c/h1\u003e,具体原因尚不明确。我尝试使用相同的域名作为回调 URL(以验证跨站脚本问题)并启用 HTTPS 协议,但均未成功。

你需要将域名(以及路径)添加到 allowed user api auth redirects 站点设置中。

如果你手动发出 HTTP 请求,那么 discourse://auth_redirect 应该可以正常工作。

3 个赞

谢谢,我找到了 site_settings.yml 中的配置,明白了为什么我的请求返回了 403 错误。

discourse://auth_redirect 对我来说无法按预期工作,因此我打算让用户手动输入加密令牌,就像 Ruby 代码 中展示的那样。

其他用户请注意:我创建了一个可通过 npx 命令调用的 Node 模块。它将生成一个具有 write 范围的 API 密钥。希望这能帮助需要 Discourse API 令牌的系统简化设置流程。

2 个赞

编辑:你好 @KengoTODA。你的 GitHub 代码帮我指明了正确的方向。我还在解决一些细节问题,之后会写一篇关于我是如何让这些功能正常运行的文章。

@KengoTODA 的 GitHub 代码给了我很大帮助。我现在有了一个按用户身份验证用户并向 Discourse 发起 API 调用的可用版本。我将我的步骤整理在这里:User API keys specification - #45 by JQ331

2 个赞