shopify_app 17.0.4 → 17.2.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/.github/CODEOWNERS +1 -0
- data/.github/ISSUE_TEMPLATE/bug-report.md +63 -0
- data/.github/ISSUE_TEMPLATE/config.yml +1 -0
- data/.github/ISSUE_TEMPLATE/feature-request.md +33 -0
- data/.github/PULL_REQUEST_TEMPLATE.md +17 -1
- data/.github/workflows/build.yml +4 -1
- data/CHANGELOG.md +24 -0
- data/CONTRIBUTING.md +76 -0
- data/Gemfile.lock +81 -80
- data/README.md +72 -593
- data/app/controllers/concerns/shopify_app/shop_access_scopes_verification.rb +32 -0
- data/app/controllers/shopify_app/callback_controller.rb +24 -2
- data/app/controllers/shopify_app/sessions_controller.rb +13 -4
- data/config/locales/nl.yml +1 -1
- data/docs/Quickstart.md +15 -77
- data/docs/Troubleshooting.md +129 -4
- data/docs/Upgrading.md +126 -0
- data/docs/shopify_app/authentication.md +124 -0
- data/docs/shopify_app/engine.md +82 -0
- data/docs/shopify_app/generators.md +127 -0
- data/docs/shopify_app/handling-access-scopes-changes.md +14 -0
- data/docs/shopify_app/script-tags.md +28 -0
- data/docs/shopify_app/session-repository.md +88 -0
- data/docs/shopify_app/testing.md +38 -0
- data/docs/shopify_app/webhooks.md +72 -0
- data/lib/generators/shopify_app/home_controller/templates/home_controller.rb +2 -0
- data/lib/generators/shopify_app/home_controller/templates/unauthenticated_home_controller.rb +1 -0
- data/lib/generators/shopify_app/install/install_generator.rb +30 -1
- data/lib/generators/shopify_app/install/templates/embedded_app.html.erb +1 -1
- data/lib/generators/shopify_app/install/templates/omniauth.rb +1 -0
- data/lib/generators/shopify_app/install/templates/shopify_app.rb.tt +5 -2
- data/lib/generators/shopify_app/install/templates/shopify_provider.rb.tt +8 -0
- data/lib/generators/shopify_app/shop_model/shop_model_generator.rb +27 -0
- data/lib/generators/shopify_app/shop_model/templates/db/migrate/add_shop_access_scopes_column.erb +5 -0
- data/lib/generators/shopify_app/shop_model/templates/shop.rb +1 -1
- data/lib/generators/shopify_app/shopify_app_generator.rb +1 -1
- data/lib/generators/shopify_app/user_model/templates/db/migrate/add_user_access_scopes_column.erb +5 -0
- data/lib/generators/shopify_app/user_model/templates/user.rb +1 -1
- data/lib/generators/shopify_app/user_model/user_model_generator.rb +27 -0
- data/lib/shopify_app.rb +10 -0
- data/lib/shopify_app/access_scopes/noop_strategy.rb +13 -0
- data/lib/shopify_app/access_scopes/shop_strategy.rb +24 -0
- data/lib/shopify_app/access_scopes/user_strategy.rb +41 -0
- data/lib/shopify_app/configuration.rb +22 -0
- data/lib/shopify_app/middleware/same_site_cookie_middleware.rb +1 -1
- data/lib/shopify_app/omniauth/omniauth_configuration.rb +64 -0
- data/lib/shopify_app/session/in_memory_shop_session_store.rb +9 -7
- data/lib/shopify_app/session/in_memory_user_session_store.rb +9 -7
- data/lib/shopify_app/session/shop_session_storage_with_scopes.rb +58 -0
- data/lib/shopify_app/session/user_session_storage_with_scopes.rb +58 -0
- data/lib/shopify_app/utils.rb +12 -0
- data/lib/shopify_app/version.rb +1 -1
- data/package.json +1 -1
- data/shopify_app.gemspec +2 -2
- data/yarn.lock +16 -16
- metadata +29 -10
- data/.github/ISSUE_TEMPLATE.md +0 -19
- data/docs/install-on-dev-shop.png +0 -0
- data/docs/test-your-app.png +0 -0
- data/lib/generators/shopify_app/install/templates/shopify_provider.rb +0 -20
| @@ -9,6 +9,8 @@ module ShopifyApp | |
| 9 9 | 
             
                attr_accessor :secret
         | 
| 10 10 | 
             
                attr_accessor :old_secret
         | 
| 11 11 | 
             
                attr_accessor :scope
         | 
| 12 | 
            +
                attr_writer :shop_access_scopes
         | 
| 13 | 
            +
                attr_writer :user_access_scopes
         | 
| 12 14 | 
             
                attr_accessor :embedded_app
         | 
| 13 15 | 
             
                alias_method  :embedded_app?, :embedded_app
         | 
| 14 16 | 
             
                attr_accessor :webhooks
         | 
| @@ -16,6 +18,8 @@ module ShopifyApp | |
| 16 18 | 
             
                attr_accessor :after_authenticate_job
         | 
| 17 19 | 
             
                attr_accessor :api_version
         | 
| 18 20 |  | 
| 21 | 
            +
                attr_accessor :reauth_on_access_scope_changes
         | 
| 22 | 
            +
             | 
| 19 23 | 
             
                # customise urls
         | 
| 20 24 | 
             
                attr_accessor :root_url
         | 
| 21 25 | 
             
                attr_writer :login_url
         | 
| @@ -70,6 +74,16 @@ module ShopifyApp | |
| 70 74 | 
             
                  ShopifyApp::SessionRepository.shop_storage
         | 
| 71 75 | 
             
                end
         | 
| 72 76 |  | 
| 77 | 
            +
                def shop_access_scopes_strategy
         | 
| 78 | 
            +
                  return ShopifyApp::AccessScopes::NoopStrategy unless reauth_on_access_scope_changes
         | 
| 79 | 
            +
                  ShopifyApp::AccessScopes::ShopStrategy
         | 
| 80 | 
            +
                end
         | 
| 81 | 
            +
             | 
| 82 | 
            +
                def user_access_scopes_strategy
         | 
| 83 | 
            +
                  return ShopifyApp::AccessScopes::NoopStrategy unless reauth_on_access_scope_changes
         | 
| 84 | 
            +
                  ShopifyApp::AccessScopes::UserStrategy
         | 
| 85 | 
            +
                end
         | 
| 86 | 
            +
             | 
| 73 87 | 
             
                def has_webhooks?
         | 
| 74 88 | 
             
                  webhooks.present?
         | 
| 75 89 | 
             
                end
         | 
| @@ -81,6 +95,14 @@ module ShopifyApp | |
| 81 95 | 
             
                def enable_same_site_none
         | 
| 82 96 | 
             
                  !Rails.env.test? && (@enable_same_site_none.nil? ? embedded_app? : @enable_same_site_none)
         | 
| 83 97 | 
             
                end
         | 
| 98 | 
            +
             | 
| 99 | 
            +
                def shop_access_scopes
         | 
| 100 | 
            +
                  @shop_access_scopes || scope
         | 
| 101 | 
            +
                end
         | 
| 102 | 
            +
             | 
| 103 | 
            +
                def user_access_scopes
         | 
| 104 | 
            +
                  @user_access_scopes || scope
         | 
| 105 | 
            +
                end
         | 
| 84 106 | 
             
              end
         | 
| 85 107 |  | 
| 86 108 | 
             
              def self.configuration
         | 
| @@ -21,7 +21,7 @@ module ShopifyApp | |
| 21 21 | 
             
                      .compact
         | 
| 22 22 | 
             
                      .map do |cookie|
         | 
| 23 23 | 
             
                        cookie << '; Secure' unless cookie =~ /;\s*secure/i
         | 
| 24 | 
            -
                        cookie << '; SameSite=None'  | 
| 24 | 
            +
                        cookie << '; SameSite=None' if ShopifyApp.configuration.embedded_app?
         | 
| 25 25 | 
             
                        cookie
         | 
| 26 26 | 
             
                      end
         | 
| 27 27 |  | 
| @@ -0,0 +1,64 @@ | |
| 1 | 
            +
            # frozen_string_literal: true
         | 
| 2 | 
            +
             | 
| 3 | 
            +
            module ShopifyApp
         | 
| 4 | 
            +
              class OmniAuthConfiguration
         | 
| 5 | 
            +
                attr_reader :strategy, :request
         | 
| 6 | 
            +
                attr_writer :client_options_site, :scopes, :per_user_permissions
         | 
| 7 | 
            +
             | 
| 8 | 
            +
                def initialize(strategy, request)
         | 
| 9 | 
            +
                  @strategy = strategy
         | 
| 10 | 
            +
                  @request = request
         | 
| 11 | 
            +
                end
         | 
| 12 | 
            +
             | 
| 13 | 
            +
                def build_options
         | 
| 14 | 
            +
                  strategy.options[:client_options][:site] = client_options_site
         | 
| 15 | 
            +
                  strategy.options[:scope] = scopes
         | 
| 16 | 
            +
                  strategy.options[:old_client_secret] = ShopifyApp.configuration.old_secret
         | 
| 17 | 
            +
                  strategy.options[:per_user_permissions] = request_online_tokens?
         | 
| 18 | 
            +
                end
         | 
| 19 | 
            +
             | 
| 20 | 
            +
                private
         | 
| 21 | 
            +
             | 
| 22 | 
            +
                def request_online_tokens?
         | 
| 23 | 
            +
                  return @per_user_permissions unless @per_user_permissions.nil?
         | 
| 24 | 
            +
                  default_request_online_tokens?
         | 
| 25 | 
            +
                end
         | 
| 26 | 
            +
             | 
| 27 | 
            +
                def scopes
         | 
| 28 | 
            +
                  @scopes || default_scopes
         | 
| 29 | 
            +
                end
         | 
| 30 | 
            +
             | 
| 31 | 
            +
                def client_options_site
         | 
| 32 | 
            +
                  @client_options_site || default_client_options_site
         | 
| 33 | 
            +
                end
         | 
| 34 | 
            +
             | 
| 35 | 
            +
                def default_scopes
         | 
| 36 | 
            +
                  if request_online_tokens?
         | 
| 37 | 
            +
                    ShopifyApp.configuration.user_access_scopes
         | 
| 38 | 
            +
                  else
         | 
| 39 | 
            +
                    ShopifyApp.configuration.shop_access_scopes
         | 
| 40 | 
            +
                  end
         | 
| 41 | 
            +
                end
         | 
| 42 | 
            +
             | 
| 43 | 
            +
                def default_client_options_site
         | 
| 44 | 
            +
                  return '' unless shop_domain.present?
         | 
| 45 | 
            +
                  "https://#{shopify_auth_params[:shop]}"
         | 
| 46 | 
            +
                end
         | 
| 47 | 
            +
             | 
| 48 | 
            +
                def default_request_online_tokens?
         | 
| 49 | 
            +
                  strategy.session[:user_tokens] && !update_shop_scopes?
         | 
| 50 | 
            +
                end
         | 
| 51 | 
            +
             | 
| 52 | 
            +
                def update_shop_scopes?
         | 
| 53 | 
            +
                  ShopifyApp.configuration.shop_access_scopes_strategy.update_access_scopes?(shop_domain)
         | 
| 54 | 
            +
                end
         | 
| 55 | 
            +
             | 
| 56 | 
            +
                def shop_domain
         | 
| 57 | 
            +
                  request.params['shop'] || (shopify_auth_params && shopify_auth_params['shop'])
         | 
| 58 | 
            +
                end
         | 
| 59 | 
            +
             | 
| 60 | 
            +
                def shopify_auth_params
         | 
| 61 | 
            +
                  strategy.session['shopify.omniauth_params']&.with_indifferent_access
         | 
| 62 | 
            +
                end
         | 
| 63 | 
            +
              end
         | 
| 64 | 
            +
            end
         | 
| @@ -1,14 +1,16 @@ | |
| 1 1 | 
             
            # frozen_string_literal: true
         | 
| 2 2 | 
             
            module ShopifyApp
         | 
| 3 3 | 
             
              class InMemoryShopSessionStore < InMemorySessionStore
         | 
| 4 | 
            -
                 | 
| 5 | 
            -
                   | 
| 6 | 
            -
             | 
| 7 | 
            -
             | 
| 8 | 
            -
             | 
| 4 | 
            +
                class << self
         | 
| 5 | 
            +
                  def store(session, *args)
         | 
| 6 | 
            +
                    id = super
         | 
| 7 | 
            +
                    repo[session.domain] = session
         | 
| 8 | 
            +
                    id
         | 
| 9 | 
            +
                  end
         | 
| 9 10 |  | 
| 10 | 
            -
             | 
| 11 | 
            -
             | 
| 11 | 
            +
                  def retrieve_by_shopify_domain(shopify_domain)
         | 
| 12 | 
            +
                    repo[shopify_domain]
         | 
| 13 | 
            +
                  end
         | 
| 12 14 | 
             
                end
         | 
| 13 15 | 
             
              end
         | 
| 14 16 | 
             
            end
         | 
| @@ -1,14 +1,16 @@ | |
| 1 1 | 
             
            # frozen_string_literal: true
         | 
| 2 2 | 
             
            module ShopifyApp
         | 
| 3 3 | 
             
              class InMemoryUserSessionStore < InMemorySessionStore
         | 
| 4 | 
            -
                 | 
| 5 | 
            -
                   | 
| 6 | 
            -
             | 
| 7 | 
            -
             | 
| 8 | 
            -
             | 
| 4 | 
            +
                class << self
         | 
| 5 | 
            +
                  def store(session, user)
         | 
| 6 | 
            +
                    id = super
         | 
| 7 | 
            +
                    repo[user.shopify_user_id] = session
         | 
| 8 | 
            +
                    id
         | 
| 9 | 
            +
                  end
         | 
| 9 10 |  | 
| 10 | 
            -
             | 
| 11 | 
            -
             | 
| 11 | 
            +
                  def retrieve_by_shopify_user_id(user_id)
         | 
| 12 | 
            +
                    repo[user_id]
         | 
| 13 | 
            +
                  end
         | 
| 12 14 | 
             
                end
         | 
| 13 15 | 
             
              end
         | 
| 14 16 | 
             
            end
         | 
| @@ -0,0 +1,58 @@ | |
| 1 | 
            +
            # frozen_string_literal: true
         | 
| 2 | 
            +
             | 
| 3 | 
            +
            module ShopifyApp
         | 
| 4 | 
            +
              module ShopSessionStorageWithScopes
         | 
| 5 | 
            +
                extend ActiveSupport::Concern
         | 
| 6 | 
            +
                include ::ShopifyApp::SessionStorage
         | 
| 7 | 
            +
             | 
| 8 | 
            +
                included do
         | 
| 9 | 
            +
                  validates :shopify_domain, presence: true, uniqueness: { case_sensitive: false }
         | 
| 10 | 
            +
                end
         | 
| 11 | 
            +
             | 
| 12 | 
            +
                class_methods do
         | 
| 13 | 
            +
                  def store(auth_session, *_args)
         | 
| 14 | 
            +
                    shop = find_or_initialize_by(shopify_domain: auth_session.domain)
         | 
| 15 | 
            +
                    shop.shopify_token = auth_session.token
         | 
| 16 | 
            +
                    shop.access_scopes = auth_session.access_scopes
         | 
| 17 | 
            +
             | 
| 18 | 
            +
                    shop.save!
         | 
| 19 | 
            +
                    shop.id
         | 
| 20 | 
            +
                  end
         | 
| 21 | 
            +
             | 
| 22 | 
            +
                  def retrieve(id)
         | 
| 23 | 
            +
                    shop = find_by(id: id)
         | 
| 24 | 
            +
                    construct_session(shop)
         | 
| 25 | 
            +
                  end
         | 
| 26 | 
            +
             | 
| 27 | 
            +
                  def retrieve_by_shopify_domain(domain)
         | 
| 28 | 
            +
                    shop = find_by(shopify_domain: domain)
         | 
| 29 | 
            +
                    construct_session(shop)
         | 
| 30 | 
            +
                  end
         | 
| 31 | 
            +
             | 
| 32 | 
            +
                  private
         | 
| 33 | 
            +
             | 
| 34 | 
            +
                  def construct_session(shop)
         | 
| 35 | 
            +
                    return unless shop
         | 
| 36 | 
            +
             | 
| 37 | 
            +
                    ShopifyAPI::Session.new(
         | 
| 38 | 
            +
                      domain: shop.shopify_domain,
         | 
| 39 | 
            +
                      token: shop.shopify_token,
         | 
| 40 | 
            +
                      api_version: shop.api_version,
         | 
| 41 | 
            +
                      access_scopes: shop.access_scopes
         | 
| 42 | 
            +
                    )
         | 
| 43 | 
            +
                  end
         | 
| 44 | 
            +
                end
         | 
| 45 | 
            +
             | 
| 46 | 
            +
                def access_scopes=(scopes)
         | 
| 47 | 
            +
                  super(scopes)
         | 
| 48 | 
            +
                rescue NotImplementedError, NoMethodError
         | 
| 49 | 
            +
                  raise NotImplementedError, "#access_scopes= must be defined to handle storing access scopes: #{scopes}"
         | 
| 50 | 
            +
                end
         | 
| 51 | 
            +
             | 
| 52 | 
            +
                def access_scopes
         | 
| 53 | 
            +
                  super
         | 
| 54 | 
            +
                rescue NotImplementedError, NoMethodError
         | 
| 55 | 
            +
                  raise NotImplementedError, "#access_scopes= must be defined to hook into stored access scopes"
         | 
| 56 | 
            +
                end
         | 
| 57 | 
            +
              end
         | 
| 58 | 
            +
            end
         | 
| @@ -0,0 +1,58 @@ | |
| 1 | 
            +
            # frozen_string_literal: true
         | 
| 2 | 
            +
            module ShopifyApp
         | 
| 3 | 
            +
              module UserSessionStorageWithScopes
         | 
| 4 | 
            +
                extend ActiveSupport::Concern
         | 
| 5 | 
            +
                include ::ShopifyApp::SessionStorage
         | 
| 6 | 
            +
             | 
| 7 | 
            +
                included do
         | 
| 8 | 
            +
                  validates :shopify_domain, presence: true
         | 
| 9 | 
            +
                end
         | 
| 10 | 
            +
             | 
| 11 | 
            +
                class_methods do
         | 
| 12 | 
            +
                  def store(auth_session, user)
         | 
| 13 | 
            +
                    user = find_or_initialize_by(shopify_user_id: user[:id])
         | 
| 14 | 
            +
                    user.shopify_token = auth_session.token
         | 
| 15 | 
            +
                    user.shopify_domain = auth_session.domain
         | 
| 16 | 
            +
                    user.access_scopes = auth_session.access_scopes
         | 
| 17 | 
            +
             | 
| 18 | 
            +
                    user.save!
         | 
| 19 | 
            +
                    user.id
         | 
| 20 | 
            +
                  end
         | 
| 21 | 
            +
             | 
| 22 | 
            +
                  def retrieve(id)
         | 
| 23 | 
            +
                    user = find_by(id: id)
         | 
| 24 | 
            +
                    construct_session(user)
         | 
| 25 | 
            +
                  end
         | 
| 26 | 
            +
             | 
| 27 | 
            +
                  def retrieve_by_shopify_user_id(user_id)
         | 
| 28 | 
            +
                    user = find_by(shopify_user_id: user_id)
         | 
| 29 | 
            +
                    construct_session(user)
         | 
| 30 | 
            +
                  end
         | 
| 31 | 
            +
             | 
| 32 | 
            +
                  private
         | 
| 33 | 
            +
             | 
| 34 | 
            +
                  def construct_session(user)
         | 
| 35 | 
            +
                    return unless user
         | 
| 36 | 
            +
             | 
| 37 | 
            +
                    ShopifyAPI::Session.new(
         | 
| 38 | 
            +
                      domain: user.shopify_domain,
         | 
| 39 | 
            +
                      token: user.shopify_token,
         | 
| 40 | 
            +
                      api_version: user.api_version,
         | 
| 41 | 
            +
                      access_scopes: user.access_scopes
         | 
| 42 | 
            +
                    )
         | 
| 43 | 
            +
                  end
         | 
| 44 | 
            +
                end
         | 
| 45 | 
            +
             | 
| 46 | 
            +
                def access_scopes=(scopes)
         | 
| 47 | 
            +
                  super(scopes)
         | 
| 48 | 
            +
                rescue NotImplementedError, NoMethodError
         | 
| 49 | 
            +
                  raise NotImplementedError, "#access_scopes= must be defined to handle storing access scopes: #{scopes}"
         | 
| 50 | 
            +
                end
         | 
| 51 | 
            +
             | 
| 52 | 
            +
                def access_scopes
         | 
| 53 | 
            +
                  super
         | 
| 54 | 
            +
                rescue NotImplementedError, NoMethodError
         | 
| 55 | 
            +
                  raise NotImplementedError, "#access_scopes= must be defined to hook into stored access scopes"
         | 
| 56 | 
            +
                end
         | 
| 57 | 
            +
              end
         | 
| 58 | 
            +
            end
         | 
    
        data/lib/shopify_app/utils.rb
    CHANGED
    
    | @@ -20,5 +20,17 @@ module ShopifyApp | |
| 20 20 | 
             
                rescue ActiveResource::ConnectionError
         | 
| 21 21 | 
             
                  logger.error("[ShopifyAPI::ApiVersion] Unable to fetch api_versions from Shopify")
         | 
| 22 22 | 
             
                end
         | 
| 23 | 
            +
             | 
| 24 | 
            +
                def self.shop_login_url(shop:, return_to:)
         | 
| 25 | 
            +
                  return ShopifyApp.configuration.login_url unless shop
         | 
| 26 | 
            +
                  url = URI(ShopifyApp.configuration.login_url)
         | 
| 27 | 
            +
             | 
| 28 | 
            +
                  url.query = URI.encode_www_form(
         | 
| 29 | 
            +
                    shop: shop,
         | 
| 30 | 
            +
                    return_to: return_to,
         | 
| 31 | 
            +
                  )
         | 
| 32 | 
            +
             | 
| 33 | 
            +
                  url.to_s
         | 
| 34 | 
            +
                end
         | 
| 23 35 | 
             
              end
         | 
| 24 36 | 
             
            end
         | 
    
        data/lib/shopify_app/version.rb
    CHANGED
    
    
    
        data/package.json
    CHANGED
    
    
    
        data/shopify_app.gemspec
    CHANGED
    
    | @@ -14,8 +14,8 @@ Gem::Specification.new do |s| | |
| 14 14 | 
             
              s.metadata['allowed_push_host'] = 'https://rubygems.org'
         | 
| 15 15 |  | 
| 16 16 | 
             
              s.add_runtime_dependency('browser_sniffer', '~> 1.2.2')
         | 
| 17 | 
            -
              s.add_runtime_dependency('rails', '> 5.2.1', '< 6. | 
| 18 | 
            -
              s.add_runtime_dependency('shopify_api', '~> 9. | 
| 17 | 
            +
              s.add_runtime_dependency('rails', '> 5.2.1', '< 6.2')
         | 
| 18 | 
            +
              s.add_runtime_dependency('shopify_api', '~> 9.4')
         | 
| 19 19 | 
             
              s.add_runtime_dependency('omniauth-shopify-oauth2', '~> 2.2.2')
         | 
| 20 20 | 
             
              s.add_runtime_dependency('jwt', '~> 2.2.1')
         | 
| 21 21 | 
             
              s.add_runtime_dependency('redirect_safely', '~> 1.0')
         | 
    
        data/yarn.lock
    CHANGED
    
    | @@ -1474,10 +1474,10 @@ bluebird@^3.5.5: | |
| 1474 1474 | 
             
              resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-3.7.2.tgz#9f229c15be272454ffa973ace0dbee79a1b0c36f"
         | 
| 1475 1475 | 
             
              integrity sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==
         | 
| 1476 1476 |  | 
| 1477 | 
            -
            bn.js@^4.0.0, bn.js@^4.1.0, bn.js@^4. | 
| 1478 | 
            -
              version "4. | 
| 1479 | 
            -
              resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-4. | 
| 1480 | 
            -
              integrity sha512- | 
| 1477 | 
            +
            bn.js@^4.0.0, bn.js@^4.1.0, bn.js@^4.11.9:
         | 
| 1478 | 
            +
              version "4.12.0"
         | 
| 1479 | 
            +
              resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-4.12.0.tgz#775b3f278efbb9718eec7361f483fb36fbbfea88"
         | 
| 1480 | 
            +
              integrity sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==
         | 
| 1481 1481 |  | 
| 1482 1482 | 
             
            bn.js@^5.1.1:
         | 
| 1483 1483 | 
             
              version "5.1.3"
         | 
| @@ -1531,7 +1531,7 @@ braces@^3.0.2, braces@~3.0.2: | |
| 1531 1531 | 
             
              dependencies:
         | 
| 1532 1532 | 
             
                fill-range "^7.0.1"
         | 
| 1533 1533 |  | 
| 1534 | 
            -
            brorand@^1.0.1:
         | 
| 1534 | 
            +
            brorand@^1.0.1, brorand@^1.1.0:
         | 
| 1535 1535 | 
             
              version "1.1.0"
         | 
| 1536 1536 | 
             
              resolved "https://registry.yarnpkg.com/brorand/-/brorand-1.1.0.tgz#12c25efe40a45e3c323eb8675a0a0ce57b22371f"
         | 
| 1537 1537 | 
             
              integrity sha1-EsJe/kCkXjwyPrhnWgoM5XsiNx8=
         | 
| @@ -2180,17 +2180,17 @@ electron-to-chromium@^1.3.562: | |
| 2180 2180 | 
             
              integrity sha512-fNaYN3EtKQWLQsrKXui8mzcryJXuA0LbCLoizeX6oayG2emBaS5MauKjCPAvc29NEY4FpLHIUWiP+Y0Bfrs5dg==
         | 
| 2181 2181 |  | 
| 2182 2182 | 
             
            elliptic@^6.5.3:
         | 
| 2183 | 
            -
              version "6.5. | 
| 2184 | 
            -
              resolved "https://registry.yarnpkg.com/elliptic/-/elliptic-6.5. | 
| 2185 | 
            -
              integrity sha512- | 
| 2183 | 
            +
              version "6.5.4"
         | 
| 2184 | 
            +
              resolved "https://registry.yarnpkg.com/elliptic/-/elliptic-6.5.4.tgz#da37cebd31e79a1367e941b592ed1fbebd58abbb"
         | 
| 2185 | 
            +
              integrity sha512-iLhC6ULemrljPZb+QutR5TQGB+pdW6KGD5RSegS+8sorOZT+rdQFbsQFJgvN3eRqNALqJer4oQ16YvJHlU8hzQ==
         | 
| 2186 2186 | 
             
              dependencies:
         | 
| 2187 | 
            -
                bn.js "^4. | 
| 2188 | 
            -
                brorand "^1.0 | 
| 2187 | 
            +
                bn.js "^4.11.9"
         | 
| 2188 | 
            +
                brorand "^1.1.0"
         | 
| 2189 2189 | 
             
                hash.js "^1.0.0"
         | 
| 2190 | 
            -
                hmac-drbg "^1.0. | 
| 2191 | 
            -
                inherits "^2.0. | 
| 2192 | 
            -
                minimalistic-assert "^1.0. | 
| 2193 | 
            -
                minimalistic-crypto-utils "^1.0. | 
| 2190 | 
            +
                hmac-drbg "^1.0.1"
         | 
| 2191 | 
            +
                inherits "^2.0.4"
         | 
| 2192 | 
            +
                minimalistic-assert "^1.0.1"
         | 
| 2193 | 
            +
                minimalistic-crypto-utils "^1.0.1"
         | 
| 2194 2194 |  | 
| 2195 2195 | 
             
            emoji-regex@^7.0.1:
         | 
| 2196 2196 | 
             
              version "7.0.3"
         | 
| @@ -2782,7 +2782,7 @@ he@1.2.0: | |
| 2782 2782 | 
             
              resolved "https://registry.yarnpkg.com/he/-/he-1.2.0.tgz#84ae65fa7eafb165fddb61566ae14baf05664f0f"
         | 
| 2783 2783 | 
             
              integrity sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==
         | 
| 2784 2784 |  | 
| 2785 | 
            -
            hmac-drbg@^1.0. | 
| 2785 | 
            +
            hmac-drbg@^1.0.1:
         | 
| 2786 2786 | 
             
              version "1.0.1"
         | 
| 2787 2787 | 
             
              resolved "https://registry.yarnpkg.com/hmac-drbg/-/hmac-drbg-1.0.1.tgz#d2745701025a6c775a6c545793ed502fc0c649a1"
         | 
| 2788 2788 | 
             
              integrity sha1-0nRXAQJabHdabFRXk+1QL8DGSaE=
         | 
| @@ -3492,7 +3492,7 @@ minimalistic-assert@^1.0.0, minimalistic-assert@^1.0.1: | |
| 3492 3492 | 
             
              resolved "https://registry.yarnpkg.com/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz#2e194de044626d4a10e7f7fbc00ce73e83e4d5c7"
         | 
| 3493 3493 | 
             
              integrity sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==
         | 
| 3494 3494 |  | 
| 3495 | 
            -
            minimalistic-crypto-utils@^1.0. | 
| 3495 | 
            +
            minimalistic-crypto-utils@^1.0.1:
         | 
| 3496 3496 | 
             
              version "1.0.1"
         | 
| 3497 3497 | 
             
              resolved "https://registry.yarnpkg.com/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz#f6c00c1c0b082246e5c4d99dfb8c7c083b2b582a"
         | 
| 3498 3498 | 
             
              integrity sha1-9sAMHAsIIkblxNmd+4x8CDsrWCo=
         | 
    
        metadata
    CHANGED
    
    | @@ -1,14 +1,14 @@ | |
| 1 1 | 
             
            --- !ruby/object:Gem::Specification
         | 
| 2 2 | 
             
            name: shopify_app
         | 
| 3 3 | 
             
            version: !ruby/object:Gem::Version
         | 
| 4 | 
            -
              version: 17. | 
| 4 | 
            +
              version: 17.2.1
         | 
| 5 5 | 
             
            platform: ruby
         | 
| 6 6 | 
             
            authors:
         | 
| 7 7 | 
             
            - Shopify
         | 
| 8 8 | 
             
            autorequire: 
         | 
| 9 9 | 
             
            bindir: bin
         | 
| 10 10 | 
             
            cert_chain: []
         | 
| 11 | 
            -
            date: 2021-01 | 
| 11 | 
            +
            date: 2021-04-01 00:00:00.000000000 Z
         | 
| 12 12 | 
             
            dependencies:
         | 
| 13 13 | 
             
            - !ruby/object:Gem::Dependency
         | 
| 14 14 | 
             
              name: browser_sniffer
         | 
| @@ -33,7 +33,7 @@ dependencies: | |
| 33 33 | 
             
                    version: 5.2.1
         | 
| 34 34 | 
             
                - - "<"
         | 
| 35 35 | 
             
                  - !ruby/object:Gem::Version
         | 
| 36 | 
            -
                    version: '6. | 
| 36 | 
            +
                    version: '6.2'
         | 
| 37 37 | 
             
              type: :runtime
         | 
| 38 38 | 
             
              prerelease: false
         | 
| 39 39 | 
             
              version_requirements: !ruby/object:Gem::Requirement
         | 
| @@ -43,21 +43,21 @@ dependencies: | |
| 43 43 | 
             
                    version: 5.2.1
         | 
| 44 44 | 
             
                - - "<"
         | 
| 45 45 | 
             
                  - !ruby/object:Gem::Version
         | 
| 46 | 
            -
                    version: '6. | 
| 46 | 
            +
                    version: '6.2'
         | 
| 47 47 | 
             
            - !ruby/object:Gem::Dependency
         | 
| 48 48 | 
             
              name: shopify_api
         | 
| 49 49 | 
             
              requirement: !ruby/object:Gem::Requirement
         | 
| 50 50 | 
             
                requirements:
         | 
| 51 51 | 
             
                - - "~>"
         | 
| 52 52 | 
             
                  - !ruby/object:Gem::Version
         | 
| 53 | 
            -
                    version: '9. | 
| 53 | 
            +
                    version: '9.4'
         | 
| 54 54 | 
             
              type: :runtime
         | 
| 55 55 | 
             
              prerelease: false
         | 
| 56 56 | 
             
              version_requirements: !ruby/object:Gem::Requirement
         | 
| 57 57 | 
             
                requirements:
         | 
| 58 58 | 
             
                - - "~>"
         | 
| 59 59 | 
             
                  - !ruby/object:Gem::Version
         | 
| 60 | 
            -
                    version: '9. | 
| 60 | 
            +
                    version: '9.4'
         | 
| 61 61 | 
             
            - !ruby/object:Gem::Dependency
         | 
| 62 62 | 
             
              name: omniauth-shopify-oauth2
         | 
| 63 63 | 
             
              requirement: !ruby/object:Gem::Requirement
         | 
| @@ -248,7 +248,9 @@ extra_rdoc_files: [] | |
| 248 248 | 
             
            files:
         | 
| 249 249 | 
             
            - ".babelrc"
         | 
| 250 250 | 
             
            - ".github/CODEOWNERS"
         | 
| 251 | 
            -
            - ".github/ISSUE_TEMPLATE.md"
         | 
| 251 | 
            +
            - ".github/ISSUE_TEMPLATE/bug-report.md"
         | 
| 252 | 
            +
            - ".github/ISSUE_TEMPLATE/config.yml"
         | 
| 253 | 
            +
            - ".github/ISSUE_TEMPLATE/feature-request.md"
         | 
| 252 254 | 
             
            - ".github/PULL_REQUEST_TEMPLATE.md"
         | 
| 253 255 | 
             
            - ".github/probots.yml"
         | 
| 254 256 | 
             
            - ".github/workflows/build.yml"
         | 
| @@ -259,6 +261,7 @@ files: | |
| 259 261 | 
             
            - ".rubocop.yml"
         | 
| 260 262 | 
             
            - ".ruby-version"
         | 
| 261 263 | 
             
            - CHANGELOG.md
         | 
| 264 | 
            +
            - CONTRIBUTING.md
         | 
| 262 265 | 
             
            - Gemfile
         | 
| 263 266 | 
             
            - Gemfile.lock
         | 
| 264 267 | 
             
            - LICENSE
         | 
| @@ -278,6 +281,7 @@ files: | |
| 278 281 | 
             
            - app/controllers/concerns/shopify_app/authenticated.rb
         | 
| 279 282 | 
             
            - app/controllers/concerns/shopify_app/ensure_authenticated_links.rb
         | 
| 280 283 | 
             
            - app/controllers/concerns/shopify_app/require_known_shop.rb
         | 
| 284 | 
            +
            - app/controllers/concerns/shopify_app/shop_access_scopes_verification.rb
         | 
| 281 285 | 
             
            - app/controllers/shopify_app/authenticated_controller.rb
         | 
| 282 286 | 
             
            - app/controllers/shopify_app/callback_controller.rb
         | 
| 283 287 | 
             
            - app/controllers/shopify_app/extension_verification_controller.rb
         | 
| @@ -321,8 +325,15 @@ files: | |
| 321 325 | 
             
            - docs/Quickstart.md
         | 
| 322 326 | 
             
            - docs/Releasing.md
         | 
| 323 327 | 
             
            - docs/Troubleshooting.md
         | 
| 324 | 
            -
            - docs/ | 
| 325 | 
            -
            - docs/ | 
| 328 | 
            +
            - docs/Upgrading.md
         | 
| 329 | 
            +
            - docs/shopify_app/authentication.md
         | 
| 330 | 
            +
            - docs/shopify_app/engine.md
         | 
| 331 | 
            +
            - docs/shopify_app/generators.md
         | 
| 332 | 
            +
            - docs/shopify_app/handling-access-scopes-changes.md
         | 
| 333 | 
            +
            - docs/shopify_app/script-tags.md
         | 
| 334 | 
            +
            - docs/shopify_app/session-repository.md
         | 
| 335 | 
            +
            - docs/shopify_app/testing.md
         | 
| 336 | 
            +
            - docs/shopify_app/webhooks.md
         | 
| 326 337 | 
             
            - images/app-proxy-screenshot.png
         | 
| 327 338 | 
             
            - karma.conf.js
         | 
| 328 339 | 
             
            - lib/generators/shopify_app/add_after_authenticate_job/add_after_authenticate_job_generator.rb
         | 
| @@ -351,7 +362,7 @@ files: | |
| 351 362 | 
             
            - lib/generators/shopify_app/install/templates/shopify_app.js
         | 
| 352 363 | 
             
            - lib/generators/shopify_app/install/templates/shopify_app.rb.tt
         | 
| 353 364 | 
             
            - lib/generators/shopify_app/install/templates/shopify_app_index.js
         | 
| 354 | 
            -
            - lib/generators/shopify_app/install/templates/shopify_provider.rb
         | 
| 365 | 
            +
            - lib/generators/shopify_app/install/templates/shopify_provider.rb.tt
         | 
| 355 366 | 
             
            - lib/generators/shopify_app/install/templates/user_agent.rb
         | 
| 356 367 | 
             
            - lib/generators/shopify_app/products_controller/products_controller_generator.rb
         | 
| 357 368 | 
             
            - lib/generators/shopify_app/products_controller/templates/products_controller.rb
         | 
| @@ -361,16 +372,21 @@ files: | |
| 361 372 | 
             
            - lib/generators/shopify_app/routes/routes_generator.rb
         | 
| 362 373 | 
             
            - lib/generators/shopify_app/routes/templates/routes.rb
         | 
| 363 374 | 
             
            - lib/generators/shopify_app/shop_model/shop_model_generator.rb
         | 
| 375 | 
            +
            - lib/generators/shopify_app/shop_model/templates/db/migrate/add_shop_access_scopes_column.erb
         | 
| 364 376 | 
             
            - lib/generators/shopify_app/shop_model/templates/db/migrate/create_shops.erb
         | 
| 365 377 | 
             
            - lib/generators/shopify_app/shop_model/templates/shop.rb
         | 
| 366 378 | 
             
            - lib/generators/shopify_app/shop_model/templates/shops.yml
         | 
| 367 379 | 
             
            - lib/generators/shopify_app/shopify_app_generator.rb
         | 
| 380 | 
            +
            - lib/generators/shopify_app/user_model/templates/db/migrate/add_user_access_scopes_column.erb
         | 
| 368 381 | 
             
            - lib/generators/shopify_app/user_model/templates/db/migrate/create_users.erb
         | 
| 369 382 | 
             
            - lib/generators/shopify_app/user_model/templates/user.rb
         | 
| 370 383 | 
             
            - lib/generators/shopify_app/user_model/templates/users.yml
         | 
| 371 384 | 
             
            - lib/generators/shopify_app/user_model/user_model_generator.rb
         | 
| 372 385 | 
             
            - lib/generators/shopify_app/views/views_generator.rb
         | 
| 373 386 | 
             
            - lib/shopify_app.rb
         | 
| 387 | 
            +
            - lib/shopify_app/access_scopes/noop_strategy.rb
         | 
| 388 | 
            +
            - lib/shopify_app/access_scopes/shop_strategy.rb
         | 
| 389 | 
            +
            - lib/shopify_app/access_scopes/user_strategy.rb
         | 
| 374 390 | 
             
            - lib/shopify_app/configuration.rb
         | 
| 375 391 | 
             
            - lib/shopify_app/controller_concerns/app_proxy_verification.rb
         | 
| 376 392 | 
             
            - lib/shopify_app/controller_concerns/csrf_protection.rb
         | 
| @@ -387,6 +403,7 @@ files: | |
| 387 403 | 
             
            - lib/shopify_app/managers/webhooks_manager.rb
         | 
| 388 404 | 
             
            - lib/shopify_app/middleware/jwt_middleware.rb
         | 
| 389 405 | 
             
            - lib/shopify_app/middleware/same_site_cookie_middleware.rb
         | 
| 406 | 
            +
            - lib/shopify_app/omniauth/omniauth_configuration.rb
         | 
| 390 407 | 
             
            - lib/shopify_app/session/in_memory_session_store.rb
         | 
| 391 408 | 
             
            - lib/shopify_app/session/in_memory_shop_session_store.rb
         | 
| 392 409 | 
             
            - lib/shopify_app/session/in_memory_user_session_store.rb
         | 
| @@ -395,7 +412,9 @@ files: | |
| 395 412 | 
             
            - lib/shopify_app/session/session_repository.rb
         | 
| 396 413 | 
             
            - lib/shopify_app/session/session_storage.rb
         | 
| 397 414 | 
             
            - lib/shopify_app/session/shop_session_storage.rb
         | 
| 415 | 
            +
            - lib/shopify_app/session/shop_session_storage_with_scopes.rb
         | 
| 398 416 | 
             
            - lib/shopify_app/session/user_session_storage.rb
         | 
| 417 | 
            +
            - lib/shopify_app/session/user_session_storage_with_scopes.rb
         | 
| 399 418 | 
             
            - lib/shopify_app/test_helpers/all.rb
         | 
| 400 419 | 
             
            - lib/shopify_app/test_helpers/webhook_verification_helper.rb
         | 
| 401 420 | 
             
            - lib/shopify_app/utils.rb
         |