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