查找OmniAuth的已加载提供程序

iai*_*ain 6 ruby omniauth

我想知道OmniAuth gem使用了哪些提供程序.我试过这个:

OmniAuth::Strategies.constants  # a method provided by the standard lib Module class
# => [:Developer, :OAuth, :Twitter]
Run Code Online (Sandbox Code Playgroud)

还有这个:

OmniAuth.strategies.inspect # a method provided by the OmniAuth class, but which has no documentation or comments around it.
# => [OmniAuth::Strategies::OAuth]
Run Code Online (Sandbox Code Playgroud)

我期望(或想要)的答案[:Developer, :Twitter]就像我的测试代码一样,我只是明确地加载了twitter,默认情况下加载了开发人员.

(这就是所有不同的库可以加载正确的东西使它工作,取决于OmniAuth运行的是什么.)

如果有办法让你知道,请告诉我.否则我将是务实的,并从第一个例子中将OAuth从列表中删除.

Ruby是1.9.3,OmniAuth是v1.1.1

小智 16

在这里为Devise用户添加这个,因为我需要与iain相同的列表.

我尝试在Rails项目中使用我的设计初始化程序顶部接受的答案,但是我收到了一个错误(@@ providers未定义).

在查看Devise源代码之后,我使用以下内容来获取符号数组:

Devise.omniauth_configs.keys # => [:facebook, :twitter]
Run Code Online (Sandbox Code Playgroud)

  • 您也可以使用Devise.omniauth_providers (9认同)

小智 6

OmniAuth :: Strategies列出了可用和已注册的策略.不是那些"使用"的.如果您仔细查看OmniAuth构建器的代码,您将看到使用use提供程序块中的中间件将各种策略传递到Rack上,这使得跟踪策略更加困难.另一种"务实"的方法是修补OmniAuth Builder并跟踪提供者.

module OmniAuth
  class Builder < ::Rack::Builder
    def provider_patch(klass, *args, &block)
      @@providers ||= []
      @@providers << klass
      old_provider(klass, *args, &block)
    end
    alias old_provider provider
    alias provider provider_patch
    class << self
      def providers
        @@providers
      end
    end
  end
end
Run Code Online (Sandbox Code Playgroud)

在配置提供程序之前包括此修补程序.一旦加载了所有提供程序,OmniAuth::Builder.providers就会为您提供所需的数组.

即使开发人员策略可用,也不会加载.只有在您指定时才会加载它

provider :developer
Run Code Online (Sandbox Code Playgroud)