如何在Rails中获取授权令牌

时间:2014-05-02 22:11:03

标签: ruby-on-rails

我有以下ApiController通过before_action过滤器处理授权:

class ApiController < ApplicationController
  before_action :restrict_access

  private

  def restrict_access
    authenticate_or_request_with_http_token do |token, options|
      ApiKey.exists?(access_token: token)
    end
  end
end

这很好用。

现在,我有一个来自该Api的控制器,需要使用该ApiKey才能找到关联的用户。所以,我试过这样做:

class OrdersController < ApiController
  def index
    # How do I access the ApiKey that has been detected in the parent filter?
    @user = ApiKey.find_by(access_token: params[:token]).user # This is not working
  end
end

这不起作用,因为params [:token]为空,因为令牌在Authorization Token token='xxxx'之类的授权标头中传递。那么,我怎样才能从我的控制器那里得到它?

2 个答案:

答案 0 :(得分:1)

request.headers['Authorization']抓取令牌使用以下模式

 /(.*)=\"(.*)\"/.match(request.headers["Authorization"])[2]

答案 1 :(得分:0)

非常简单,您应该在身份验证方法中查找您的用户,并将其设置为@current_user或其他。

然后你可以在所有请求中使用它,并且可以这样做:

class OrdersController < ApiController
  def index
    @current_user
  end
end

你的restrict_accees可能是:

  def restrict_access
    authenticate_or_request_with_http_token do |token, options|
      user = ApiKey.where(access_token: token).includes(:user) #preloads user if available
      if user.present?
        @current_user = user
        true
      else 
        false
      end
    end
  end