Rails oauth-plugin: множественные стратегии вызывают двойную ошибку nonce - PullRequest
2 голосов
/ 28 апреля 2011

У меня есть действие контроллера, которое может быть выполнено клиентом с 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 во второй раз, он пытается вспомнить одноразовый номер, который мы уже вспомнили.

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

Я не вижу четкого способа сделать это без разветвления Пелле. файл application_controller_methods, но я надеюсь, что мне просто не хватает очевидное исправление, которое предложит один из вас! Спасибо за вашу помощь! Если вам интересно, я использую rails3 с плагином oauth-pluel и его вилка 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'
...