Como pular a autenticação do Devise ao usar uma chave de API?

Estou usando o Devise no meu aplicativo e gostaria de criar uma chave de API global que possa acessar os dados JSON da conta de qualquer pessoa sem precisar fazer login.

Por exemplo, digamos que minha chave de API é1234 e eu tenho dois usuários que criaram dois restaurantes diferentes.

Utilizador 1 - Restaurante 1 (/ restaurantes / 1)Utilizador 2 - Restaurante 2 (/ restaurantes / 2)

E eu abro um novo navegador e não entro em nada e eu passo para o meu URL.../restaurants/2.json?api_key=1234, Eu deveria ser capaz de acessar os dados JSON desse restaurante sem ter que logar comoUsuário 2

Qual é a melhor forma de fazer isso?

Eu segui oRailscast # 352 Protegendo uma API Assim, posso acessar o material do JSON passando a chave da API, mas preciso fazer o login para ver qualquer coisa.

Editar 1: usando o CanCan

Devo mencionar que também estou usando CanCan para papéis, mas não tenho certeza se isso vai desempenhar algum papel (trocadilho não intencional) nessa situação.

Editar 2: Implemente com o Versioning de API

Eu segui o Railscast # 350 e # 352 que ensinam como criar o versionamento da API REST e como protegê-lo com uma chave de API.

Aqui está o que meu controllers / api / v1 / restaurantes / restaurants_controller.rb se parece com:

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

E meuapplication_controller.rb ainda tem obefore_filter :authenticate_user! código nele.

Solução

Eu primeiro segui oRailscast # 350 na versão de API REST e movi todas as minhas chamadas da JSON API para/apps/api/v1/...

Então, seguindo a solução de Steve Jorgensen abaixo, certifiquei-me de que meu módulo de API era herdado deActionController::Base ao invés deApplicationController de modo que contornou Devise'sbefore_filter :authenticate_user! código dentro doApplicationController.

Então, meu código Editar 2 quando se parece com isso:

module Api
  module V1
    class RestaurantsController < ApplicationController
    ...

para

module Api
  module V1
    #Replace 'ApplicationController' with 'ActionController::Base'
    class RestaurantsController < ActionController::Base
    ...

questionAnswers(4)

yourAnswerToTheQuestion