策略中的OmniAuth动态客户端选项站点

时间:2012-06-21 14:21:14

标签: ruby-on-rails oauth omniauth

我将rails应用程序设置为OAuth2提供程序(使用Doorkeeper)。该应用程序使用每个用户帐户的不同子域(或通过cname记录完全不同的域)

i.e. 
user1.myrailsapp.com
user2.myrailsapp.com
www.mycustomdomain.com

在提供商方面,一切都按预期工作。

我还有第二个应用程序,它是一个使用第一个应用程序的公开API的客户端。我有一个版本的客户端工作,但只有OmniAuth策略中的硬编码站点URL。

问题是,如何根据请求动态设置策略网址。

2 个答案:

答案 0 :(得分:2)

对于任何感兴趣的人,解决方案是使用动态提供程序:https://github.com/intridea/omniauth/wiki/Dynamic-Providers

Rails.application.config.middleware.use OmniAuth::Builder do
  provider :mystrategy, ENV["OAUTH_ID"], ENV["OAUTH_SECRET"],
    :setup => lambda{|env| 
      env['omniauth.strategy'].options[:client_options].site = env['rack.session']['oauth_site']
    }
end

答案 1 :(得分:0)

一种选择是不要这样做。

我有一个类似的应用程序并遇到了同样的问题。然而,在考虑了一下之后,我意识到我不想将它们发送到用户帐户子域上的策略提供程序URL,因为该请求尚未完全通过身份验证(尚未由rails应用程序处理) )。

此外,用户第一次登录用户帐户子域尚未设置,因此无法在那里路由。

相反,我将策略回调URL设置为主网站。在处理登录请求,会话设置和所有内容之后,我将客户端重定向到其用户子域。消除了一大堆痛苦。