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

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

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

  • Пользователь 1 -Ресторан 1 (/рестораны/1)
  • Пользователь 2 -Ресторан 2 (/рестораны/2)

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

Как лучше всего это сделать?

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

Редактировать 1 :Использование CanCan

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

Редактировать 2 :Внедрение с управлением версиями API

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

Вот как выглядит мой файл controllers/api/v1/restaurants/restaurants _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!.

Решение

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

Затем, следуя приведенному ниже решению Стива Йоргенсена, убедитесь, что мой модуль API унаследован от ActionController::Baseвместо ApplicationController, чтобы он обходил код Devise before_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
   ...

12
задан FilmiHero 3 August 2012 в 17:23
поделиться