我正在尝试使用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
答案 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一旦我对这个解决方案进行了更多的测试,我就会把叉子推到主项目上。