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