【问题标题】:Why am I receiving 401 Unauthorized errors with my Doorkeeper configuration?为什么我的 Doorkeeper 配置会收到 401 Unauthorized 错误?
【发布时间】:2021-05-04 15:41:09
【问题描述】:

我有一个使用 devise 4.7.1、doorkeeper 5.5.1 和 devise-doorkeeper 1.2.0 的 Rails 6.1 应用程序。

我正在尝试运行 (PKCE) OAuth 流程,但最后一步 - 对 /oauth/token 的 POST 请求 - 返回带有 JSON 内容 {"error": "You need to sign in or sign up before continuing."} 的 401 Unauthorized 错误。

我对此感到困惑,因为据我所知,未经身份验证的用户应该可以访问 /oauth/token 端点。也很奇怪(但可能是红鲱鱼)是,如果我尝试使用 curl 运行相同的 POST 请求,但删除 User-Agent 标头,它会成功。

我目前的嫌疑人是initializers/doorkeeper.rb中的这段代码:

  resource_owner_authenticator do
    current_user || warden.authenticate!(scope: :user)
  end

这来自Doorkeeper docs。通过单步执行代码,我可以看到是对 warden.authenticate! 的调用返回了 401 错误。门卫的TokensController#create 永远不会被调用。

我是否遗漏了任何允许未经身份验证访问此TokensController#create 端点的重要步骤?

【问题讨论】:

  • 它甚至不应该进入您的resource_owner_authenticator 块,因为每个人都可以使用POST /oauth/token。我认为由于某种原因 :doorkeeper_authorize! before_action 被调用,也许您在 TokensController 或超类中错误地配置了它?
  • 感谢@AaronBrager,这很有帮助!通过知道resource_owner_authenticator 根本不应该被击中,我能够向后工作以确定问题。简而言之,它是由我们的 Ahoy 分析库引起的。很快就会写一个更完整的描述:)

标签: ruby-on-rails ruby devise doorkeeper


【解决方案1】:

这个问题是由我们使用Ahoy analytics library引起的。

默认情况下,此库会跟踪 Rails 应用程序中的所有页面访问。它尝试使用current_user || current_resource_owner 获取当前用户。因为current_user 在发布到/oauth/token 时仍然为零,所以获取current_resource_owner 最终会调用我们的门卫resource_owner_authenticator,这会返回401 错误。 The source code for this is here.

这也解释了为什么在取消设置 User-Agent 标头时事情会按预期工作:在没有用户代理(或 curl 等用户代理)的情况下,Ahoy 将请求视为来自机器人,并且不会尝试跟踪它(source code here)。

我们对此的解决方案是通过在其配置中设置 Ahoy.api_only = true 来告诉 Ahoy 停止自动跟踪所有页面浏览量。

【讨论】:

  • 有趣,很好的发现!
  • 对于侵入性较小的修复,我认为您可以在 TokensController 中使用 skip_before_action :track_ahoy_visit 而不是 Ahoy.api_only = true
猜你喜欢
  • 2015-04-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-02-07
  • 2020-01-29
  • 1970-01-01
  • 2018-03-30
  • 2021-10-08
相关资源
最近更新 更多