Сменить провайдера для драгоценного камня omniauth-shopify-oauth2 во время выполнения? - PullRequest
0 голосов
/ 06 июня 2018

Инициализатор для драгоценного камня omniauth-shopify-oauth2 должен выглядеть следующим образом:

# config/initializers/omniauth.rb
Rails.application.config.middleware.use OmniAuth::Builder do
  provider :shopify, ENV['SHOPIFY_API_KEY'], ENV['SHOPIFY_SHARED_SECRET']
end

Однако в нашем приложении Rails есть несколько разных брендов, которые предлагают одинаковыефункциональность.Во всем приложении request.domain запроса определяет, к какому бренду вы обращаетесь (brand1.example.com, brand2.example.com и т. Д.).

Мы можем легко сохранять учетные данные бренда и перенаправлять пользователей напуть авторизации для конкретного бренда:

https://example.myshopify.com/admin/oauth/authorize?client_id=brand1&scope=read_orders,read_products&redirect_uri=https://brand1.example.com/auth/shopify/callback

Но я не могу понять, как у нас могут быть разные провайдеры для промежуточного программного обеспечения, выбранные на основе посещенного request.domain.Есть идеи, как это настроить?

1 Ответ

0 голосов
/ 13 июня 2018

Omniauth предоставляет документацию по Динамическим провайдерам , которая будет полезна здесь.Что-то вроде:

# config/initializers/omniauth.rb
Rails.application.config.middleware.use OmniAuth::Builder do
  provider :shopify, setup: lambda do |env|

    # Do logic to get correct credentials for request.
    # For example, if you store the credentials on a model called Brand,
    # and have it keyed on "subdomain":
    request = ActionDispatch::Request.new(env)
    brand = Brand.find_by(subdomain: request.subdomain)

    env['omniauth.strategy'].options.merge!({
      client_id: brand.client_id,
      client_secret: brand.client_secret
    })

    # `site` needs to be set. This is part of the shopify provider setup phase, which we are overriding
    env['omniauth.strategy'].options[:client_options][:site] = "https://#{ request.GET['shop'] }"
  end
end
...