Discourse 插件中的 Imgur OAuth 2 流程

你好,

我正在为我们的 Discourse 实例开发一个非常特定的插件,有几个问题想请教。

该插件在某个阶段需要将我们 Discourse 帖子的图片集合发送到 Imgur。收集这些图片的部分已经完成。

现在我正尝试使用 Imgur 的 OAuth2 流程来认证其 API。我已经为插件创建了一个管理界面,允许用户点击按钮授权插件访问其 Imgur 账户。用户登录后,会调用一个回调 URL(已配置为我 Discourse 实例中的特定路由,该路由由插件创建),并携带访问令牌(参见示例)。

http://localhost:3000/admin/plugins/plugin_name/callback#access_token=<token>&...

我的问题是:如何获取这个令牌?我完全不知道从哪里入手。

我的理解是,由于令牌是以哈希参数形式返回的,必须在 JavaScript 端处理。我尝试为回调 URL 设置控制器和路由,但无法弄清楚如何从中读取 URL(尤其是哈希部分)。(我在 Ember.js 文档或 Stack Overflow 上都没找到有用的信息。)我也尝试设置不同的事件监听器,但它们似乎从未触发。

我的第二个问题是:应该在哪里存储访问令牌和刷新令牌?我可以将其保存为插件的系统设置吗?我听说过 PluginStore,但它仅在 Ruby 中可访问(这意味着需要创建一个端点,让客户端将这些令牌发送到服务器)。另外,从安全角度来看这样做是否可靠?

谢谢!

编辑:我的路由文件名有个拼写错误,少了一个字母 s,这就是为什么没有任何东西被触发的原因。

您无法通过 HTTP 在 localhost 上实现此功能。建议您需要使用 https://ngrok.com/ 等工具模拟 HTTPS,或在云端以 HTTPS 模式配合域名运行您的开发服务器。

我原以为我也需要那个,但我确实被正确重定向到了我的本地 URL,并且在 URL 中看到了 token。

是的,您说得对,客户端可以使用 HTTP。问题在于 HTTP 请求可能被拦截,导致令牌被读取,因此在这种情况下使用 OAuth2 也就失去了意义。我个人也更倾向于在开发环境中使用完整的最终协议,以便确认我的代码能正常工作。

没错,我完全同意,目前这只是为了开发目的。当然,在生产环境中我会使用 https :slight_smile: