Решил эту проблему, следуя примеру Authlogic , и просто подставив модель ClientAccount для модели User. Итак, в моем контроллере приложений у меня есть:
before_filter :require_client
def require_client
unless current_client
store_location
render :text => 'Authentication failed', :status => 401
return false
end
end
def require_no_client
if current_client
store_location
render :text => 'Client session already exists', :status => 401
return false
end
end
def current_client_session
return @current_client_session if defined?(@current_client_session)
@current_client_session = ClientSession.find
end
def current_client
return @current_client if defined?(@current_client)
@current_client = current_client_session && current_client_session.record
end
Модель ClientAccount действовать_as_authentic, а модель ClientSession обрабатывает создание и уничтожение сеансов для Authlogic (authenticate_with ClientAccount):
class ClientSessionsController < ApplicationController
before_filter :require_no_client, :only => [:new, :create]
before_filter :require_client, :only => :destroy
def new
@client_session = ClientSession.new
end
def create
@client_session = ClientSession.new(params[:client_session])
if @client_session.save
redirect_back_or_default account_url
else
render :action => :new
end
end
def destroy
current_client_session.destroy
redirect_back_or_default new_client_session_url
end
end
Это решение хорошо сработало, поскольку мы можем создавать различные комбинации ключей и сигнатур API для разных клиентов, что дает нам дополнительные данные об использовании. Единственная «ошибка» - это если вы выполняете что-то вроде многократной загрузки файла, поскольку хеш POST использует необработанные данные POST.