使用 Apple 登录

我已经尝试了 升级我们插件的分支 以使用最新的 omniauth-apple。(注意:除了升级版本号外,还需要进行其他一些更改)。

tl;dr:问题依然存在

我成功地在沙盒环境中通过一些“黑客”手段使其运行,但它仍然存在一些问题:

  1. Apple 在回调时使用 POST 请求。这在 OAuth 实现中并不常见,因为这意味着带有 samesite=Lax 属性的 Cookie 将不会随请求发送。这导致 Discourse 在回调期间无法读取会话 Cookie,从而引发 CSRF 错误。

    不安全的临时解决方案是将 Discourse 的 Cookie 设置为 samesite=None 来禁用此安全机制。

  2. 在没有 CSRF 令牌的情况下使用 POST 请求还会触发核心中的另一项安全措施。

    不安全的临时解决方案是删除 这一行

  3. 当 omniauth gem 获取 JWKs 时,我收到了来自 Apple 的 403 错误。我怀疑 Accept: 头未正确设置,但尚未验证这一点。

    不安全的临时解决方案是硬编码密钥。

经过所有这些操作后,我终于成功使用 Apple 登录了。您可以在 https://sandbox.dtaylor.uk 上尝试(我会让它保持运行几天,但请勿在其中输入任何敏感信息,因为它是不安全的)。

然后……电子邮件和姓名仍然只在首次认证时包含。您可以尝试一下:使用 Apple 登录,取消账户创建,然后再次尝试。第二次尝试将缺少您的详细信息。

因此,假设 Apple 短期内不会改变现状……我们该如何解决这个问题?

对于问题 (1) 和 (2),我认为可以将 Apple 的 POST 请求转换为 GET 请求,而不会影响安全性。当我们在回调中收到 POST 请求时,可以渲染一些 JavaScript 代码,将 window.location 设置为 /auth/apple/callback?code=...&state=...。此后,它将像其他任何提供商一样正常工作。不过,我认为拦截 POST 请求需要对核心 API 进行一些更改。

对于问题 (3),我认为通过一些在 omniauth gem 中的小改动可能就能解决。

但我们仍然无法获取姓名和电子邮件,所以我不确定是否值得修复这些其他问题 :cry:

8 个赞