Как динамически установить область действия OmniAuth во время выполнения? - PullRequest
1 голос
/ 19 февраля 2020

Ранее я указывал на OnmiAuth Dynami c Провайдеры для переключения провайдера во время выполнения в зависимости от посещаемого домена. Мое решение основано на omniauth-shopify-oauth2 и этом великолепном ответе :

Rails.application.config.middleware.use OmniAuth::Builder do
  provider :shopify,
  scope: 'read_orders,read_products',
  setup: lambda { |env|
    request         = ActionDispatch::Request.new(env)
    subdomain       = "#{request.subdomain}" != "" ? "#{request.subdomain}." : ""
    domain          = "#{request.domain}"
    full_domain     = subdomain+domain
    shopify_client  = Rails.cache.fetch("#{full_domain}_shopify_client")

    env['omniauth.strategy'].options.merge!(
      {
        client_id:       shopify_client[:client_id],
        client_secret:   shopify_client[:client_secret]
      }
    )
    env['omniauth.strategy'].options[:client_options][:site] = "https://#{request.GET['shop']}"
  }
end

Но теперь мне также нужно иметь возможность динамически устанавливать область действия. Таким образом, "#{full_domain}_shopify_client" из кэша будет содержать дополнительный ключ client_permissions, содержащий, например, 'read_orders,read_products' или 'read_products'.

Как мне выполнить рефакторинг своего кода, чтобы это можно было сделать?

1 Ответ

1 голос
/ 14 марта 2020

Вот ссылка, которая может помочь: https://github.com/Shopify/omniauth-shopify-oauth2/issues/60

Я переписал ваш скрипт таким образом, который, кажется, реализует то, что вы хотите. Динамически добавьте «scope» из: client_permissions key

Rails.application.config.middleware.use OmniAuth::Builder do
  provider :shopify,
  setup: lambda { |env|
    request         = ActionDispatch::Request.new(env)
    subdomain       = request.subdomain
    domain          = request.domain
    full_domain     = subdomain+domain
    shopify_client  = Rails.cache.fetch("#{full_domain}_shopify_client")

    env['omniauth.strategy'].options.merge!(
      {
        client_id:       shopify_client[:client_id],
        client_secret:   shopify_client[:client_secret],
        scope:           shopify_client[:client_permissions]
        client_options: {
          site: "https://#{request.GET['shop']}"
        },

      }
    )

end

Если есть ошибка Scope does not match, it may have been tampered with., возможно, вам придется настроить Rails.cache.fetch("#{full_domain}_shopify_client")[:client_permissions] в сеансе (session['shopify.oauth.scope']).

strategy = env['omniauth.strategy']
session = strategy.session.with_indifferent_access
env['omniauth.strategy'].options[:scope] = session['shopify.oauth.scope']

Внутри вашей лямбды настройки.

Затем, перед перенаправлением на обратный вызов oauth (например, из контроллера)

subdomain       = request.subdomain
domain          = request.domain
full_domain     = subdomain+domain
shopify_client  = Rails.cache.fetch("#{full_domain}_shopify_client")

session['shopify.oauth.scope'] = shopify_client[:client_permissions]
...