【问题标题】:How to access current_user from a Doorkeeper authenticated session如何从 Doorkeeper 身份验证会话访问 current_user
【发布时间】:2014-01-13 00:27:09
【问题描述】:

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

我的应用会跟踪作为每个用户列表存在的习惯。我在习惯控制器中的索引方法是:

def index
  @habits = current_user.habits
end

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

【问题讨论】:

    标签: ruby-on-rails devise doorkeeper


    【解决方案1】:

    来自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】:

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

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

      【讨论】:

        【解决方案3】:

        我有一个 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
        

        【讨论】:

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

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

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

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

        【讨论】:

          猜你喜欢
          • 2019-08-28
          • 1970-01-01
          • 1970-01-01
          • 2017-06-16
          • 2015-05-15
          • 1970-01-01
          • 1970-01-01
          • 2016-04-24
          • 1970-01-01
          相关资源
          最近更新 更多