Rails Omniauth с исходящим HTTP-прокси

Мы пытаемся использовать связанный-омняут-камень в приложении Rails, который находится за прокси-сервером http.

Я пробовал все, что мог найти, чтобы заставить omniauth использовать прокси-сервер, но я не могу заставить его работать.

следующее сообщение предлагает использовать:

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

Что не работает для меня, и я не вижу упоминания прокси-сервера в источнике. Я также пытался жестко кодировать прокси. Нет успеха.

Этот пост SO тоже не работает для меня.

Я также создал инициализатор для net:: http с прокси. Это тоже не работает. Я экспортировал прокси в моей оболочке и bashrc. И в /etc/environment. Ничего не работает.

Как я могу заставить omniauth использовать исходящий прокси?

--- UPDATE ---

Хотя принятый ответ ниже действительно работает для Linkedin Oauth, большинство драгоценных камней теперь полагаются на Oauth2. Это устраняет Net:: HTTP и вводит Faraday, который имеет отдельный набор правил для настроек прокси-соединения:

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

Чтобы получить прокси-сервер, работающий с более поздними драгоценными камнями (в том числе популярный Facebook, Google, Github, проверить, на какой драгоценный камень они полагаются), вы должны использовать в своем инициализаторе следующее:

  provider :foursquare, 'xxx', 'xxx', {
    :client_options => {
      :connection_opts => {
        :proxy => "http://127.0.0.1:3128"
      }
    }
  }

Ответы

Ответ 1

Я столкнулся с этим 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 "proxy" , который будет передан через заголовок запроса. Я думаю, что если вы откажетесь от репликации omniauth-linkedin и сделаете аналогичное изменение в 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
      }

Это должно преобразовать параметр среды в экземпляр URI, который OmniAuth может потреблять, параметризовать и правильно размещать в запросе.