Я использую Devise в своем приложении и хотел бы создать глобальный ключ API, который может получить доступ к данным JSON любой учетной записи без необходимости входа -в систему.
Например, предположим, что мой ключ API — 1234
, и у меня есть два пользователя, которые создали два разных ресторана.
И я открываю совершенно новый браузер и ничего не входил в систему, и я перехожу к своему URL-адресу .../restaurants/2.json?api_key=1234
, я должен иметь доступ к данным JSON этого ресторана без необходимости входа -в качестве Пользователь 2
Как лучше всего это сделать?
Я следил за Railscast #352 Защита API , поэтому я могу получить доступ к материалам JSON, передав ключ API, но мне нужно войти -, чтобы что-то увидеть.
Я должен упомянуть, что я также использую CanCan для ролей, но не уверен, что это сыграет какую-либо роль (каламбур, не предназначенный )в этой ситуации.
Я следил за 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
...