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

时间:2013-12-24 20:19:15

标签: ruby-on-rails devise doorkeeper

我正在尝试与rails app同步android app。我已使用authentication作为服务器并Doorkeeper作为客户端成功设置了Oltu

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

def index
  @habits = current_user.habits
end

通过Devise进行身份验证时,当使用门卫current_usernil时,此方法有效。

4 个答案:

答案 0 :(得分:8)

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

private

def current_user
  @current_user ||= User.find(doorkeeper_token[:resource_owner_id])
end

答案 1 :(得分:7)

来自Doorkeeper's README ...

经过身份验证的资源所有者

如果要基于当前资源所有者返回数据,则在其他情况下 单词,访问令牌所有者,您可能想要在您的中定义一个方法 返回资源所有者实例的控制器:

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

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

答案 2 :(得分:3)

我有一个API,需要通过门卫或设计进行身份验证。以下解决方案允许主应用程序使用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

答案 3 :(得分:0)

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

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

您无法分配到current_user,也不会将其设置为nil