shopify-graphql_proxy 0.1.0 → 0.2.0
Sign up to get free protection for your applications and to get access to all the features.
- 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
|