Ruby on rails 带有出站http代理的Rails Omniauth

Ruby on rails 带有出站http代理的Rails Omniauth,ruby-on-rails,proxy,omniauth,Ruby On Rails,Proxy,Omniauth,我们试图在http代理背后的Rails应用程序中使用linkedin omniauth gem 我已经尽我所能让omniauth使用代理,但我无法让它工作 建议使用: provider :linkedin, 'xxx', 'xxx', { :client_options => { :proxy => ENV["HTTP_PROXY"] || ENV["http_proxy"] } } 这对我不起作用,而且我在源代码中没有提到“代理”。我也尝试过为代理编写代码。没有成

我们试图在http代理背后的Rails应用程序中使用linkedin omniauth gem

我已经尽我所能让omniauth使用代理,但我无法让它工作

建议使用:

provider :linkedin, 'xxx', 'xxx', {
  :client_options => {
    :proxy => ENV["HTTP_PROXY"] || ENV["http_proxy"]
  }
}
这对我不起作用,而且我在源代码中没有提到“代理”。我也尝试过为代理编写代码。没有成功

我还为net::http创建了一个带有代理的初始化器。那也不行。我已经在shell和bashrc中导出了代理。以及在/etc/环境中。什么都没用

如何让omniauth使用出站代理

---更新---

虽然下面公认的答案确实适用于Linkedin Oauth,但大多数Gem现在都依赖Oauth2。这消除了Net::HTTP并引入了法拉第,法拉第有一套单独的代理/连接设置规则:

为了让代理与后来的gems(包括流行的Facebook、Google、Github)一起工作,请检查它们所依赖的gem,您需要在初始化器中使用以下内容:

  provider :foursquare, 'xxx', 'xxx', {
    :client_options => {
      :connection_opts => {
        :proxy => "http://127.0.0.1:3128"
      }
    }
  }
我在一年前遇到了这个问题,它为omniauth twitter解决了同样的问题。如果你看一下,他们所做的似乎只是改变了这一点:

require 'omniauth-oauth'
require 'multi_json'

module OmniAuth
  module Strategies
    class Twitter < OmniAuth::Strategies::OAuth
      option :name, 'twitter'
      option :client_options, {:authorize_path => '/oauth/authenticate',
                               :site => 'https://api.twitter.com'}
需要“omniauth oauth”
需要“multi_json”
模块OmniAuth
模块策略
类Twitter'/oauth/authenticate',
:site=>'https://api.twitter.com'}
为此:

require 'omniauth-oauth'
require 'multi_json'

module OmniAuth
  module Strategies
    class Twitter < OmniAuth::Strategies::OAuth
      option :name, 'twitter'
      option :client_options, {:authorize_path => '/oauth/authenticate',
                               :site => 'https://api.twitter.com',
                       :proxy => ENV['http_proxy'] ? URI(ENV['http_proxy']) : nil}
需要“omniauth oauth”
需要“multi_json”
模块OmniAuth
模块策略
类Twitter'/oauth/authenticate',
:site=>'https://api.twitter.com',
:proxy=>ENV['http\u proxy']?URI(ENV['http\u proxy']):nil}
我假设这将设置oauth“proxy”值参数,该参数将通过请求头传递。我认为,如果您使用omniauth linkedin repo并在中进行类似的更改,则应该通过代理服务器对您进行身份验证。我建议作出如下修改:

require 'omniauth/strategies/oauth'

module OmniAuth
  module Strategies
    class LinkedIn < OmniAuth::Strategies::OAuth
      option :name, "linkedin"

      option :client_options, {
        :site => 'https://api.linkedin.com',
        :request_token_path => '/uas/oauth/requestToken',
        :access_token_path => '/uas/oauth/accessToken',
        :authorize_url => 'https://www.linkedin.com/uas/oauth/authenticate',
        :proxy => ENV['http_proxy'] ? URI(ENV['http_proxy']) : nil
      }
需要'omniauth/strategies/oauth'
模块OmniAuth
模块策略
类LinkedIn'https://api.linkedin.com',
:request_token_path=>'/uas/oauth/requestToken',
:access_token_path=>'/uas/oauth/accessToken',
:authorize_url=>'https://www.linkedin.com/uas/oauth/authenticate',
:proxy=>ENV['http\u proxy']?URI(ENV['http\u proxy']):nil
}

这将把环境设置转换为一个URI实例,OmniAuth可以使用、参数化并在请求中正确放置该实例。

干杯,只是刚刚开始重新讨论这个问题。事实上,在注意到大多数oauth gems现在使用Oauth2之后,计划有了细微的变化。。为将来搜索的任何人添加了一个示例。在谷歌rn上似乎很高。这是一个伟大的更新!我肯定是在OAuth2的浪潮中,我不得不把我的网站变成一个提供商。您可能需要检查代理设置,因为端口3128的localhost听起来有点过于具体,不适合一般情况,除非每个代理都像squid代理一样工作().3128 localhost,jus'for testing:)天哪,谁会想到将您的服务器嵌入代理后会带来这么多痛苦!你在向唱诗班说教,花花公子!