Как пропустить проверку подлинности Devise при использовании ключа API?
Я использую Devise в своем приложении и хотел бы создать глобальный ключ API, который мог бы получать доступ к данным JSON любой учетной записи без необходимости входа в систему.
Например, скажем, мой ключ API1234
и у меня есть два пользователя, которые создали два разных ресторана.
И я открываю совершенно новый браузер, не вошел ни в чем и захожу в свой 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!
код в нем.
Я сначала последовал за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
...