-
-
Notifications
You must be signed in to change notification settings - Fork 277
/
session-oauth.js
128 lines (110 loc) · 4.67 KB
/
session-oauth.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
(function() {
var Blog, Order, Product, Resource, Session, SessionOAuth,
__bind = function(fn, me){ return function(){ return fn.apply(me, arguments); }; },
__hasProp = Object.prototype.hasOwnProperty,
__extends = function(child, parent) { for (var key in parent) { if (__hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor; child.__super__ = parent.prototype; return child; };
Blog = require('./resources/blog');
Product = require('./resources/product');
Order = require('./resources/order');
Resource = require('./resource');
Session = require('./session');
SessionOAuth = (function(_super) {
__extends(SessionOAuth, _super);
function SessionOAuth(store_name, api_key, secret, params) {
this.store_name = store_name;
this.api_key = api_key;
this.secret = secret;
if (params == null) params = {};
this.requestTemporaryAccessToken = __bind(this.requestTemporaryAccessToken, this);
SessionOAuth.__super__.constructor.call(this, this.store_name, this.api_key, this.secret);
if (typeof params === 'string') {
this.persistent_token = params;
params = {
persistent_token: this.persistent_token
};
} else {
params = params || {};
this.persistent_token = params.persistent_token || null;
}
this.params = params;
this.registerOAuthToken(params);
}
SessionOAuth.prototype.onRedirectUrl = function(url, cb) {
var _this = this;
return url.replace(/\?code=[\w\d]+/, function(code) {
var temp_token;
temp_token = code.split('=')[1];
return _this.requestPermanentAccessToken(temp_token, function(persistent_token) {
_this.persistent_token = persistent_token;
_this.registerOAuthToken();
return process.nextTick(function() {
return cb(_this.store_name, _this.persistent_token);
});
});
});
};
SessionOAuth.prototype.requestPermanentAccessToken = function(temp_token, cb) {
var params,
_this = this;
params = "client_id=" + this.api_key + "&client_secret=" + this.secret + "&code=" + temp_token;
return Resource.post("" + (this.site()) + "/oauth/access_token", 'oauth', params, function(err, response) {
if (err != null) {
throw err;
return;
}
response = JSON.parse(response);
return process.nextTick(function() {
return cb(response.access_token);
});
});
};
SessionOAuth.prototype.requestTemporaryAccessToken = function() {
var scope, uri_base;
scope = this.getScope();
if (!scope.length) {
this.params.onAskToken(Error("No Shopify scope defined, cannot ask for no right"));
}
uri_base = "" + (this.site()) + "/oauth/authorize?client_id=" + this.api_key + "&scope=" + scope;
if (this.params.uriForTemporaryToken) {
return this.params.onAskToken.call(this, null, "" + uri_base + "&redirect_uri=" + this.params.uriForTemporaryToken);
} else {
return this.params.onAskToken.call(this, null, uri_base);
}
};
SessionOAuth.prototype.site = function() {
return "" + this.protocol + "://" + this.store_name + ".myshopify.com/admin";
};
SessionOAuth.prototype.registerOAuthToken = function(params) {
if (this.persistent_token !== null) {
return Resource.setOAuthToken(this.persistent_token);
} else if (typeof this.params.onAskToken === 'function') {
return this.requestTemporaryAccessToken();
} else {
throw Error("No onAskToken callback defined for getting temporary oauth2 token from Shopify, and no persistent token defined either in session");
}
};
SessionOAuth.prototype.getScope = function(scope) {
var rights, type, types, _i, _len;
this.scope = scope;
types = ['content', 'themes', 'products', 'customers', 'orders', 'script_tags', 'shipping'];
scope = [];
this.scope = this.scope || this.params.scope || {};
for (_i = 0, _len = types.length; _i < _len; _i++) {
type = types[_i];
if (!this.scope[type]) continue;
if (typeof this.scope[type] === 'string') {
this.scope[type] = this.scope[type].split(/[\/,]/);
}
if (Array.isArray(this.scope[type])) {
rights = this.scope[type].map(function(right) {
return "" + right + "_" + type;
});
scope.push(rights.join(','));
}
}
return scope.join(',');
};
return SessionOAuth;
})(Session);
module.exports = SessionOAuth;
}).call(this);