我的生产rails 3.2 app在多个域上运行。我正在设置omniauth身份验证(版本1.1.0,如果重要,也使用设计2.1.0)来跨这些域工作。不幸的是,许多oauth提供商(例如Facebook)一次只允许与一个域集成,或者要求您指定您希望使用的每个回调URL。这对于这个用例是不实际的,因为域名不断被添加。
我的解决方案是拥有一个身份验证网址,这样当用户尝试使用omniauth登录任何联属网站时,回调网址就是一个标准网址(即auth.example.com)。
我能够使omniauth集成工作,并且我可以允许用户对auth.example.com域进行身份验证。下一步是将它们发送回它们的来源,以及某种身份验证密钥。我使用env['omniauth.origin']
来确定用户的原始位置,但由于某种原因,只要我在设置OmniAuth.config.full_host
选项的情况下重新启动rails服务器,此变量就会变为空白。
长话短说:只要我在初始化程序中没有使用env['omniauth.origin']
,我就可以在回调控制器中访问OmniAuth.config.full_host
。但是,我无法弄清楚如何在没有它的情况下使跨域身份验证工作。
编辑: 我已经创建了一个小样本应用来演示这个问题。您必须在config / initializers / omniauth.rb中填写自己的facebook app凭据。您会注意到,当您使用Facebook进行身份验证时,参数和原点都会正确传递。但是,如果取消注释config / initializers.omniauth.rb中的full_host配置选项并重新启动应用程序,您会注意到在使用Facebook进行身份验证后,您将被重定向到正确的URL,但不再传递参数和原始数据通过