shopify_app 17.1.0 → 18.0.1

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: db6d499169653da5b11b813fe35e2ecf11312403cfa418c755e43c6b2dea3667
4
- data.tar.gz: 39d42cd9bba1bc353a5959376758fc52a71cfb3005c25dd9defb9d0816210244
3
+ metadata.gz: 05a2dce084fe578139757483538102b6f57d1fc4ec6935ae8ce4d11df7a914cf
4
+ data.tar.gz: 789a109b204a143850cc0c7d3fe14c6d4519b94d89671d46ddb09101283ceb7a
5
5
  SHA512:
6
- metadata.gz: 013f7337c0018134bd389a4c968118d8f26a4df9dca4d22a2dfe8de7d514f6914c5c11bd9e7446e3ab15d7c81c744967621f03c9fd354c43843706e77db79d21
7
- data.tar.gz: 3cc55404a0dd1e4dc0d3dadf1226c1755d887f13698dd87d118589a8c325b657d85de719a8a49ec3e6dcf33e7191968f7b04b8caaf5f722ee9ad36c1513937cb
6
+ metadata.gz: 2cee778a503dc5652623f9b2d6e82b9844dff44840d77b57e8ecc4051bb7b3dd1707ba35cc2df93f348006da29251290b82c32988499f0e864d65d0d868bf00e
7
+ data.tar.gz: 6ff6e53fb49335ee6e151ce8d21d2b7bd66b8f9267b9ed03ef589282bc9db2e5e9a3c17e4d2dfcec6fca5cc7fe59676d28dc4762254b6dfab356f2bcc9c47ec4
data/.github/CODEOWNERS CHANGED
@@ -1 +1,2 @@
1
1
  * @shopify/platform-dev-tools-education
2
+ * @shopify/app-foundations
@@ -1,7 +1,10 @@
1
1
  name: CI
2
2
 
3
- on:
3
+ on:
4
4
  push:
5
+ branches: [ master ]
6
+ pull_request:
7
+ branches: [ master ]
5
8
 
6
9
  jobs:
7
10
  build:
data/CHANGELOG.md CHANGED
@@ -1,5 +1,27 @@
1
- Unreleased
1
+ 18.0.1 (May 7, 2021)
2
2
  ----------
3
+ * Fix bug causing OAuth flow to fail due to CSP violation. [#1265](https://github.com/Shopify/shopify_app/pull/1265)
4
+
5
+ 18.0.0 (May 3, 2021)
6
+ ----------
7
+ * Support OmniAuth 2.x
8
+ * If your app has custom OmniAuth configuration, please refer to the [OmniAuth 2.0 upgrade guide](https://github.com/omniauth/omniauth/wiki/Upgrading-to-2.0).
9
+ * Support App Bridge version 2.x in the Embedded App layout. [#1241](https://github.com/Shopify/shopify_app/pull/1241)
10
+
11
+ 17.2.1 (April 1, 2021)
12
+ ----------
13
+ * Bug fix: Lock the CDN App Bridge version to `v1.X.Y` in the Embedded App layout [#1238](https://github.com/Shopify/shopify_app/pull/1238)
14
+ * App Bridge `v2.0` is a non-backwards compatible release
15
+ * A future major shopify_app gem release will support only App Bridge `v2.0`
16
+
17
+ 17.2.0 (April 1, 2021)
18
+ ----------
19
+ * Support Rails `v6.1` [#1221](https://github.com/Shopify/shopify_app/pull/1221)
20
+ * Check out [Upgrading to `v17.2.0`](/docs/Upgrading.md#upgrading-to-v1720) in the Upgrading.md guide for the changes needed to support Rails `v6.1`
21
+
22
+ 17.1.1 (March 12, 2021)
23
+ ----------
24
+ * Fix issues with mocking OmniAuth callback controller tests [#1210](https://github.com/Shopify/shopify_app/pull/1210)
3
25
 
4
26
  17.1.0 (March 5, 2021)
5
27
  ----------
data/Gemfile.lock CHANGED
@@ -1,80 +1,85 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- shopify_app (17.1.0)
4
+ shopify_app (18.0.1)
5
5
  browser_sniffer (~> 1.2.2)
6
- jwt (~> 2.2.1)
7
- omniauth-shopify-oauth2 (~> 2.2.2)
8
- rails (> 5.2.1, < 6.1)
6
+ jwt (>= 2.2.3)
7
+ omniauth-rails_csrf_protection
8
+ omniauth-shopify-oauth2 (~> 2.3)
9
+ rails (> 5.2.1, < 6.2)
9
10
  redirect_safely (~> 1.0)
10
11
  shopify_api (~> 9.4)
11
12
 
12
13
  GEM
13
14
  remote: https://rubygems.org/
14
15
  specs:
15
- actioncable (6.0.3.5)
16
- actionpack (= 6.0.3.5)
16
+ actioncable (6.1.3.1)
17
+ actionpack (= 6.1.3.1)
18
+ activesupport (= 6.1.3.1)
17
19
  nio4r (~> 2.0)
18
20
  websocket-driver (>= 0.6.1)
19
- actionmailbox (6.0.3.5)
20
- actionpack (= 6.0.3.5)
21
- activejob (= 6.0.3.5)
22
- activerecord (= 6.0.3.5)
23
- activestorage (= 6.0.3.5)
24
- activesupport (= 6.0.3.5)
21
+ actionmailbox (6.1.3.1)
22
+ actionpack (= 6.1.3.1)
23
+ activejob (= 6.1.3.1)
24
+ activerecord (= 6.1.3.1)
25
+ activestorage (= 6.1.3.1)
26
+ activesupport (= 6.1.3.1)
25
27
  mail (>= 2.7.1)
26
- actionmailer (6.0.3.5)
27
- actionpack (= 6.0.3.5)
28
- actionview (= 6.0.3.5)
29
- activejob (= 6.0.3.5)
28
+ actionmailer (6.1.3.1)
29
+ actionpack (= 6.1.3.1)
30
+ actionview (= 6.1.3.1)
31
+ activejob (= 6.1.3.1)
32
+ activesupport (= 6.1.3.1)
30
33
  mail (~> 2.5, >= 2.5.4)
31
34
  rails-dom-testing (~> 2.0)
32
- actionpack (6.0.3.5)
33
- actionview (= 6.0.3.5)
34
- activesupport (= 6.0.3.5)
35
- rack (~> 2.0, >= 2.0.8)
35
+ actionpack (6.1.3.1)
36
+ actionview (= 6.1.3.1)
37
+ activesupport (= 6.1.3.1)
38
+ rack (~> 2.0, >= 2.0.9)
36
39
  rack-test (>= 0.6.3)
37
40
  rails-dom-testing (~> 2.0)
38
41
  rails-html-sanitizer (~> 1.0, >= 1.2.0)
39
- actiontext (6.0.3.5)
40
- actionpack (= 6.0.3.5)
41
- activerecord (= 6.0.3.5)
42
- activestorage (= 6.0.3.5)
43
- activesupport (= 6.0.3.5)
42
+ actiontext (6.1.3.1)
43
+ actionpack (= 6.1.3.1)
44
+ activerecord (= 6.1.3.1)
45
+ activestorage (= 6.1.3.1)
46
+ activesupport (= 6.1.3.1)
44
47
  nokogiri (>= 1.8.5)
45
- actionview (6.0.3.5)
46
- activesupport (= 6.0.3.5)
48
+ actionview (6.1.3.1)
49
+ activesupport (= 6.1.3.1)
47
50
  builder (~> 3.1)
48
51
  erubi (~> 1.4)
49
52
  rails-dom-testing (~> 2.0)
50
53
  rails-html-sanitizer (~> 1.1, >= 1.2.0)
51
- activejob (6.0.3.5)
52
- activesupport (= 6.0.3.5)
54
+ activejob (6.1.3.1)
55
+ activesupport (= 6.1.3.1)
53
56
  globalid (>= 0.3.6)
54
- activemodel (6.0.3.5)
55
- activesupport (= 6.0.3.5)
57
+ activemodel (6.1.3.1)
58
+ activesupport (= 6.1.3.1)
56
59
  activemodel-serializers-xml (1.0.2)
57
60
  activemodel (> 5.x)
58
61
  activesupport (> 5.x)
59
62
  builder (~> 3.1)
60
- activerecord (6.0.3.5)
61
- activemodel (= 6.0.3.5)
62
- activesupport (= 6.0.3.5)
63
+ activerecord (6.1.3.1)
64
+ activemodel (= 6.1.3.1)
65
+ activesupport (= 6.1.3.1)
63
66
  activeresource (5.1.1)
64
67
  activemodel (>= 5.0, < 7)
65
68
  activemodel-serializers-xml (~> 1.0)
66
69
  activesupport (>= 5.0, < 7)
67
- activestorage (6.0.3.5)
68
- actionpack (= 6.0.3.5)
69
- activejob (= 6.0.3.5)
70
- activerecord (= 6.0.3.5)
71
- marcel (~> 0.3.1)
72
- activesupport (6.0.3.5)
70
+ activestorage (6.1.3.1)
71
+ actionpack (= 6.1.3.1)
72
+ activejob (= 6.1.3.1)
73
+ activerecord (= 6.1.3.1)
74
+ activesupport (= 6.1.3.1)
75
+ marcel (~> 1.0.0)
76
+ mini_mime (~> 1.0.2)
77
+ activesupport (6.1.3.1)
73
78
  concurrent-ruby (~> 1.0, >= 1.0.2)
74
- i18n (>= 0.7, < 2)
75
- minitest (~> 5.1)
76
- tzinfo (~> 1.1)
77
- zeitwerk (~> 2.2, >= 2.2.2)
79
+ i18n (>= 1.6, < 2)
80
+ minitest (>= 5.1)
81
+ tzinfo (~> 2.0)
82
+ zeitwerk (~> 2.3)
78
83
  addressable (2.7.0)
79
84
  public_suffix (>= 2.0.2, < 5.0)
80
85
  ast (2.4.1)
@@ -88,15 +93,19 @@ GEM
88
93
  crack (0.4.4)
89
94
  crass (1.0.6)
90
95
  debug_inspector (0.0.3)
91
- erubi (1.9.0)
92
- faraday (1.3.0)
96
+ erubi (1.10.0)
97
+ faraday (1.4.1)
98
+ faraday-excon (~> 1.1)
93
99
  faraday-net_http (~> 1.0)
100
+ faraday-net_http_persistent (~> 1.1)
94
101
  multipart-post (>= 1.2, < 3)
95
- ruby2_keywords
102
+ ruby2_keywords (>= 0.0.4)
103
+ faraday-excon (1.1.0)
96
104
  faraday-net_http (1.0.1)
105
+ faraday-net_http_persistent (1.1.0)
97
106
  globalid (0.4.2)
98
107
  activesupport (>= 4.2.0)
99
- graphql (1.12.5)
108
+ graphql (1.12.8)
100
109
  graphql-client (0.16.0)
101
110
  activesupport (>= 3.0)
102
111
  graphql (~> 1.8)
@@ -104,17 +113,15 @@ GEM
104
113
  hashie (4.1.0)
105
114
  i18n (1.8.9)
106
115
  concurrent-ruby (~> 1.0)
107
- jwt (2.2.2)
108
- loofah (2.7.0)
116
+ jwt (2.2.3)
117
+ loofah (2.9.0)
109
118
  crass (~> 1.0.2)
110
119
  nokogiri (>= 1.5.9)
111
120
  mail (2.7.1)
112
121
  mini_mime (>= 0.1.1)
113
- marcel (0.3.3)
114
- mimemagic (~> 0.3.2)
122
+ marcel (1.0.1)
115
123
  method_source (0.9.2)
116
- mimemagic (0.3.5)
117
- mini_mime (1.0.2)
124
+ mini_mime (1.0.3)
118
125
  mini_portile2 (2.5.0)
119
126
  minitest (5.14.4)
120
127
  mocha (1.11.2)
@@ -122,24 +129,28 @@ GEM
122
129
  multi_xml (0.6.0)
123
130
  multipart-post (2.1.1)
124
131
  nio4r (2.5.7)
125
- nokogiri (1.11.1)
132
+ nokogiri (1.11.2)
126
133
  mini_portile2 (~> 2.5.0)
127
134
  racc (~> 1.4)
128
- oauth2 (1.4.4)
135
+ oauth2 (1.4.7)
129
136
  faraday (>= 0.8, < 2.0)
130
137
  jwt (>= 1.0, < 3.0)
131
138
  multi_json (~> 1.3)
132
139
  multi_xml (~> 0.5)
133
140
  rack (>= 1.2, < 3)
134
- omniauth (1.9.1)
141
+ omniauth (2.0.4)
135
142
  hashie (>= 3.4.6)
136
143
  rack (>= 1.6.2, < 3)
137
- omniauth-oauth2 (1.5.0)
138
- oauth2 (~> 1.1)
139
- omniauth (~> 1.2)
140
- omniauth-shopify-oauth2 (2.2.3)
144
+ rack-protection
145
+ omniauth-oauth2 (1.7.1)
146
+ oauth2 (~> 1.4)
147
+ omniauth (>= 1.9, < 3)
148
+ omniauth-rails_csrf_protection (1.0.0)
149
+ actionpack (>= 4.2)
150
+ omniauth (~> 2.0)
151
+ omniauth-shopify-oauth2 (2.3.2)
141
152
  activesupport
142
- omniauth-oauth2 (~> 1.5.0)
153
+ omniauth-oauth2 (~> 1.5)
143
154
  parallel (1.20.1)
144
155
  parser (2.7.2.0)
145
156
  ast (~> 2.4.1)
@@ -154,22 +165,24 @@ GEM
154
165
  public_suffix (4.0.6)
155
166
  racc (1.5.2)
156
167
  rack (2.2.3)
168
+ rack-protection (2.1.0)
169
+ rack
157
170
  rack-test (1.1.0)
158
171
  rack (>= 1.0, < 3)
159
- rails (6.0.3.5)
160
- actioncable (= 6.0.3.5)
161
- actionmailbox (= 6.0.3.5)
162
- actionmailer (= 6.0.3.5)
163
- actionpack (= 6.0.3.5)
164
- actiontext (= 6.0.3.5)
165
- actionview (= 6.0.3.5)
166
- activejob (= 6.0.3.5)
167
- activemodel (= 6.0.3.5)
168
- activerecord (= 6.0.3.5)
169
- activestorage (= 6.0.3.5)
170
- activesupport (= 6.0.3.5)
171
- bundler (>= 1.3.0)
172
- railties (= 6.0.3.5)
172
+ rails (6.1.3.1)
173
+ actioncable (= 6.1.3.1)
174
+ actionmailbox (= 6.1.3.1)
175
+ actionmailer (= 6.1.3.1)
176
+ actionpack (= 6.1.3.1)
177
+ actiontext (= 6.1.3.1)
178
+ actionview (= 6.1.3.1)
179
+ activejob (= 6.1.3.1)
180
+ activemodel (= 6.1.3.1)
181
+ activerecord (= 6.1.3.1)
182
+ activestorage (= 6.1.3.1)
183
+ activesupport (= 6.1.3.1)
184
+ bundler (>= 1.15.0)
185
+ railties (= 6.1.3.1)
173
186
  sprockets-rails (>= 2.0.0)
174
187
  rails-controller-testing (1.0.5)
175
188
  actionpack (>= 5.0.1.rc1)
@@ -180,12 +193,12 @@ GEM
180
193
  nokogiri (>= 1.6)
181
194
  rails-html-sanitizer (1.3.0)
182
195
  loofah (~> 2.3)
183
- railties (6.0.3.5)
184
- actionpack (= 6.0.3.5)
185
- activesupport (= 6.0.3.5)
196
+ railties (6.1.3.1)
197
+ actionpack (= 6.1.3.1)
198
+ activesupport (= 6.1.3.1)
186
199
  method_source
187
200
  rake (>= 0.8.7)
188
- thor (>= 0.20.3, < 2.0)
201
+ thor (~> 1.0)
189
202
  rainbow (3.0.0)
190
203
  rake (13.0.3)
191
204
  rb-readline (0.5.5)
@@ -208,7 +221,7 @@ GEM
208
221
  rubocop (~> 1.4)
209
222
  ruby-progressbar (1.10.1)
210
223
  ruby2_keywords (0.0.4)
211
- shopify_api (9.4.0)
224
+ shopify_api (9.4.1)
212
225
  activeresource (>= 4.1.0, < 6.0.0)
213
226
  graphql-client
214
227
  rack
@@ -221,9 +234,8 @@ GEM
221
234
  sprockets (>= 3.0.0)
222
235
  sqlite3 (1.4.2)
223
236
  thor (1.1.0)
224
- thread_safe (0.3.6)
225
- tzinfo (1.2.9)
226
- thread_safe (~> 0.1)
237
+ tzinfo (2.0.4)
238
+ concurrent-ruby (~> 1.0)
227
239
  unicode-display_width (1.7.0)
228
240
  webmock (3.9.1)
229
241
  addressable (>= 2.3.6)
data/README.md CHANGED
@@ -4,7 +4,7 @@
4
4
 
5
5
  [gem]: https://img.shields.io/gem/v/shopify_app.svg
6
6
  [gem_url]: https://rubygems.org/gems/shopify_app
7
- [supported_rails_version]: https://img.shields.io/badge/rails-%3C6.1.0-orange
7
+ [supported_rails_version]: https://img.shields.io/badge/rails-%3C6.2.0-orange
8
8
 
9
9
  This gem builds Rails applications that can be embedded in the Shopify Admin.
10
10
 
@@ -0,0 +1,9 @@
1
+ (function() {
2
+ function redirect() {
3
+ var form = document.getElementById("redirect-form");
4
+ if (form) {
5
+ form.submit();
6
+ }
7
+ }
8
+ document.addEventListener("DOMContentLoaded", redirect);
9
+ })();
@@ -129,8 +129,7 @@ module ShopifyApp
129
129
  end
130
130
 
131
131
  def access_scopes
132
- return unless auth_hash['extra']['scope']
133
- auth_hash['extra']['scope']
132
+ auth_hash.dig('extra', 'scope')
134
133
  end
135
134
 
136
135
  def reset_session_options
@@ -150,7 +150,11 @@ module ShopifyApp
150
150
  end
151
151
 
152
152
  def authenticate_in_context
153
- redirect_to("#{main_app.root_path}auth/shopify")
153
+ post_redirect_to_auth_shopify
154
+ end
155
+
156
+ def post_redirect_to_auth_shopify
157
+ render('shopify_app/shared/post_redirect_to_auth_shopify', layout: false)
154
158
  end
155
159
 
156
160
  def authenticate_at_top_level
@@ -0,0 +1,13 @@
1
+ <!DOCTYPE html>
2
+ <html lang="en">
3
+ <head>
4
+ <meta charset="utf-8" />
5
+ <meta name="viewport" content="width=device-width, initial-scale=1" />
6
+ <base target="_top">
7
+ <title>Redirecting…</title>
8
+ <%= javascript_include_tag('shopify_app/post_redirect', crossorigin: 'anonymous', integrity: true) %>
9
+ </head>
10
+ <body>
11
+ <%= form_tag '/auth/shopify', id: 'redirect-form' %>
12
+ </body>
13
+ </html>
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  nl:
3
3
  logged_out: Je bent afgemeld
4
- could_not_log_in: Kon niet aanmelden bij Shopify-winkel
4
+ could_not_log_in: Kon niet inloggen bij Shopify-winkel
5
5
  invalid_shop_url: Ongeldig winkeldomein
6
6
  enable_cookies_heading: Schakel cookies in van %{app}
7
7
  enable_cookies_body: Je moet cookies in deze browser handmatig inschakelen om %{app}
@@ -1,7 +1,27 @@
1
- Troubleshooting Shopify App
2
- ===========
1
+ # Troubleshooting Shopify App
3
2
 
4
- ### Generator shopify_app:install hangs
3
+ #### Table of contents
4
+
5
+ [Generators](#generators)
6
+ * [The `shopify_app:install` generator hangs](#the-shopifyappinstall-generator-hangs)
7
+
8
+ [Rails](#rails)
9
+ * [Known issues with Rails `v6.1`](#known-issues-with-rails-v61)
10
+
11
+ [App installation](#app-installation)
12
+ * [My app won't install](#my-app-wont-install)
13
+ * [My app keeps redirecting to login](#my-app-keeps-redirecting-to-login)
14
+ * [My app returns 401 during oauth](#my-app-returns-401-during-oauth)
15
+
16
+ [JWT session tokens](#jwt-session-tokens)
17
+ * [My app is still using cookies to authenticate](#my-app-is-still-using-cookies-to-authenticate)
18
+ * [My app can't make requests to the Shopify API](#my-app-cant-make-requests-to-the-shopify-api)
19
+
20
+ [Migrating to App Bridge 2.0](#migrating-to-app-bridge-2.0)
21
+
22
+ ## Generators
23
+
24
+ ### The shopify_app:install generator hangs
5
25
 
6
26
  Rails uses spring by default to speed up development. To run the generator, spring has to be stopped:
7
27
 
@@ -11,6 +31,129 @@ $ bundle exec spring stop
11
31
 
12
32
  Run shopify_app generator again.
13
33
 
14
- ### App installation fails with 'The page you’re looking for could not be found' if the app was installed before
34
+ ## Rails
35
+
36
+ ### Known issues with Rails `v6.1`
37
+
38
+ If you recently upgraded your application's `Rails::Application` configuration to load the default configuration for Rails `v6.1`, then you will need to update the following `cookies_same_site_protection` ActionDispatch configuration.
39
+
40
+ ```diff
41
+ # config/application.rb
42
+
43
+ require_relative 'boot'
44
+
45
+ require 'rails/all'
46
+
47
+ Bundler.require(*Rails.groups)
48
+
49
+ module AppName
50
+ class Application < Rails::Application
51
+ + config.load_defaults 6.1
52
+
53
+ + config.action_dispatch.cookies_same_site_protection = :none
54
+ ...
55
+ end
56
+ end
57
+ ```
58
+
59
+ As of Rails `v6.1`, the same-site cookie protection setting defaults to `Lax`. This does not allow an embedded app to make cross-domain requests in the Shopify Admin.
60
+
61
+ Alternatively, you can upgrade to [`v17.2.0` of the shopify_app gem](/docs/Upgrading.md#upgrading-to-v1720).
62
+
63
+ ## App installation
64
+
65
+ ### My app won't install
66
+
67
+ #### App installation fails with 'The page you’re looking for could not be found' if the app was installed before
15
68
 
16
69
  This issue can occur when the session (the model you set as `ShopifyApp::SessionRepository.storage`) isn't deleted when the user uninstalls your app. A possible fix for this is listening to the `app/uninstalled` webhook and deleting the corresponding session in the webhook handler.
70
+
71
+ ### My app returns 401 during oauth
72
+
73
+ If your local dev env uses the `cookie_store` session storage strategy, you may encounter 401 errors during oauth due to a race condition between asset requests and `/auth/shopify`. You should be able to work around for local testing by using a different browser or session storage strategy. [Read more about the status of this issue](https://github.com/Shopify/shopify_app/issues/1269).
74
+
75
+ ## JWT session tokens
76
+
77
+ ### My app is still using cookies to authenticate
78
+
79
+ #### `shopify_app` gem version
80
+
81
+ Ensure the app is using shopify_app gem v13.x.x+. See [*Upgrading to `v13.0.0`*](/docs/Upgrading.md#upgrading-to-v1300).
82
+
83
+ #### `shopify_app` gem Rails configuration
84
+
85
+ Edit `config/initializer/shopify_app.rb` and ensure the following configurations are set:
86
+
87
+ ```diff
88
+ + config.embedded_app = true
89
+
90
+ + config.allow_jwt_authentication = true
91
+ + config.allow_cookie_authentication = false
92
+
93
+ # This line should already exist if you're using shopify_app gem 13.x.x+
94
+ + config.shop_session_repository = 'Shop'
95
+ ```
96
+
97
+ #### Inspect server logs
98
+
99
+ If you have checked the configurations above, and the app is still using cookies, then it is possible that the `shopify_app` gem defaulted to relying on cookies. This would happen when your browser allows third-party cookies and a session token was not successfully found as part of your request.
100
+
101
+ In this case, check the server logs to see if the session token was invalid:
102
+
103
+ ```los
104
+ [ShopifyApp::JWT] Failed to validate JWT: [JWT::<Error>] <Failure message>
105
+ ```
106
+
107
+ *Example*
108
+
109
+ ```
110
+ [ShopifyApp::JWT] Failed to validate JWT: [JWT::ImmatureSignature] Signature nbf has not been reached
111
+ ```
112
+
113
+ **Note:** In a local development environment, you may want to temporarily update your `Gemfile` to point to a local instance of the `shopify_app` library instad of an installed gem. This will enable you to use a debugging tool like `byebug` to debug the library.
114
+
115
+ ```diff
116
+ - gem 'shopify_app', '~> 14.2'
117
+ + gem 'shopify_app', path: '/path/to/shopify_app'
118
+ ```
119
+
120
+ ### My app can't make requests to the Shopify API
121
+
122
+ > **Note:** Session tokens cannot be used to make authenticated requests to the Shopify API. Learn more about authenticating your backend requests to Shopify APIs at [Shopify API authentication](https://shopify.dev/concepts/about-apis/authentication).
123
+
124
+ #### The Shopify API returns `401 Unauthorized`
125
+
126
+ If your app uses [user-based token storage](/docs/shopify_app/session-repository.md#user-based-token-storage), then your app is configured to use **online** access tokens (see [API access modes](https://shopify.dev/concepts/about-apis/authentication#api-access-modes) to learn the difference between "online" and "offline" access tokens ). Unlike offline access tokens, online access tokens expire daily and cannot be used to make authenticated requests to the Shopify API once they expire.
127
+
128
+ Converting your app to use session tokens means that your app will most likely not go through the OAuth flow as often as it did when relying on cookie sessions. Since the online access tokens stored in your app's database are refreshed during OAuth, this may cause your app's user session repository to use expired online access tokens.
129
+
130
+ If the Shopify API returns `401 Unauthorized`, handle this error on your app by redirecting the user to your login path to start the OAuth flow. As a result, your app will be given a new online access token for the current user.
131
+
132
+ > **Note:** The following are examples to common app configurations. Your specific use-case may differ.
133
+
134
+ ##### Example solution
135
+
136
+ Add the following line to your app's unauthorized response handler:
137
+
138
+ ```diff
139
+ + redirect_to(ShopifyApp.configuration.login_url, shop: current_shopify_domain)
140
+ ```
141
+
142
+ _Example:_ If your embedded app cannot handle server-side XHR redirects, then configure your app's unauthorized response handler to set a response header:
143
+
144
+ ```
145
+ X-Shopify-API-Request-Failure-Unauthorized: true
146
+ ```
147
+
148
+ Then, use the [Shopify App Bridge Redirect](https://shopify.dev/tools/app-bridge/actions/navigation/redirect) action to redirect your app frontend to the app login URL if this header is set.
149
+
150
+ ## Migrating to App Bridge 2.0
151
+
152
+ In order to upgrade your embedded app to the latest App Bridge 2.0 version, please refer to the [migration guide](https://shopify.dev/tutorials/migrate-your-app-to-app-bridge-2).
153
+
154
+ To ensure that your app's embedded layout doesn't import App Bridge 2.0 before fully migrating, make the following change to bind it to v1.x.
155
+
156
+ ```diff
157
+ - <script src="https://unpkg.com/@shopify/app-bridge"></script>
158
+ + <script src="https://unpkg.com/@shopify/app-bridge@1"></script>
159
+ ```
data/docs/Upgrading.md CHANGED
@@ -4,12 +4,28 @@ This file documents important changes needed to upgrade your app's Shopify App v
4
4
 
5
5
  #### Table of contents
6
6
 
7
+ [Upgrading to `v17.2.0`](#upgrading-to-v1720)
8
+
7
9
  [Upgrading to `v13.0.0`](#upgrading-to-v1300)
8
10
 
9
11
  [Upgrading to `v11.7.0`](#upgrading-to-v1170)
10
12
 
11
13
  [Upgrading from `v8.6` to `v9.0.0`](#upgrading-from-v86-to-v900)
12
14
 
15
+ ## Upgrading to `v17.2.0`
16
+
17
+ ### Different SameSite cookie attribute behaviour
18
+
19
+ To support Rails `v6.1`, the [`SameSiteCookieMiddleware`](/lib/shopify_app/middleware/same_site_cookie_middleware.rb) was updated to configure cookies to `SameSite=None` if the app is embedded. Before this release, cookies were configured to `SameSite=None` only if this attribute had not previously been set before.
20
+
21
+ ```diff
22
+ # same_site_cookie_middleware.rb
23
+ - cookie << '; SameSite=None' unless cookie =~ /;\s*samesite=/i
24
+ + cookie << '; SameSite=None' if ShopifyApp.configuration.embedded_app?
25
+ ```
26
+
27
+ By default, Rails `v6.1` configures `SameSite=Lax` on all cookies that don't specify this attribute.
28
+
13
29
  ## Upgrading to `v13.0.0`
14
30
 
15
31
  Version 13.0.0 adds the ability to use both user and shop sessions, concurrently. This however involved a large
@@ -1,8 +1,14 @@
1
1
  # Handling changes in access scopes
2
- The Shopify App gem provides handling changes to scopes for both shop/offline and user/online tokens. To enable your app to login via OAuth on scope changes, you can set the following configuration flag:
2
+ The Shopify App gem provides handling changes to scopes for both shop/offline and user/online tokens. To enable your app to login via OAuth on scope changes, you can set the following configuration flag in your `config/initializers/shopify_app.rb`:
3
3
  ```ruby
4
- ShopifyApp.configuration.reauth_on_access_scope_changes = true
4
+ config.reauth_on_access_scope_changes = true
5
5
  ```
6
6
 
7
7
  ## ShopAccessScopesVerification
8
8
  The `ShopifyApp::ShopAccessScopesVerification` concern helps merchants grant new access scopes requested by the app. The concern compares the current access scopes granted by the shop and compares them with the scopes requested by the app. If there is a mismatch in configuration, the merchant is redirected to login via OAuth and grant the net new scopes.
9
+
10
+ To activate the `ShopAccessScopesVerification` for a controller add `include ShopifyApp::ShopAccessScopesVerification`:
11
+ ```ruby
12
+ class HomeController < AuthenticatedController
13
+ include ShopifyApp::ShopAccessScopesVerification
14
+ ```
@@ -78,7 +78,7 @@ end
78
78
  provider :shopify,
79
79
  ...
80
80
  setup: lambda { |env|
81
- configuration = ShopifyApp::OmniauthConfiguration.new(env['omniauth.strategy'], Rack::Request.new(env))
81
+ configuration = ShopifyApp::OmniAuthConfiguration.new(env['omniauth.strategy'], Rack::Request.new(env))
82
82
  configuration.build_options
83
83
  }
84
84
 
@@ -3,8 +3,16 @@
3
3
  class HomeController < AuthenticatedController
4
4
  include ShopifyApp::ShopAccessScopesVerification
5
5
 
6
+ before_action :set_host
7
+
6
8
  def index
7
9
  @products = ShopifyAPI::Product.find(:all, params: { limit: 10 })
8
10
  @webhooks = ShopifyAPI::Webhook.find(:all)
9
11
  end
12
+
13
+ private
14
+
15
+ def set_host
16
+ @host = params[:host]
17
+ end
10
18
  end
@@ -18,7 +18,7 @@
18
18
 
19
19
  // Save a session token for future requests
20
20
  window.sessionToken = await new Promise((resolve) => {
21
- app.subscribe(SessionToken.ActionType.RESPOND, (data) => {
21
+ app.subscribe(SessionToken.Action.RESPOND, (data) => {
22
22
  resolve(data.sessionToken || "");
23
23
  });
24
24
  });
@@ -7,5 +7,6 @@ class HomeController < ApplicationController
7
7
 
8
8
  def index
9
9
  @shop_origin = current_shopify_domain
10
+ @host = params[:host]
10
11
  end
11
12
  end
@@ -24,11 +24,12 @@
24
24
 
25
25
  <%= render 'layouts/flash_messages' %>
26
26
 
27
- <script src="https://unpkg.com/@shopify/app-bridge"></script>
27
+ <script src="https://unpkg.com/@shopify/app-bridge@2"></script>
28
28
 
29
29
  <%= content_tag(:div, nil, id: 'shopify-app-init', data: {
30
30
  api_key: ShopifyApp.configuration.api_key,
31
31
  shop_origin: @shop_origin || (@current_shopify_session.domain if @current_shopify_session),
32
+ host: @host,
32
33
  debug: Rails.env.development?
33
34
  } ) %>
34
35
 
@@ -4,7 +4,7 @@ document.addEventListener('DOMContentLoaded', () => {
4
4
  var createApp = AppBridge.default;
5
5
  window.app = createApp({
6
6
  apiKey: data.apiKey,
7
- shopOrigin: data.shopOrigin,
7
+ host: data.host,
8
8
  });
9
9
 
10
10
  var actions = AppBridge.actions;
data/lib/shopify_app.rb CHANGED
@@ -3,6 +3,7 @@ require 'shopify_app/version'
3
3
 
4
4
  # deps
5
5
  require 'shopify_api'
6
+ require 'omniauth/rails_csrf_protection'
6
7
  require 'omniauth-shopify-oauth2'
7
8
  require 'redirect_safely'
8
9
 
@@ -9,6 +9,8 @@ module ShopifyApp
9
9
 
10
10
  class ShopifyDomainNotFound < StandardError; end
11
11
 
12
+ class ShopifyHostNotFound < StandardError; end
13
+
12
14
  included do
13
15
  after_action :set_test_cookie
14
16
  rescue_from ActiveResource::UnauthorizedAccess, with: :close_session
@@ -103,6 +105,12 @@ module ShopifyApp
103
105
  request.env['jwt.shopify_user_id']
104
106
  end
105
107
 
108
+ def host
109
+ return params[:host] if params[:host].present?
110
+
111
+ raise ShopifyHostNotFound
112
+ end
113
+
106
114
  def redirect_to_login
107
115
  if request.xhr?
108
116
  head(:unauthorized)
@@ -215,9 +223,8 @@ module ShopifyApp
215
223
  end
216
224
 
217
225
  def return_address
218
- return base_return_address unless ShopifyApp.configuration.allow_jwt_authentication
219
- return_address_with_params(shop: current_shopify_domain)
220
- rescue ShopifyDomainNotFound
226
+ return_address_with_params(shop: current_shopify_domain, host: host)
227
+ rescue ShopifyDomainNotFound, ShopifyHostNotFound
221
228
  base_return_address
222
229
  end
223
230
 
@@ -17,6 +17,7 @@ module ShopifyApp
17
17
  initializer "shopify_app.assets.precompile" do |app|
18
18
  app.config.assets.precompile += %w[
19
19
  shopify_app/redirect.js
20
+ shopify_app/post_redirect.js
20
21
  shopify_app/top_level.js
21
22
  shopify_app/enable_cookies.js
22
23
  shopify_app/request_storage_access.js
@@ -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' unless cookie =~ /;\s*samesite=/i
24
+ cookie << '; SameSite=None' if ShopifyApp.configuration.embedded_app?
25
25
  cookie
26
26
  end
27
27
 
@@ -1,4 +1,4 @@
1
1
  # frozen_string_literal: true
2
2
  module ShopifyApp
3
- VERSION = '17.1.0'
3
+ VERSION = '18.0.1'
4
4
  end
data/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "shopify_app",
3
- "version": "17.1.0",
3
+ "version": "18.0.1",
4
4
  "repository": "git@github.com:Shopify/shopify_app.git",
5
5
  "author": "Shopify",
6
6
  "license": "MIT",
data/service.yml CHANGED
@@ -1,7 +1,4 @@
1
1
  audience: partner
2
2
  classification: library
3
- org_line: App & Partner Platform
4
- owners:
5
- - Shopify/platform-dev-tools-education
6
3
  slack_channels:
7
- - dev-tools-education
4
+ - shopify_app_gem
data/shopify_app.gemspec CHANGED
@@ -14,10 +14,11 @@ 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.1')
17
+ s.add_runtime_dependency('omniauth-rails_csrf_protection')
18
+ s.add_runtime_dependency('rails', '> 5.2.1', '< 6.2')
18
19
  s.add_runtime_dependency('shopify_api', '~> 9.4')
19
- s.add_runtime_dependency('omniauth-shopify-oauth2', '~> 2.2.2')
20
- s.add_runtime_dependency('jwt', '~> 2.2.1')
20
+ s.add_runtime_dependency('omniauth-shopify-oauth2', '~> 2.3')
21
+ s.add_runtime_dependency('jwt', '>= 2.2.3')
21
22
  s.add_runtime_dependency('redirect_safely', '~> 1.0')
22
23
 
23
24
  s.add_development_dependency('rake')
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.4.0:
1478
- version "4.11.9"
1479
- resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-4.11.9.tgz#26d556829458f9d1e81fc48952493d0ba3507828"
1480
- integrity sha512-E6QoYqCKZfgatHTdHzs1RRKP7ip4vvm+EyRUeE2RF0NblwVvb0p6jSVeNTOFxPn26QXN2o6SMfNxKp6kU8zQaw==
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.3"
2184
- resolved "https://registry.yarnpkg.com/elliptic/-/elliptic-6.5.3.tgz#cb59eb2efdaf73a0bd78ccd7015a62ad6e0f93d6"
2185
- integrity sha512-IMqzv5wNQf+E6aHeIqATs0tOLeOTwj1QKbRcS3jBbYkl5oLAserA8yJTT7/VyHUYG91PRmPyeQDObKLPpeS4dw==
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.4.0"
2188
- brorand "^1.0.1"
2187
+ bn.js "^4.11.9"
2188
+ brorand "^1.1.0"
2189
2189
  hash.js "^1.0.0"
2190
- hmac-drbg "^1.0.0"
2191
- inherits "^2.0.1"
2192
- minimalistic-assert "^1.0.0"
2193
- minimalistic-crypto-utils "^1.0.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.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.0, minimalistic-crypto-utils@^1.0.1:
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=
@@ -4519,9 +4519,9 @@ sprintf-js@~1.0.2:
4519
4519
  integrity sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=
4520
4520
 
4521
4521
  ssri@^6.0.1:
4522
- version "6.0.1"
4523
- resolved "https://registry.yarnpkg.com/ssri/-/ssri-6.0.1.tgz#2a3c41b28dd45b62b63676ecb74001265ae9edd8"
4524
- integrity sha512-3Wge10hNcT1Kur4PDFwEieXSCMCJs/7WvSACcrMYrNp+b8kDL1/0wJch5Ni2WrtwEa2IO8OsVfeKIciKCDx/QA==
4522
+ version "6.0.2"
4523
+ resolved "https://registry.yarnpkg.com/ssri/-/ssri-6.0.2.tgz#157939134f20464e7301ddba3e90ffa8f7728ac5"
4524
+ integrity sha512-cepbSq/neFK7xB6A50KHN0xHDotYzq58wWCa5LeWqnPrHG8GzfEjO/4O8kpmcGW+oaxkvhEJCWgbgNk4/ZV93Q==
4525
4525
  dependencies:
4526
4526
  figgy-pudding "^3.5.1"
4527
4527
 
@@ -5115,9 +5115,9 @@ xtend@^4.0.0, xtend@~4.0.1:
5115
5115
  integrity sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==
5116
5116
 
5117
5117
  y18n@^4.0.0:
5118
- version "4.0.0"
5119
- resolved "https://registry.yarnpkg.com/y18n/-/y18n-4.0.0.tgz#95ef94f85ecc81d007c264e190a120f0a3c8566b"
5120
- integrity sha512-r9S/ZyXu/Xu9q1tYlpsLIsa3EeLXXk0VwlxqTcFRfg9EhMW+17kbt9G0NrgCmhGb5vT2hyhJZLfDGx+7+5Uj/w==
5118
+ version "4.0.3"
5119
+ resolved "https://registry.yarnpkg.com/y18n/-/y18n-4.0.3.tgz#b5f259c82cd6e336921efd7bfd8bf560de9eeedf"
5120
+ integrity sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==
5121
5121
 
5122
5122
  yallist@^3.0.2:
5123
5123
  version "3.1.1"
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.1.0
4
+ version: 18.0.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-03-05 00:00:00.000000000 Z
11
+ date: 2021-05-10 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: browser_sniffer
@@ -24,6 +24,20 @@ dependencies:
24
24
  - - "~>"
25
25
  - !ruby/object:Gem::Version
26
26
  version: 1.2.2
27
+ - !ruby/object:Gem::Dependency
28
+ name: omniauth-rails_csrf_protection
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - ">="
32
+ - !ruby/object:Gem::Version
33
+ version: '0'
34
+ type: :runtime
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - ">="
39
+ - !ruby/object:Gem::Version
40
+ version: '0'
27
41
  - !ruby/object:Gem::Dependency
28
42
  name: rails
29
43
  requirement: !ruby/object:Gem::Requirement
@@ -33,7 +47,7 @@ dependencies:
33
47
  version: 5.2.1
34
48
  - - "<"
35
49
  - !ruby/object:Gem::Version
36
- version: '6.1'
50
+ version: '6.2'
37
51
  type: :runtime
38
52
  prerelease: false
39
53
  version_requirements: !ruby/object:Gem::Requirement
@@ -43,7 +57,7 @@ dependencies:
43
57
  version: 5.2.1
44
58
  - - "<"
45
59
  - !ruby/object:Gem::Version
46
- version: '6.1'
60
+ version: '6.2'
47
61
  - !ruby/object:Gem::Dependency
48
62
  name: shopify_api
49
63
  requirement: !ruby/object:Gem::Requirement
@@ -64,28 +78,28 @@ dependencies:
64
78
  requirements:
65
79
  - - "~>"
66
80
  - !ruby/object:Gem::Version
67
- version: 2.2.2
81
+ version: '2.3'
68
82
  type: :runtime
69
83
  prerelease: false
70
84
  version_requirements: !ruby/object:Gem::Requirement
71
85
  requirements:
72
86
  - - "~>"
73
87
  - !ruby/object:Gem::Version
74
- version: 2.2.2
88
+ version: '2.3'
75
89
  - !ruby/object:Gem::Dependency
76
90
  name: jwt
77
91
  requirement: !ruby/object:Gem::Requirement
78
92
  requirements:
79
- - - "~>"
93
+ - - ">="
80
94
  - !ruby/object:Gem::Version
81
- version: 2.2.1
95
+ version: 2.2.3
82
96
  type: :runtime
83
97
  prerelease: false
84
98
  version_requirements: !ruby/object:Gem::Requirement
85
99
  requirements:
86
- - - "~>"
100
+ - - ">="
87
101
  - !ruby/object:Gem::Version
88
- version: 2.2.1
102
+ version: 2.2.3
89
103
  - !ruby/object:Gem::Dependency
90
104
  name: redirect_safely
91
105
  requirement: !ruby/object:Gem::Requirement
@@ -272,6 +286,7 @@ files:
272
286
  - app/assets/javascripts/shopify_app/enable_cookies.js
273
287
  - app/assets/javascripts/shopify_app/itp_helper.js
274
288
  - app/assets/javascripts/shopify_app/partition_cookies.js
289
+ - app/assets/javascripts/shopify_app/post_redirect.js
275
290
  - app/assets/javascripts/shopify_app/redirect.js
276
291
  - app/assets/javascripts/shopify_app/request_storage_access.js
277
292
  - app/assets/javascripts/shopify_app/storage_access.js
@@ -297,6 +312,7 @@ files:
297
312
  - app/views/shopify_app/sessions/new.html.erb
298
313
  - app/views/shopify_app/sessions/request_storage_access.html.erb
299
314
  - app/views/shopify_app/sessions/top_level_interaction.html.erb
315
+ - app/views/shopify_app/shared/post_redirect_to_auth_shopify.html.erb
300
316
  - app/views/shopify_app/shared/redirect.html.erb
301
317
  - config/locales/cs.yml
302
318
  - config/locales/da.yml