アプリケーションでDeviseを使用しており、ログインせずに誰のアカウントのJSONデータにもアクセスできるグローバルAPIキーを作成したいと考えています。
たとえば、私のAPIキーが1234
であり、2つの異なるレストランを作成した2人のユーザーがいるとします。
- ユーザー1-レストラン1-(/レストラン/ 1)
- ユーザー2-レストラン2(/レストラン/ 2)
そして、新しいブラウザを開いて何もログインしていないので、URLを渡すと、ユーザー2.../restaurants/2.json?api_key=1234
としてログインしなくても、そのレストランのJSONデータにアクセスできるはずです。
これを行うための最良の方法は何ですか?
Railscast#352 APIの保護に従って、APIキーを渡すことでJSONにアクセスできるようにしましたが、何かを表示するにはログインする必要があります。
編集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!
コードを持っています。
解決
私は最初にRESTAPIバージョニングでRailscast#350に従い、すべてのJSONAPI呼び出しをに移動しました/apps/api/v1/...
次に、以下のSteve Jorgensenのソリューションに従って、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
...