Omniauth:如何在运行时设置身份验证提供程序详细信息

时间:2011-02-15 17:21:26

标签: ruby-on-rails rack middleware omniauth

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

这里有两个问题:

  1. 如何在运行时更改Facebook的Omniauth凭据?
  2. 如何拦截对facebook的通话,检查域名并相应地设置凭据?由于Omniauth使用Rack Middleware,因此之前的过滤器不起作用。
  3. 任何建议都非常感谢!

2 个答案:

答案 0 :(得分:0)

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

  

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

     

现在的问题是,即使应用程序不想在运行时设置凭据,它也必须为回调添加一个条件,就像request.env [“omniauth.auth”]一样,以避免回调代码在第一次调用时执行。解决方案可能是向Omniauth构建器添加一个参数,如:dynamic_provider,如果已设置,则只调用应用程序。

〜每Nico

回答

答案 1 :(得分:0)

这个问题已经很老了,但仍然相关。现在,还可以在 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