如何持久覆盖Rack :: Builder初始化的属性?

时间:2010-11-06 10:25:48

标签: ruby oauth rack omniauth

我正在尝试使用OmniAuth来处理小型Sinatra应用程序的OAuth流程。我可以让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 :(得分:0)

好的,这里是我通过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一旦我对这个解决方案进行了更多的测试,我就会把叉子推到主项目上。