Как пропустить проверку подлинности Devise при использовании ключа API?

Я использую Devise в своем приложении и хотел бы создать глобальный ключ API, который мог бы получать доступ к данным JSON любой учетной записи без необходимости входа в систему.

Например, скажем, мой ключ API1234 и у меня есть два пользователя, которые создали два разных ресторана.

User 1 - Restaurant 1 (/restaurants/1) User 2 - Restaurant 2 (/restaurants/2)

И я открываю совершенно новый браузер, не вошел ни в чем и захожу в свой URL.../restaurants/2.json?api_key=1234Я должен иметь доступ к данным JSON этого ресторана без необходимости входа в систему какUser 2

Какой лучший способ сделать это?

Я следил заRailscast # 352 Защита API поэтому я могу получить доступ к материалам JSON, передав ключ API, но мне нужно войти в систему, чтобы что-то увидеть.

Edit 1: Using CanCan

Я должен упомянуть, что я также использую CanCan для ролей, но не уверен, сыграет ли это какую-либо роль (каламбур не предназначен) в этой ситуации.

Edit 2: Implimenting with API Versioning

Я следовал за Railscast # 350 и # 352, которые учат вас, как создавать REST API Versioning и как защитить его с помощью ключа API.

Вот как выглядят мои контроллеры / api / v1 / restaurant / restaurant_controller.rb:

module Api
  module V1
    class RestaurantsController < ApplicationController
      before_filter :restrict_access

      respond_to :json

      def index
        respond_with Restaurant.all
      end

      def show
        respond_with Restaurant.find(params[:id])
      end

    private

      def restrict_access
        api_key = ApiKey.find_by_access_token(params[:api_key])
        head :unauthorized unless api_key        
      end
    end
  end
end

И мойapplication_controller.rb все еще имеетbefore_filter :authenticate_user! код в нем.

Solution

Я сначала последовал заRailscast # 350 о версии REST API и переместил все мои вызовы JSON API в/apps/api/v1/...

Затем, следуя приведенному ниже решению Стива Йоргенсена, удостоверился, что мой API-модуль унаследован отActionController::Base вместоApplicationController так что это обошло Devisebefore_filter :authenticate_user! код в пределахApplicationController.

Итак, мой код Edit 2, когда выглядел следующим образом:

module Api
  module V1
    class RestaurantsController < ApplicationController
    ...

в

module Api
  module V1
    #Replace 'ApplicationController' with 'ActionController::Base'
    class RestaurantsController < ActionController::Base
    ...

Ответы на вопрос(4)

Ваш ответ на вопрос