OmniAuth Shopify

Shopify OAuth2 Strategy for OmniAuth 1.0.

Installing

Add to your Gemfile:

gem 'omniauth-shopify-app'

Then bundle install.

Usage

OmniAuth::Strategies::Shopify is simply a Rack middleware. Read the OmniAuth 1.0 docs for detailed instructions.

Here's a quick example, adding the middleware to a Rails app in config/initializers/omniauth.rb:

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

Authenticate the user by having them visit /auth/shopify with a shop query parameter of their shop's myshopify.com domain. For example, the following form could be used

<form action="/auth/shopify" method="get">
  <label for="shop">Enter your store's URL:</label>
  <input type="text" name="shop" placeholder="your-shop-url.myshopify.com">
  <button type="submit">Log In</button>
</form>

Or without form /auth/shopify?shop=your-shop-url.myshopify.com Alternatively you can put shop parameter to session as Shopify App do

session['shopify.omniauth_params'] = { shop: params[:shop] }

And finally it's possible to use your own query parameter by overriding default setup method. For example, like below:

Rails.application.config.middleware.use OmniAuth::Builder do
  provider :shopify,
    ENV['SHOPIFY_API_KEY'],
    ENV['SHOPIFY_SHARED_SECRET'],
    option :setup, proc { |env|
      strategy = env['omniauth.strategy']



      site = if strategy.request.params['site']
        "https://#{strategy.request.params['site']}"
      else
        ''
      end

      env['omniauth.strategy'].options[:client_options][:site] = site
    }

Configuring

Scope

You can configure the scope, which you pass in to the provider method via a Hash:

  • scope: A comma-separated list of permissions you want to request from the user. See the Shopify API docs for a full list of available permissions.

For example, to request read_products, read_orders and write_content permissions and display the authentication page:

Rails.application.config.middleware.use OmniAuth::Builder do
  provider :shopify, ENV['SHOPIFY_API_KEY'], ENV['SHOPIFY_SHARED_SECRET'], :scope => 'read_products,read_orders,write_content'
end

Online Access

Shopify offers two different types of access tokens: online access and offline access. You can configure for online-access by passing the per_user_permissions option:

Rails.application.config.middleware.use OmniAuth::Builder do
  provider :shopify, ENV['SHOPIFY_API_KEY'],
                     ENV['SHOPIFY_SHARED_SECRET'],
                     :scope => 'read_orders',
                     :per_user_permissions => true
end

Authentication Hash

Here's an example Authentication Hash available in request.env['omniauth.auth']:

{
  :provider => 'shopify',
  :uid => 'example.myshopify.com',
  :credentials => {
    :token => 'afasd923kjh0934kf', # OAuth 2.0 access_token, which you store and use to authenticate API requests
  }
}