Wie überspringe ich die Devise-Authentifizierung bei Verwendung eines API-Schlüssels?
Ich verwende Devise für meine Anwendung und möchte einen globalen API-Schlüssel erstellen, mit dem auf JSON-Daten eines beliebigen Kontos zugegriffen werden kann, ohne mich anmelden zu müssen.
Angenommen, mein API-Schlüssel lautet1234
und ich habe zwei Benutzer, die zwei verschiedene Restaurants erstellt haben.
Und ich öffne einen brandneuen Browser und habe mich bei nichts eingeloggt und gebe meine URL weiter.../restaurants/2.json?api_key=1234
Ich sollte in der Lage sein, auf die JSON-Daten dieses Restaurants zuzugreifen, ohne mich als einzuloggenBenutzer 2
Was ist der beste Weg, dies zu tun?
Ich bin dem gefolgtRailscast # 352 Sichern einer API Ich kann also auf JSON-Inhalte zugreifen, indem ich den API-Schlüssel übergebe, aber ich muss mich anmelden, um etwas zu sehen.
Edit 1: Mit CanCanIch sollte erwähnen, dass ich CanCan auch für Rollen benutze, aber nicht sicher bin, ob dies in dieser Situation eine Rolle spielt (Wortspiel nicht beabsichtigt).
Bearbeiten Sie 2: Implimentieren mit API-VersionierungIch folgte den Railscasts 350 und 352, in denen Sie lernen, wie Sie eine REST-API-Versionierung erstellen und diese mit einem API-Schlüssel sichern.
So sieht mein controller / api / v1 / restaurants / restaurants_controller.rb aus:
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
Und meinapplication_controller.rb
hat noch diebefore_filter :authenticate_user!
Code drin.
Ich folgte zuerst demRailscast # 350 zur REST-API-Versionierung und verschob alle meine JSON-API-Aufrufe nach/apps/api/v1/...
Vergewissern Sie sich dann, dass mein API-Modul von geerbt wurde, indem Sie Steve Jorgensens unten stehende Lösung befolgenActionController::Base
anstattApplicationController
so dass es Devise umgingbefore_filter :authenticate_user!
Code innerhalb derApplicationController
.
Also, mein Edit 2 Code, wenn er so aussieht:
module Api
module V1
class RestaurantsController < ApplicationController
...
zu
module Api
module V1
#Replace 'ApplicationController' with 'ActionController::Base'
class RestaurantsController < ActionController::Base
...