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

标签 ruby-on-rails proxy omniauth

我们正在尝试在 http 代理后面的 Rails 应用程序中使用 linkedin-omniauth gem。

我已经尝试了所有我能找到的方法来让 omniauth 使用代理,但我无法让它工作。

following post建议使用:

provider :linkedin, 'xxx', 'xxx', {
  :client_options => {
    :proxy => ENV["HTTP_PROXY"] || ENV["http_proxy"]
  }
}

这对我不起作用,我在源代码中没有提到“代理”。我也尝试过对代理进行硬编码。没有成功。

This SO post doesn't work for me either.

我还使用代理为 net::http 创建了一个初始化程序。那也行不通。我已经在我的 shell 和 bashrc 中导出了代理。在/etc/environment.什么都不起作用。

如何让 omniauth 使用出站代理?

- - 更新 - -

虽然下面接受的答案确实适用于 Linkedin Oauth,但大多数 gem 现在都依赖于 Oauth2。这取消了 Net::HTTP 并引入了 Faraday,它对代理/连接设置的规则进行了单独设置:

https://github.com/simonmorley/oauth2/blob/master/lib/oauth2/client.rb#L36

为了让代理与以后的 gems 一起工作(包括流行的 Facebook、Google、Github 检查他们依赖的 gem),您需要在初始化程序中使用以下内容:
  provider :foursquare, 'xxx', 'xxx', {
    :client_options => {
      :connection_opts => {
        :proxy => "http://127.0.0.1:3128"
      }
    }
  }

最佳答案

我遇到了这个 pull-request从一年前开始,为 omniauth-twitter 解决了相同的问题。如果你看 fix ,看来他们所做的只是改变了这一点:

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'}

对此:
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}

我假设这设置了 oauth “代理”将通过请求 header 传递的值参数。我想如果你 fork omniauth-linkedin repo 并在 OmniAuth::Strategies::LinkedIn 中做一个类似的改变,它应该让您通过代理服务器进行身份验证。我建议按照以下方式进行更改:
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 可以使用、参数化并正确放置在请求中的 URI 实例。

关于ruby-on-rails - 带有出站 http 代理的 Rails Omniauth,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19658886/

相关文章:

ruby-on-rails - 如何覆盖 Rails 命名约定?

r - 在代理后面密谋访问

linux - 通过HTTP代理的SSH隧道

ruby-on-rails - Omniauth-facebook 的 Facebook Canvas 身份验证重定向问题(在 iframe 外部重定向)

ruby-on-rails - 设计 + Omniauth : disable email login when users enable SSO

ruby-on-rails - 如何将 block 传递给 Devise create 方法?

css - Rails 3.2.2 无法使用 css

ruby-on-rails - Paperclip - 将 SVG 转换为 PNG 时保持透明度

windows - 如何强制特定进程使用代理进行网络通信

ruby-on-rails - Omniauth Cucumber 测试 - 路由错误