覆盖 AuthorizationsController 门卫

Override AuthorizationsController Doorkeeper

我正在凌驾于门卫 AuthorizationsController 之上。正如 docs 建议我继承自 AuthorizationsController。现在下面的代码显示了我最近的覆盖尝试。

我目前拥有的

基本上,在 new Authorization Doorkeeper process 周围添加一个额外的 if 语句。我添加了第 3-7 行,目前效果很好。 returns 我 :error 如果第 6 行等于 true.

我的问题

我仍然可以通过浏览器 URL 和服务器日志看到 AccessToken。因此,作为用户,我仍然可以使用此 AccessToken 通过 Postman 检索一些数据。即使它在登录时给了我一个错误。这是为什么?我该如何防止这种情况发生?

class AuthorizationsController < Doorkeeper::AuthorizationsController
  def new
    application = Application.find(authorization.authorize.pre_auth.client.id)
    resource_owner = User.find(current_resource_owner)

    if application.users.exclude?(resource_owner) && application.owner != resource_owner
      render :error
    elsif pre_auth.authorizable?
      if skip_authorization? || matching_token?
        auth = authorization.authorize
        redirect_to auth.redirect_uri
      else
        render :new
      end
    else
      render :error
    end
  end

end

如果你检查 introduction 到 DigitalOcean 编写的 OAuth2,我的 if 语句在第 3 步仍然成功 'User-agent Receives Access Token with Redirect URI',因为我可以在我的浏览器中看到带有重定向 URI 的 AccessToken URL.在第 3 步之后,它给了我 :error.

更新

在我对 AuthorizationsController 的覆盖开始之前,生成 AccessToken 的整个过程已经完成。我添加了一个简单的 before_action 来打印到服务器日志,但在此之前 Doorkeeper::AccessToken Load (0.9ms) SELECT 'oauth_access_tokens'.* FROM 'oauth_access_tokens' WHERE 'oauth_access_tokens'.'token' = 'x' LIMIT 1 发生了。

在第 3 行和第 4 行,您正在调用 authorization.authorize,这可能实际上是在进行授权,然后将访问令牌添加到响应中。

您假设您在浏览器中看到的令牌 url 是一个 OAuth access_token。它实际上只是一个 JWT(JSON Web Token)。我假设此令牌是某种会话令牌,因为 Doorkeeper 未授权用户使用该应用程序。您错误地假设您的 OAuth 流程到达 'User-agent Receives Access Token with Redirect URI' 步骤。

您 url 中的令牌完全没有害处,因此您没有理由阻止您的应用程序颁发令牌。如果用户中断他们的会话,令牌将变得无用。

希望这对您有所帮助:)