【发布时间】:2011-06-27 18:46:08
【问题描述】:
我有一个可以从 2 个域访问的 rails 应用程序。 Facebook 要求我为每个域注册一个 facebook 应用程序,并为每个域提供凭据。使用 Omniauth,我只能指定一组在应用程序启动时设置的凭据。但是,我需要根据请求的主机为 FB 提供不同的凭据。
这里有两个问题:
- 如何在运行时更改 facebook 的 Omniauth 凭据?
- 如何拦截对 facebook 的调用、检查域并相应地设置凭据?由于 Omniauth 使用机架中间件,因此前置过滤器将不起作用。
非常感谢任何建议!
【问题讨论】:
-
好的,我确实在这里找到了执行此操作的说明:github.com/intridea/omniauth/wiki/Dynamic-Providers 但是,它们对我不起作用。 Omniauth 直接联系提供者,即使我设置了拦截“提供者/身份验证”调用的路由......我正在使用带有 Omniauth 0.1.6 的 Rails 2.3.5
-
好的,我将 gem 更新到版本 0.2.0.beta4 并且路由现在可以工作,但是即使我将环境变量设置为正确的凭据,我也会遇到身份验证失败。 facebook 的授权 url 看起来与在配置中手动设置凭据时完全相同。顺便说一句,现在调用了变量(client_id 和 client_secret,而不是 wiki 中所说的 consumer_key 和 consumer_secret)。
-
我现在自己解决了这个问题。问题是 fb 策略第二次回调 fb 以获取访问令牌。在第二次调用中,使用了错误的凭据(在初始化程序中设置的凭据)。所以我不得不修补 OAuth2 策略,以便它再次调用 rails 应用程序,为第二次调用设置运行时凭据。在通常只处理响应表单 Omniauth 的回调中,我设置凭据并返回 404,除非 request.env["omniauth.auth"] 存在。这很好用,但对于没有动态提供程序的应用程序有一些副作用。
-
现在的问题是,即使应用程序不想在运行时设置凭据,它也必须在回调中添加条件,例如 if request.env["omniauth.auth"]避免在第一次调用时执行回调代码。解决方案可能是向 Omniauth 构建器添加一个参数,例如 :dynamic_provider,并且仅在设置时调用应用程序。
-
我看到您使用的是 Rails 2.3.5 和 Omniauth 0.1.6。我不能让他们一起工作,因为 rails 2.3.5 需要 Rack 1.0.1 而 Omniauth 需要 Rack 1.1 非常感谢任何帮助。保罗
标签: ruby-on-rails rack middleware omniauth