0

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
4

1 に答える 1

0

さて、これは私がグーグル経由でこれに出くわした人のためにしたことの要約です。

私は質問した方法で問題を解決しませんでした。代わりに、サブドメインをセッションにプッシュし、サイト値を使用する必要があるときはいつでもそれを上書きしました。

コードは次のとおりです。

  #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にあります。このソリューションをもう少しバトルテストしたら、フォークをメインプロジェクトにプッシュします。

于 2010-11-08T16:41:33.197 に答える