0

我在我的 rails 3.2 应用程序中设计了 token_auth 工作正常。我只是在构建一个 API,需要用另一个令牌覆盖设计身份验证机制。为什么?因为一个用户有很多位置,我想通过这个令牌提供对每个位置的独立访问,而不影响整个帐户。

创建位置时,会自动创建位置 api_token。

在我尝试使用新密钥访问的位置控制器中,我尝试了以下操作:

class Api::V1::LocationsController  < ApplicationController 

  before_filter :restrict_access, :only => :index


  def index
      @locations = Location.all
      @page_title = "Locations"
      @page_title_content = "A list of all your locations. Click to customise and view reports"

     respond_to do |format|
       format.json { render json: @locations }
       format.xml { render xml: @locations }
     end
   end


   private

   def restrict_access
     api_key = Location.find_by_api_token(params[:access_token])
     head :unauthorized unless api_key
    end

end

然而,一切都很好,即使我没有登录并且没有在 url 中传递密钥,我也可以查看所有位置。

有什么建议我可以让这个工作吗?另外,我怎样才能限制那些可以访问的位置?通常我使用cancan,但看不到它是如何工作的。

4

1 回答 1

0

使用设计,您需要使用:token_authenticatable和覆盖find_for_token_authentication. 这是在我的应用程序中有效的方法。

class User
  devise :token_authenticatable

  self.token_authentication_key = "access_token"

  def self.find_for_token_authentication conditions
    grant = AccessGrant.where(access_token: conditions[token_authentication_key]).
                         any_of({access_token_expires_at: nil}, {:access_token_expires_at.gt => Time.now}).
                         first

    if grant
      user = User.where(_id: grant.user_id).first
      user.current_grant = grant if user
      user
    end
  end
end

之后,您只需authenticate_user!在前置过滤器中调用标准

class Api::BaseController < ApplicationController
  respond_to :json

  # don't protect from forgery here
  skip_before_filter :verify_authenticity_token
  before_filter :authenticate_user!
于 2012-06-19T10:35:59.617 回答