У меня есть действие контроллера, которое может быть выполнено клиентом с токеном клиента 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'
oauthenticate
по умолчанию. - person andrewmitchell   schedule 07.05.2011