如何从Doorkeeper经过身份验证的会话中访问current_user

Wil*_*ill 9 ruby-on-rails devise doorkeeper

我有一个rails应用程序,我试图与Android应用程序同步.我使用Doorkeeper作为服务器并使用Oltu作为客户端成功设置了身份验证.

我的应用程序跟踪按用户列表存在的习惯.习惯控制器中的索引方法是:

def index
  @habits = current_user.habits
end
Run Code Online (Sandbox Code Playgroud)

当通过设计验证这种方法的工作原理,使用时,看门current_usernil.

Chr*_*ris 8

我会覆盖你的基本API控制器中的current_user,如:

private

def current_user
  @current_user ||= User.find(doorkeeper_token[:resource_owner_id])
end
Run Code Online (Sandbox Code Playgroud)


Kin*_*ina 8

来自门卫的自述文件 ......

已验证的资源所有者

如果要基于当前资源所有者(即访问令牌所有者)返回数据,您可能需要在控制器中定义一个返回资源所有者实例的方法:

class Api::V1::CredentialsController < Api::V1::ApiController
  before_action :doorkeeper_authorize!
  respond_to    :json

  # GET /me.json
  def me
    respond_with current_resource_owner
  end

  private

  # Find the user that owns the access token
  def current_resource_owner
    User.find(doorkeeper_token.resource_owner_id) if doorkeeper_token
  end
end
Run Code Online (Sandbox Code Playgroud)

在此示例中,我们将返回me.json访问令牌所有者的credentials().


KPh*_*sey 6

我有一个 API,需要允许通过 Doorkeeper 或 Devise 进行身份验证。以下解决方案允许主应用程序使用 Oauth 客户端将使用的相同端点并共享 current_user 方法。

before_action :doorkeeper_authorize!, unless: :user_signed_in?

def current_user
  @current_user ||= if doorkeeper_token
                      User.find(doorkeeper_token.resource_owner_id)
                    else
                      warden.authenticate(scope: :user)
                    end
end
Run Code Online (Sandbox Code Playgroud)

  • 你是个天才!我一直在寻找这样一个漂亮的解决方案(因为我想做和你完全相同的事情:将我的 API 与 Doorkeeper 或 Devise 一起使用)!非常感谢您的分享! (2认同)

Wil*_*ill 0

我不知道这是否是正确的方法,但解决方案是:

def index
  user = current_user
  user ||= User.find(doorkeeper_token[:resource_owner_id]) if doorkeeper_token
  @habits = user.habits
end
Run Code Online (Sandbox Code Playgroud)

您不能分配给,current_user否则它会将其设置为nil