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.

Użytkownik 1 - Restauracja 1 (/ restauracje / 1)Użytkownik 2 - Restauracja 2 (/ restauracje / 2)

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 CanCan

Powinienem 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.

Rozwiązanie

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
    ...

questionAnswers(4)

yourAnswerToTheQuestion