允许用户使用Doorkeeper撤消令牌

时间:2018-06-28 13:55:11

标签: ruby-on-rails oauth-2.0 doorkeeper

Rails 5.2.0,Doorkeeper 5.0.0 RC1,Devise 4.4.3。

我已将Doorkeeper插入到现有的Rails应用程序中,该应用程序使用Devise进行用户身份验证。目标是能够为多个用户认证特定的应用程序(例如,移动应用程序),并允许用户拥有该应用程序的多个已认证实例(例如,对于多个设备),但允许那些用户分别撤消对某个应用程序的访问权限。该应用程序的单个实例。

只有一个Doorkeeper :: Application实例,然后每次用户想要验证应用程序时都遵循Authorization Code Flow process。在config / initializers / doorkeeper.rb中,我已经

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

因此,如果用户登录后直接进入“需要授权”视图(如Wiki页面;我尚未对其进行自定义),但否则首先要求用户登录,则返回代码,并且可以交换访问令牌和刷新令牌。到目前为止,一切都很好。

但是,在撤销令牌时,我遇到与Revoking token does not work for public clients #891相同的问题。我想用令牌调用/ oauth / revoke并撤消它,而不使用应用程序密钥或撤消应用程序(全局或用户的所有实例)。

但是,由于与GitHub问题类似的原因,此方法不起作用-因为令牌控制器未检查resource_owner_authenticator,所以它不知道吊销令牌的请求是否来自资源所有者,是否经授权?返回false并且什么也没有发生。

作为替代方案,我将其合并在一起-它不完整(对于一个,它永远不会发送响应),但是这种方法有意义吗?

before_action :authenticate_user!
def revoke_oauth_token
  token_string = params[:token]

  unless current_user.nil?
    unless token_string.nil?
      token = Doorkeeper::AccessToken.find_by("resource_owner_id = ? AND token = ?", current_user.id, token_string)

      unless token.nil?
        token.revoke
      else
        # current_user doesn't own the token or the token doesn't exist
      end
    end
  else
    # should be redirected to the login page because of authenticate_user
    # but just in case
  end
end

我将传递令牌,确认有一个已登录的用户并且他们是令牌的资源所有者,然后,如果所有成功,则撤消令牌。它似乎可以满足我的需求,但我对OAuth或尤其是Doorkeeper并不十分熟悉,以确保我没有丢失任何东西。

0 个答案:

没有答案