Как я могу постоянно перезаписывать атрибут, инициализированный Rack :: Builder? - PullRequest
0 голосов
/ 06 ноября 2010

Я пытаюсь использовать OmniAuth для обработки потока OAuth для приложения Sinatra небольшого размера.Я могу заставить 37signals Oauth работать отлично, но я пытаюсь создать стратегию и для Freshbooks Oauth.

К сожалению, для Freshbooks требуются запросы OAuth для перехода на отдельный субдомен пользователя.Я получаю субдомен в качестве входных данных, и мне нужно постоянно использовать URL-адрес конкретного сайта клиента для всех запросов.

Вот что я пробовал до сих пор.Проблема в том, что новое значение сайта не сохраняется после первого запроса.

Должен быть простой способ добиться этого, но я в замешательстве.

  #Here's the setup -
  def initialize(app, consumer_key, consumer_secret, subdomain='api')
    super(app, :freshbooks, consumer_key, consumer_secret,
               :site               => "https://"+subdomain+".freshbooks.com", 
               :signature_method   => 'PLAINTEXT',
               :request_token_path => "/oauth/oauth_request.php",
               :access_token_path  => "/oauth/oauth_access.php",
               :authorize_path     => "/oauth/oauth_authorize.php"
          )
  end


  def request_phase
    #Here's the overwrite -
    consumer.options[:site] = "https://"+request.env["rack.request.form_hash"]["subdomain"]+".freshbooks.com"
    request_token = consumer.get_request_token(:oauth_callback => callback_url)
    (session[:oauth]||={})[name.to_sym] = {:callback_confirmed => request_token.callback_confirmed?, 
                                           :request_token => request_token.token, 
                                           :request_secret => request_token.secret}
    r = Rack::Response.new
    r.redirect request_token.authorize_url
    r.finish
  end

1 Ответ

0 голосов
/ 08 ноября 2010

Хорошо, вот краткое изложение того, что я сделал для тех, кто сталкивался с этим через Google.

Я не решил проблему так, как задал вопрос, вместо этого я вставил поддомен в сеанс изатем я перезаписываю его всякий раз, когда необходимо использовать значение сайта.

Вот код:

  #Monkeypatching to inject user subdomain
  def request_phase
    #Subdomain is expected to be submitted as <input name="subdomain">
    session[:subdomain] = request.env["rack.request.form_hash"]["subdomain"]
    consumer.options[:site] = "https://"+session[:subdomain]+".freshbooks.com"
    super 
  end

  #Monkeypatching to inject subdomain again
  def callback_phase
    consumer.options[:site] = "https://"+session[:subdomain]+".freshbooks.com"
    super
  end

Обратите внимание, что вы все равно должны установить что-то в качестве сайта при его инициализации, иначе вы будетеполучить ошибки из-за того, что OAuth не использует SSL для выполнения запросов.

Если вы хотите увидеть фактический код, который я использую, он находится по адресу: https://github.com/joeharris76/omniauth Я перешлю вилку к основномуПроект, как только я проверил это решение в битве, немного больше.

...