Клиент Oauth с провайдером Doorkeeper за базовой аутентификацией - PullRequest
0 голосов
/ 30 мая 2018

Мы настраиваем провайдера Doorkeeper в нашем главном приложении, чтобы включить аутентификацию Oauth2 в некоторых сторонних приложениях.Все отлично работает в нашей производственной среде.

В промежуточной среде это другая история, потому что наши промежуточные приложения стоят за базовой аутентификацией:

config.middleware.insert_after(::Rack::Runtime,
                               'Rack::Auth::Basic',
                               "Staging") do |user, password|
                                 [user, password] == [ENV['STAGING_USERNAME'], ENV['STAGING_PASSWORD']]
                              end
end

Это означает, что конечная точка Oauth должна проходить через эту базовуюаутентификация.Вот конфигурация клиента Oauth:

require 'omniauth-oauth2'

module OmniAuth
  module Strategies
    class MyAuth < OmniAuth::Strategies::OAuth2
      option :name, "MyAuth"

      # Added Basic auth credentials for staging environment
      option :client_options, {:site => "https://youshall:notpass@my-staging-server.info"}

      uid{ raw_info['id'] }

      info do
        {
          remote_id: raw_info['remote_id'],
          name: raw_info['name'],
          email: raw_info['email']
        }
      end

      extra do
        {
          'raw_info' => raw_info
        }
      end

      def raw_info
        @raw_info ||= access_token.get('/api/me').parsed
      end
    end
  end
end

Но Oauth, похоже, не может проанализировать URI, включая, поскольку я получаю следующую ошибку при попытке получить учетные данные:

Encoding::UndefinedConversionError: "\xC3" from ASCII-8BIT to UTF-8
- 51 non-project frames
1
File "/app/vendor/bundle/ruby/2.4.0/gems/oauth2-1.2.0/lib/oauth2/error.rb" line 30 in encode
2
File "/app/vendor/bundle/ruby/2.4.0/gems/oauth2-1.2.0/lib/oauth2/error.rb" line 30 in error_message
3
File "/app/vendor/bundle/ruby/2.4.0/gems/oauth2-1.2.0/lib/oauth2/error.rb" line 17 in initialize
4
File "/app/vendor/bundle/ruby/2.4.0/gems/oauth2-1.2.0/lib/oauth2/client.rb" line 112 in new
5
File "/app/vendor/bundle/ruby/2.4.0/gems/oauth2-1.2.0/lib/oauth2/client.rb" line 112 in request
6
File "/app/vendor/bundle/ruby/2.4.0/gems/oauth2-1.2.0/lib/oauth2/client.rb" line 138 in get_token
7
File "/app/vendor/bundle/ruby/2.4.0/gems/oauth2-1.2.0/lib/oauth2/strategy/auth_code.rb" line 29 in get_token
8
File "/app/vendor/bundle/ruby/2.4.0/gems/omniauth-oauth2-1.4.0/lib/omniauth/strategies/oauth2.rb" line 89 in build_access_token
9
File "/app/vendor/bundle/ruby/2.4.0/gems/omniauth-oauth2-1.4.0/lib/omniauth/strategies/oauth2.rb" line 73 in callback_phase
10
File "/app/vendor/bundle/ruby/2.4.0/gems/omniauth-1.3.1/lib/omniauth/strategy.rb" line 227 in callback_call
11
File "/app/vendor/bundle/ruby/2.4.0/gems/omniauth-1.3.1/lib/omniauth/strategy.rb" line 184 in call!
12
File "/app/vendor/bundle/ruby/2.4.0/gems/omniauth-1.3.1/lib/omniauth/strategy.rb" line 164 in call
13
File "/app/vendor/bundle/ruby/2.4.0/gems/omniauth-1.3.1/lib/omniauth/builder.rb" line 63 in call

Я не смог найти учетные данные Basic Auth для Omniauth или Omniauth :: Oauth2, если за такой аутентификацией стоит сервер Oauth.

Другим способом может быть внесение в белый список IP-адреса промежуточных клиентов на промежуточном сервере Oauth.Поскольку мы используем Heroku, приложения работают на высокодинамичных IP-адресах.Некоторые дополнения герою позволяют маршрутизировать исходящий трафик через статиг IP, НО мне нужно программно настроить прокси.И я не смог найти способ настроить этот прокси для запросов Oauth.

Кто-нибудь сталкивался с такой проблемой и нашел обходной путь?

1 Ответ

0 голосов
/ 30 мая 2018

А-а-а-а, наконец, мне не потребовалось слишком много времени, чтобы найти решение (на самом деле написание этого вопроса было частью :))

Так что стратегия omniauth-oauth2 использует Oauth gem который в свою очередь использует удивительную библиотеку Фарадея HTTP .Было не так сложно найти способ настроить прокси-сервер в Фарадее .

Моя страсть к Омниавту теперь выглядит так:

require 'omniauth-oauth2'

module OmniAuth
  module Strategies
    class MyAuth < OmniAuth::Strategies::OAuth2
      option :name, "MyAuth"

      # Added Basic auth credentials for staging environment
      option :client_options, {:site => "https://youshall:notpass@my-staging-server.info"}

      uid{ raw_info['id'] }

      info do
        {
          remote_id: raw_info['remote_id'],
          name: raw_info['name'],
          email: raw_info['email']
        }
      end

      extra do
        {
          'raw_info' => raw_info
        }
      end

      # Adding the proxy here
      def client
        super.tap do |c|
          c.connection.proxy(ENV["OAUTH_PROXY_URL"]) if ENV["OAUTH_PROXY_URL"]
        end
      end
      def raw_info
        @raw_info ||= access_token.get('/api/me').parsed
      end
    end
  end
end

А теперь мне просто нужновнести в белый список мой IP-адрес прокси, чтобы обойти обычную проверку подлинности на сервере Oauth.Вуаля!

...