Плагин Rails oauth: несколько стратегий вызывают дублирующую ошибку одноразового номера

У меня есть действие контроллера, которое может быть выполнено клиентом с токеном клиента oauth (без аутентифицированного пользователя) или авторизованным клиентом с токеном доступа (для определенного пользователя). Я хочу настроить небольшой передний фильтр, чтобы учесть это. Я старался:

oauthenticate :strategies => [:oauth10_request_token, :oauth10_access_token], 
              :interactive => false, 
              :only => [:wonky_action] 

Если я попытаюсь выполнить это действие с запросом токена доступа, оно жалуется, потому что дважды пытается запомнить OauthNonce. Вот как выглядит мой метод ClientApplication.verify_request:

def self.verify_request(request, options = {}, &block) 
    begin 
        signature = OAuth::Signature.build(request, options, &block) 
        nonce = OauthNonce.remember(signature.request.nonce, signature.request.timestamp) 
        unless nonce 
            Rails.logger.warn "Oauth request failing because of invalid nonce." 
            return false 
        end 
        value = signature.verify 
        unless value 
            Rails.logger.warn "Signature verification failed." 
        end 
        value 
    rescue OAuth::Signature::UnknownSignatureMethod => e 
        false 
    end 
end

Глядя на это, в поведении нет ничего удивительного. Он проходит через метод oauth10_request_token и без проблем запоминает одноразовый номер, но токен не является токеном запроса, поэтому происходит сбой. Затем он пытается запустить oauth10_access_token, и когда он вызывает verify_request во второй раз, он пытается вспомнить одноразовый номер, который мы уже запомнили.

Лучшее решение, которое я могу придумать, — это отделить запоминание одноразового номера от остальной части проверки запроса. Другими словами, сервер сначала проверяет одноразовый номер, а затем выполняет проверку подписи (или что-либо еще, что Verify_request хочет сделать) столько раз, сколько ему заблагорассудится.

Я не вижу четкого способа сделать это без разветвления файла application_controller_methods Пелле, но я надеюсь, что просто упустил очевидное исправление, которое предложит один из вас! Спасибо за вашу помощь! Если вам интересно, я использую rails3 с плагином oauth от pelle и его форком oauth:

gem 'oauth', :git => "http://github.com/pelle/oauth.git", :require => 'oauth/server' 
gem "oauth-plugin", :git => 'https://github.com/pelle/oauth-plugin.git', :branch => 'rails3'

person andrewmitchell    schedule 27.04.2011    source источник
comment
Неудовлетворительный способ обойти это — сначала выполнить аутентификацию по токену, а затем — двухстороннюю аутентификацию. Если вы сделаете это с действительным токеном доступа, токен будет успешным, и одноразовый номер больше не будет проверяться. Если вы сделаете это только с клиентским токеном, то во время шага access_token произойдет ошибка до запоминания одноразового номера (на самом деле он не может создать подпись). В случае, если у вас нет ни того, ни другого, аутентификация завершается ошибкой, чего мы и хотим, но это грязно. На самом деле, это поведение oauthenticate по умолчанию.   -  person andrewmitchell    schedule 07.05.2011