ruby-on-rails - 为什么我的 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
端点?
解决方案
这个问题是由我们使用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 停止自动跟踪所有页面浏览量。
推荐阅读
- php - PHP:将表单数据传递到第三个文件而不在第二个文件中更改它
- r - UseMethod("predict") 中的错误:没有适用于 'predict' 的方法应用于类“c('double', 'numeric') 的对象
- python - 函数中的 lambda 自我
- r - 使用 apply 计算
- assembly - 将 CDECL 调用约定采用到仅复制/粘贴当前参数的函数中
- asp.net-mvc - 当用户到达某个路线时,另一个路线会出现在我的 ASP.MVC 应用程序中
- c++ - 相当于 move_pages 系统调用的 Windows
- json - AWS System Manager CLI 功能
- python - 在 django 中打破或停止 forloop.counter
- reactjs - 反应 .map 函数中的 if 语句