首页 > 解决方案 > 为什么我的 Doorkeeper 配置会收到 401 Unauthorized 错误?

问题描述

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

我正在尝试运行 (PKCE) OAuth 流程,但最后一步 - 一个 POST 请求/oauth/token- 返回 401 Unauthorized error with the JSON content {"error": "You need to sign in or sign up before continuing."}

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

我目前的嫌疑人是以下代码块initializers/doorkeeper.rb

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

这来自Doorkeeper 文档。通过单步执行代码,我可以看到warden.authenticate!返回 401 错误的调用。TokensController#create从不叫门卫。

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

标签: ruby-on-railsrubydevisedoorkeeper

解决方案


这个问题是由我们使用Ahoy 分析库引起的。

默认情况下,此库会跟踪 Rails 应用程序中的所有页面访问。它试图让当前用户使用current_user || current_resource_owner. 因为current_user在 POST 到 时仍然为 nil /oauth/token,所以current_resource_owner最终调用了我们的 Doorkeeper resource_owner_authenticator,它返回了 401 错误。源代码在这里

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

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


推荐阅读