Jak pominąć uwierzytelnianie Devise podczas używania klucza API?
Używam Devise w mojej aplikacji i chciałbym stworzyć globalny klucz API, który może uzyskać dostęp do danych JSON dowolnego konta bez konieczności logowania.
Załóżmy na przykład, że mój klucz API jest1234
i mam dwóch użytkowników, którzy stworzyli dwie różne restauracje.
I otwieram zupełnie nową przeglądarkę i nie logowałem się do niczego i przechodzę do mojego adresu URL.../restaurants/2.json?api_key=1234
, Powinienem mieć dostęp do danych JSON tej restauracji bez konieczności logowania sięUżytkownik 2
Co jest najlepszym sposobem na to?
ŚledziłemRailscast # 352 Zabezpieczanie API więc mogę uzyskać dostęp do rzeczy JSON, przekazując klucz API, ale muszę się zalogować, aby zobaczyć cokolwiek.
Edytuj 1: Korzystanie z CanCanPowinienem wspomnieć, że używam również CanCan do ról, ale nie jestem pewien, czy w tej sytuacji będzie to odgrywać jakąkolwiek rolę (kalambur nie jest przeznaczony).
Edytuj 2: Wszczepianie z wersją APIŚledziłem Railscast # 350 i # 352, które uczą, jak tworzyć wersje REST API i jak zabezpieczyć je za pomocą klucza API.
Oto jak wygląda mój 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
I mójapplication_controller.rb
wciąż mabefore_filter :authenticate_user!
kod w nim.
Najpierw poszedłem zaRailscast # 350 w wersji REST API i przenieśli wszystkie moje wywołania API JSON/apps/api/v1/...
Następnie, po rozwiązaniu Steve'a Jorgensena poniżej, upewniłem się, że mój moduł API został odziedziczony poActionController::Base
zamiastApplicationController
tak, aby ominął Devisebefore_filter :authenticate_user!
kod w obrębieApplicationController
.
Więc mój kod Edit 2, gdy wygląda tak:
module Api
module V1
class RestaurantsController < ApplicationController
...
do
module Api
module V1
#Replace 'ApplicationController' with 'ActionController::Base'
class RestaurantsController < ActionController::Base
...