shopify-graphql_proxy 0.1.0 → 0.2.0
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/README.md +67 -0
- data/lib/shopify/graphql_proxy.rb +23 -9
- data/shopify-graphql_proxy.gemspec +2 -1
- metadata +3 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 53a98e1b0047f818fedcfabe1015fce982167c76
|
4
|
+
data.tar.gz: ea8901b6ec6dab33dd1746fbc766bff80769ba4a
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 7857c3847d01d36411599221120ec76190ac9ecf99b06d906a0eb0567dabc51c4a3ad8ffcbdc032580361efdab43664dcba591639ed3515b89c72cd6c5fe7490
|
7
|
+
data.tar.gz: 10db470df033c3bb6b6fcb8f12202993beef396bede4bb239dcf0a1dd5354c8698fe4e3f01a5de84697af738a137b9456c4fdd1babcbe075bc181a770188863b
|
data/README.md
ADDED
@@ -0,0 +1,67 @@
|
|
1
|
+
# shopify-graphql_proxy
|
2
|
+
Gem to securely proxy graphql requests to Shopify from Rack based Apps
|
3
|
+
|
4
|
+
* Avoid CORS complications by proxying from same domain to Shopify
|
5
|
+
* Allows client side scripts to query a logged in merchant's shop without needing to know the users acces token
|
6
|
+
|
7
|
+
## Installation
|
8
|
+
Add the following to your Gemfile
|
9
|
+
```
|
10
|
+
gem 'shopify-graphql_proxy', '-> 0.1.0'
|
11
|
+
```
|
12
|
+
Or install:
|
13
|
+
```
|
14
|
+
gem install shopify-graphql_proxy
|
15
|
+
```
|
16
|
+
|
17
|
+
## Usage
|
18
|
+
It is recommended to use the [omniauth-shopify-oauth2](https://github.com/Shopify/omniauth-shopify-oauth2) to authenticate requests with Shopify
|
19
|
+
|
20
|
+
```ruby
|
21
|
+
use Shopify::GraphQLProxy
|
22
|
+
|
23
|
+
```
|
24
|
+
|
25
|
+
This middleware expects that the session data is stored in the shopify key
|
26
|
+
|
27
|
+
|
28
|
+
```ruby
|
29
|
+
session[:shopify] = {
|
30
|
+
shop: shop_name,
|
31
|
+
token: token
|
32
|
+
}
|
33
|
+
```
|
34
|
+
|
35
|
+
It will proxy any `POST` request to `/graphql` on your app to the current logged in shop found in session
|
36
|
+
|
37
|
+
#### Get GraphQL data from client side with logged in merchant's shop
|
38
|
+
```javascript
|
39
|
+
fetch('/graphql', {
|
40
|
+
method: 'POST',
|
41
|
+
headers: { 'Content-Type': 'application/json' },
|
42
|
+
body: JSON.stringify({ query: '{ shop { name } }' }),
|
43
|
+
credentials: 'include'
|
44
|
+
})
|
45
|
+
.then(res => res.json())
|
46
|
+
.then(res => console.log(res.data));
|
47
|
+
```
|
48
|
+
|
49
|
+
## Custom path
|
50
|
+
You can use the Rack::Builder#map method to specify middleware to run under specific path
|
51
|
+
```ruby
|
52
|
+
# /shopify/graphql
|
53
|
+
|
54
|
+
map('/shopify') do
|
55
|
+
use Shopify::GraphQLProxy
|
56
|
+
run Proc.new { |env| [200, {'Content-Type' => 'text/plain'}, ['get rack\'d']]}
|
57
|
+
end
|
58
|
+
|
59
|
+
map('/') do
|
60
|
+
run App
|
61
|
+
end
|
62
|
+
```
|
63
|
+
|
64
|
+
## Thanks
|
65
|
+
|
66
|
+
* [Rack Proxy](https://github.com/ncr/rack-proxy)
|
67
|
+
* [Koa Shopify GraphQL Proxy](https://github.com/Shopify/quilt/tree/master/packages/koa-shopify-graphql-proxy)
|
@@ -4,25 +4,33 @@ module Shopify
|
|
4
4
|
class GraphQLProxy < Rack::Proxy
|
5
5
|
PROXY_BASE_PATH = "/graphql"
|
6
6
|
GRAPHQL_PATH = "/admin/api/graphql.json"
|
7
|
-
VERSION = "0.
|
7
|
+
VERSION = "0.2.0"
|
8
|
+
|
9
|
+
def initialize(app = nil, opts= {})
|
10
|
+
super
|
11
|
+
@shop = opts[:shop] if opts[:shop]
|
12
|
+
@password = opts[:password] if opts[:password]
|
13
|
+
end
|
8
14
|
|
9
15
|
def perform_request(env)
|
10
|
-
request = Rack::Request.new(env)
|
16
|
+
@request = Rack::Request.new(env)
|
11
17
|
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
18
|
+
path_info = @request.path_info
|
19
|
+
request_method = @request.request_method
|
20
|
+
|
21
|
+
if path_info =~ %r{^#{PROXY_BASE_PATH}} && request_method == "POST"
|
22
|
+
shop = @shop ? @shop : value_from_shopify_session(:shop)
|
23
|
+
token = @password ? @password : value_from_shopify_session(:token)
|
16
24
|
|
17
|
-
unless
|
25
|
+
unless shop && token
|
18
26
|
return ["403", {"Content-Type" => "text/plain"}, ["Unauthorized"]]
|
19
27
|
end
|
20
28
|
|
21
|
-
backend = URI("https://#{
|
29
|
+
backend = URI("https://#{shop}#{GRAPHQL_PATH}")
|
22
30
|
|
23
31
|
env["HTTP_HOST"] = backend.host
|
24
32
|
env["PATH_INFO"] = backend.path
|
25
|
-
env["HTTP_X_SHOPIFY_ACCESS_TOKEN"] =
|
33
|
+
env["HTTP_X_SHOPIFY_ACCESS_TOKEN"] = token
|
26
34
|
env["SCRIPT_NAME"] = ""
|
27
35
|
env["HTTP_COOKIE"] = nil
|
28
36
|
|
@@ -31,5 +39,11 @@ module Shopify
|
|
31
39
|
@app.call(env)
|
32
40
|
end
|
33
41
|
end
|
42
|
+
|
43
|
+
private
|
44
|
+
|
45
|
+
def value_from_shopify_session(key)
|
46
|
+
@request.session.key?(:shopify) ? @request.session[:shopify][key] : nil;
|
47
|
+
end
|
34
48
|
end
|
35
49
|
end
|
@@ -1,10 +1,11 @@
|
|
1
1
|
# coding: utf-8
|
2
2
|
lib = File.expand_path("../lib", __FILE__)
|
3
3
|
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
4
|
+
require 'shopify/graphql_proxy'
|
4
5
|
|
5
6
|
Gem::Specification.new do |spec|
|
6
7
|
spec.name = "shopify-graphql_proxy"
|
7
|
-
spec.version =
|
8
|
+
spec.version = Shopify::GraphQLProxy::VERSION
|
8
9
|
spec.authors = ["montalvomiguelo"]
|
9
10
|
spec.email = ["me@montalvomiguelo.com"]
|
10
11
|
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: shopify-graphql_proxy
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.2.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- montalvomiguelo
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2018-
|
11
|
+
date: 2018-08-19 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|
@@ -90,6 +90,7 @@ files:
|
|
90
90
|
- ".gitignore"
|
91
91
|
- Gemfile
|
92
92
|
- LICENSE.txt
|
93
|
+
- README.md
|
93
94
|
- Rakefile
|
94
95
|
- lib/shopify/graphql_proxy.rb
|
95
96
|
- shopify-graphql_proxy.gemspec
|