【问题标题】:Omniauth: How to set authentication provider details at runtimeOmniauth:如何在运行时设置身份验证提供程序详细信息
【发布时间】:2011-06-27 18:46:08
【问题描述】:

我有一个可以从 2 个域访问的 rails 应用程序。 Facebook 要求我为每个域注册一个 facebook 应用程序,并为每个域提供凭据。使用 Omniauth,我只能指定一组在应用程序启动时设置的凭据。但是,我需要根据请求的主机为 FB 提供不同的凭据。

这里有两个问题:

  1. 如何在运行时更改 facebook 的 Omniauth 凭据?
  2. 如何拦截对 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


【解决方案1】:

从 cmets 复制答案,以便从“未回答”过滤器中删除此问题:

我现在自己解决了这个问题。问题是 fb 策略调用 第二次返回 fb 以获取访问令牌。在第二次通话中 使用了错误的凭据(在初始化程序中设置的凭据)。所以 我必须修补 OAuth2 策略,以便它调用 再次使用 rails app,为第二次调用设置运行时凭据。 在回调中,通常只处理响应表单 Omniauth,我设置凭据并返回 404,除非 request.env["omniauth.auth"] 存在。效果很好,但有一些 没有动态提供程序的应用程序的副作用。

现在的问题是,即使应用程序不想在运行时设置凭据,它也必须在回调中添加条件,例如 if request.env["omniauth.auth"] 以避免回调代码第一次调用时执行。解决方案可能是向 Omniauth 构建器添加一个参数,例如 :dynamic_provider,并且仅在设置时调用应用程序。

~回答Nico

【讨论】:

    【解决方案2】:

    这个问题相当古老,但仍然相关。现在还可以在 OmniAuth 的设置阶段动态设置提供者详细信息。

    例如:

    Rails.application.config.middleware.use do
      provider :example, 
        setup: ->(env) do
          env['omniauth.strategy'].options[:foo] = env['rack.session']['foo']
          env['omniauth.strategy'].options[:client_options][:site] = Something.dynamic('param')
      end
    end
    

    来源:https://github.com/omniauth/omniauth/wiki/Dynamic-Providers

    【讨论】:

      猜你喜欢
      • 2018-03-05
      • 2018-08-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-02-09
      • 1970-01-01
      • 2021-01-06
      • 1970-01-01
      相关资源
      最近更新 更多