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.

Benutzer 1 - Restaurant 1 (/ restaurants / 1)Benutzer 2 - Restaurant 2 (/ restaurants / 2)

Und ich öffne einen brandneuen Browser und habe mich bei nichts eingeloggt und gebe meine URL weiter.../restaurants/2.json?api_key=1234Ich 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 CanCan

Ich 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-Versionierung

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

Lösung

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

Antworten auf die Frage(4)

Ihre Antwort auf die Frage