@agnostack/next-shopify 1.10.0-beta.23 → 1.10.0-beta.25
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.
- package/CHANGELOG.md +14 -0
- package/dist/lib/handlers/api/proxy.d.ts.map +1 -1
- package/dist/lib/handlers/api/proxy.js +47 -49
- package/dist/lib/handlers/api/proxy.js.map +1 -1
- package/dist/lib/handlers/api/token.d.ts.map +1 -1
- package/dist/lib/handlers/api/token.js +32 -28
- package/dist/lib/handlers/api/token.js.map +1 -1
- package/dist/lib/utils/index.d.ts +1 -0
- package/dist/lib/utils/index.js +1 -0
- package/dist/lib/utils/index.js.map +1 -1
- package/dist/lib/utils/token.d.ts +17 -0
- package/dist/lib/utils/token.d.ts.map +1 -0
- package/dist/lib/utils/token.js +35 -0
- package/dist/lib/utils/token.js.map +1 -0
- package/dist/shared/errors.d.ts +2 -0
- package/dist/shared/errors.d.ts.map +1 -1
- package/dist/shared/errors.js +9 -1
- package/dist/shared/errors.js.map +1 -1
- package/package.json +1 -1
package/CHANGELOG.md
CHANGED
|
@@ -1,3 +1,17 @@
|
|
|
1
|
+
# [1.10.0-beta.25](https://github.com/agnostack/next-shopify/compare/v1.10.0-beta.24...v1.10.0-beta.25) (2023-07-10)
|
|
2
|
+
|
|
3
|
+
|
|
4
|
+
### Bug Fixes
|
|
5
|
+
|
|
6
|
+
* prepareHeaders ([fa3f8b1](https://github.com/agnostack/next-shopify/commit/fa3f8b10cceedab716abc822e7421f4fe9786061))
|
|
7
|
+
|
|
8
|
+
# [1.10.0-beta.24](https://github.com/agnostack/next-shopify/compare/v1.10.0-beta.23...v1.10.0-beta.24) (2023-07-10)
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
### Bug Fixes
|
|
12
|
+
|
|
13
|
+
* prepareHeaders ([4416cf6](https://github.com/agnostack/next-shopify/commit/4416cf6c000acd719ba6fecfe03802e17742fa34))
|
|
14
|
+
|
|
1
15
|
# [1.10.0-beta.23](https://github.com/agnostack/next-shopify/compare/v1.10.0-beta.22...v1.10.0-beta.23) (2023-07-10)
|
|
2
16
|
|
|
3
17
|
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"proxy.d.ts","sourceRoot":"","sources":["../../../../src/lib/handlers/api/proxy.js"],"names":[],"mappings":"AAgCO,
|
|
1
|
+
{"version":3,"file":"proxy.d.ts","sourceRoot":"","sources":["../../../../src/lib/handlers/api/proxy.js"],"names":[],"mappings":"AAgCO,sHA6IN"}
|
|
@@ -5,7 +5,6 @@ const tslib_1 = require("tslib");
|
|
|
5
5
|
/* eslint-disable @typescript-eslint/no-unused-vars */
|
|
6
6
|
const nextjs_cors_1 = tslib_1.__importDefault(require("nextjs-cors"));
|
|
7
7
|
const http_proxy_1 = tslib_1.__importDefault(require("http-proxy"));
|
|
8
|
-
const jsonwebtoken_1 = require("jsonwebtoken");
|
|
9
8
|
const utils_1 = require("../../utils");
|
|
10
9
|
const shared_1 = require("../../../shared");
|
|
11
10
|
const PROXY_TIMEOUT = 6000; // NOTE: 6 seconds
|
|
@@ -21,7 +20,6 @@ const handleProxy = (serverRuntimeConfig, config) => (req, res, params) => tslib
|
|
|
21
20
|
const { 'x-extension-session': sessionToken, 'x-extension-point': extensionPoint, 'x-shop-domain': shopDomainHeader, 'x-shopify-shop-domain': shopifyShopDomainHeader, 'x-shopify-shop': shopHeader = shopifyShopDomainHeader !== null && shopifyShopDomainHeader !== void 0 ? shopifyShopDomainHeader : shopDomainHeader, 'x-shopify-app-id': appId,
|
|
22
21
|
// 'x-shopify-app-installation-id': appInstallationId,
|
|
23
22
|
} = _headers;
|
|
24
|
-
console.log(`>>> > handleProxy > sessionToken:`, JSON.stringify(sessionToken, null, 2));
|
|
25
23
|
// NOTE: GET requests are not always sending along origin
|
|
26
24
|
if ((0, shared_1.stringEmpty)(origin)) {
|
|
27
25
|
req.headers = Object.assign(Object.assign({}, req.headers), { origin: proxyOrigin || forwardHost });
|
|
@@ -47,59 +45,59 @@ const handleProxy = (serverRuntimeConfig, config) => (req, res, params) => tslib
|
|
|
47
45
|
const _targetUrl = ((0, shared_1.stringEmpty)(targetParam) || targetParam.startsWith('http')) ? targetParam : `${APP_BASE_URL}/${(0, shared_1.removeLeadingSlash)(targetParam)}`;
|
|
48
46
|
const { origin: target, hostname, pathname, search } = (0, shared_1.stringNotEmpty)(_targetUrl) ? new URL(_targetUrl) : {};
|
|
49
47
|
let targetPath = [pathname, search].filter(shared_1.stringNotEmpty).join('');
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
return res.status(400).json({ message: 'Invalid or missing headers.', extensionPoint });
|
|
65
|
-
}
|
|
66
|
-
const isShopifyOriginOrRelative = (0, shared_1.stringNotEmpty)((0, shared_1.ensureString)(path_prefix).startsWith('http')
|
|
67
|
-
? (0, shared_1.sanitizeShop)(new URL(path_prefix).hostname)
|
|
68
|
-
: path_prefix);
|
|
69
|
-
// TODO: confirm if we still need this logic on isShopifyOriginOrRelative
|
|
70
|
-
if (!verifyAppProxySignature(signature, verifiable, isShopifyOriginOrRelative ? APP_CONFIG.apiSecretKey : timestamp)) {
|
|
71
|
-
return res.status(403).json({ message: 'Invalid signature.' });
|
|
72
|
-
}
|
|
73
|
-
// TODO: explore moving this to sessionToken middleware??
|
|
74
|
-
// TODO: verify signature!!!
|
|
75
|
-
if (sessionToken) {
|
|
76
|
-
// NOTE: this does not always contain sid (depending on if calling from appbridge)
|
|
77
|
-
const { decoded, shop: sessionShop, host: sessionHost } = (0, shared_1.decodeShopData)(sessionToken);
|
|
78
|
-
console.log(`>>> > handleProxy > decoded:`, decoded);
|
|
79
|
-
if ((sessionShop !== shop) || (sessionHost !== host)) {
|
|
80
|
-
return res.status(403).json({ message: 'Unauthorized shop or host.' });
|
|
48
|
+
let headers;
|
|
49
|
+
try {
|
|
50
|
+
const safelistedTarget = (0, shared_1.matchHostname)(hostname, Object.assign({ [new URL(APP_BASE_URL).hostname]: {
|
|
51
|
+
// HMMM: can we generate our own session token so we can not have to tell handleGraph/Rest to behave as offline?
|
|
52
|
+
// headers: {
|
|
53
|
+
// Authorization: 'Bearer {{setting.zendesk.token}}',
|
|
54
|
+
// },
|
|
55
|
+
params: {
|
|
56
|
+
shop,
|
|
57
|
+
host,
|
|
58
|
+
},
|
|
59
|
+
} }, TARGET_SAFELIST));
|
|
60
|
+
if ((0, shared_1.stringEmpty)(targetPath) || (safelistedTarget == undefined)) {
|
|
61
|
+
return res.status(407).json({ message: 'Unproxyable target' });
|
|
81
62
|
}
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
const
|
|
86
|
-
|
|
63
|
+
if (!shop || !host || !extensionPoint || !signature || !proxyEncoded) {
|
|
64
|
+
return res.status(400).json({ message: 'Invalid or missing headers', extensionPoint });
|
|
65
|
+
}
|
|
66
|
+
const isShopifyOriginOrRelative = (0, shared_1.stringNotEmpty)((0, shared_1.ensureString)(path_prefix).startsWith('http')
|
|
67
|
+
? (0, shared_1.sanitizeShop)(new URL(path_prefix).hostname)
|
|
68
|
+
: path_prefix);
|
|
69
|
+
// TODO: confirm if we still need this logic on isShopifyOriginOrRelative
|
|
70
|
+
if (!verifyAppProxySignature(signature, verifiable, isShopifyOriginOrRelative ? APP_CONFIG.apiSecretKey : timestamp)) {
|
|
71
|
+
return res.status(403).json({ message: 'Invalid signature' });
|
|
72
|
+
}
|
|
73
|
+
const _getVerifiedSessionData = (0, utils_1.getVerifiedSessionData)(serverRuntimeConfig);
|
|
74
|
+
_getVerifiedSessionData(sessionToken, { shop, host }).catch((_error) => {
|
|
75
|
+
if (_error instanceof shared_1.ShopifySessionInvalidError) {
|
|
76
|
+
return res.status(403).json({ message: _error.message });
|
|
77
|
+
}
|
|
78
|
+
throw _error;
|
|
79
|
+
});
|
|
80
|
+
const { headers: targetHeaders, params: targetParams } = (0, shared_1.ensureObject)(safelistedTarget);
|
|
81
|
+
if ((0, shared_1.objectNotEmpty)(targetParams)) {
|
|
82
|
+
targetPath = (0, shared_1.appendQuery)(targetPath, new URLSearchParams(targetParams).toString());
|
|
83
|
+
}
|
|
84
|
+
const _prepareHeaders = (0, utils_1.prepareHeaders)(serverRuntimeConfig);
|
|
85
|
+
headers = yield _prepareHeaders({
|
|
86
|
+
generateReplacements,
|
|
87
|
+
shop,
|
|
88
|
+
appId,
|
|
89
|
+
headers: Object.assign(Object.assign({}, _headers), targetHeaders),
|
|
90
|
+
});
|
|
87
91
|
}
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
targetPath = (0, shared_1.appendQuery)(targetPath, new URLSearchParams(targetParams).toString());
|
|
92
|
+
catch (error) {
|
|
93
|
+
return res.status(500).json({ message: 'Error handling proxy request', targetPath });
|
|
91
94
|
}
|
|
92
|
-
const _prepareHeaders = (0, utils_1.prepareHeaders)(serverRuntimeConfig);
|
|
93
|
-
const headers = yield _prepareHeaders({
|
|
94
|
-
generateReplacements,
|
|
95
|
-
shop,
|
|
96
|
-
appId,
|
|
97
|
-
headers: Object.assign(Object.assign({}, _headers), targetHeaders),
|
|
98
|
-
});
|
|
99
95
|
const proxy = http_proxy_1.default.createProxy();
|
|
100
96
|
return new Promise((_resolve, reject) => {
|
|
101
97
|
req.url = targetPath;
|
|
102
|
-
|
|
98
|
+
if (headers) {
|
|
99
|
+
req.headers = headers;
|
|
100
|
+
}
|
|
103
101
|
proxy.once('error', reject);
|
|
104
102
|
proxy.web(req, res, {
|
|
105
103
|
target,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"proxy.js","sourceRoot":"","sources":["../../../../src/lib/handlers/api/proxy.js"],"names":[],"mappings":";;;;AAAA,sDAAsD;AACtD,sEAAkC;AAClC,oEAAkC;
|
|
1
|
+
{"version":3,"file":"proxy.js","sourceRoot":"","sources":["../../../../src/lib/handlers/api/proxy.js"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"token.d.ts","sourceRoot":"","sources":["../../../../src/lib/handlers/api/token.js"],"names":[],"mappings":"AAWO;;
|
|
1
|
+
{"version":3,"file":"token.d.ts","sourceRoot":"","sources":["../../../../src/lib/handlers/api/token.js"],"names":[],"mappings":"AAWO;;sDAqEN"}
|
|
@@ -12,42 +12,46 @@ const shared_1 = require("../../../shared");
|
|
|
12
12
|
// NOTE: typically handling: "/api/token"
|
|
13
13
|
const handleSessionToken = ({ APP_CONFIG }, config) => (req, res) => tslib_1.__awaiter(void 0, void 0, void 0, function* () {
|
|
14
14
|
var _a, _b;
|
|
15
|
-
console.log(`>>> > handleSessionToken > config:`, config);
|
|
16
15
|
const { host } = (_a = req.query) !== null && _a !== void 0 ? _a : {};
|
|
17
16
|
const { 'x-shop-domain': shopDomain, 'x-shopify-shop-domain': shopifyShopDomain, 'x-shopify-shop': shop = shopifyShopDomain !== null && shopifyShopDomain !== void 0 ? shopifyShopDomain : shopDomain, } = (_b = req.headers) !== null && _b !== void 0 ? _b : {};
|
|
18
17
|
// TODO: un-btoa the host and check??
|
|
19
18
|
if ((0, shared_1.stringEmpty)(shop) || (0, shared_1.stringEmpty)(host)) {
|
|
20
19
|
return res.status(412).json({ message: 'Missing required param' });
|
|
21
20
|
}
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
dest
|
|
21
|
+
let token;
|
|
22
|
+
try {
|
|
23
|
+
// NOTE raw request body is required for validation
|
|
24
|
+
const _rawBody = yield (0, raw_body_1.default)(req);
|
|
25
|
+
const rawBody = _rawBody.toString();
|
|
26
|
+
const _c = JSON.parse(rawBody), { sub, aud = APP_CONFIG.apiKey } = _c, _body = tslib_1.__rest(_c, ["sub", "aud"]);
|
|
27
|
+
let { dest, iss, sid, jti } = _body, body = tslib_1.__rest(_body, ["dest", "iss", "sid", "jti"]);
|
|
28
|
+
if ((0, shared_1.stringEmpty)(dest)) {
|
|
29
|
+
dest = shop;
|
|
30
|
+
}
|
|
31
|
+
if ((0, shared_1.stringEmpty)(iss)) {
|
|
32
|
+
iss = (0, js_base64_1.decode)(host);
|
|
33
|
+
}
|
|
34
|
+
if ((0, next_plugins_1.stringNotEmpty)(sid)) {
|
|
35
|
+
sid = (0, uuid_1.v4)();
|
|
36
|
+
}
|
|
37
|
+
if ((0, shared_1.stringEmpty)(jti)) {
|
|
38
|
+
jti = (0, uuid_1.v4)();
|
|
39
|
+
sid = `${sid}.${jti}`;
|
|
40
|
+
}
|
|
41
|
+
const payload = Object.assign(Object.assign({ shop,
|
|
42
|
+
host,
|
|
43
|
+
iss,
|
|
44
|
+
dest,
|
|
45
|
+
jti,
|
|
46
|
+
sid,
|
|
47
|
+
aud }, sub && { sub }), body);
|
|
48
|
+
const hmac = (0, utils_1.generateHMAC)((0, shared_1.objectToSortedString)(payload), APP_CONFIG.apiSecretKey);
|
|
49
|
+
token = (0, jsonwebtoken_1.sign)(payload, hmac, config);
|
|
30
50
|
}
|
|
31
|
-
|
|
32
|
-
|
|
51
|
+
catch (error) {
|
|
52
|
+
console.error('Error generating session token', error);
|
|
53
|
+
return res.status(500).json({ message: 'Error generating session token' });
|
|
33
54
|
}
|
|
34
|
-
if ((0, next_plugins_1.stringNotEmpty)(sid)) {
|
|
35
|
-
sid = (0, uuid_1.v4)();
|
|
36
|
-
}
|
|
37
|
-
if ((0, shared_1.stringEmpty)(jti)) {
|
|
38
|
-
jti = (0, uuid_1.v4)();
|
|
39
|
-
sid = `${sid}.${jti}`;
|
|
40
|
-
}
|
|
41
|
-
const payload = Object.assign(Object.assign({ shop,
|
|
42
|
-
host,
|
|
43
|
-
iss,
|
|
44
|
-
dest,
|
|
45
|
-
jti,
|
|
46
|
-
sid,
|
|
47
|
-
aud }, sub && { sub }), body);
|
|
48
|
-
// HMMM: not sure which key (pub vs private) to use here??
|
|
49
|
-
const hmac = (0, utils_1.generateHMAC)((0, shared_1.objectToSortedString)(payload), APP_CONFIG.apiSecretKey);
|
|
50
|
-
const token = (0, jsonwebtoken_1.sign)(payload, hmac, config);
|
|
51
55
|
return res.status(200).json({ token });
|
|
52
56
|
});
|
|
53
57
|
exports.handleSessionToken = handleSessionToken;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"token.js","sourceRoot":"","sources":["../../../../src/lib/handlers/api/token.js"],"names":[],"mappings":";;;;AAAA,gEAAiC;AACjC,yCAAkC;AAClC,+CAAmC;AACnC,+BAAmC;AAEnC,0DAAwD;AAExD,uCAA0C;AAC1C,4CAAmE;AAEnE,yCAAyC;AAClC,MAAM,kBAAkB,GAAG,CAAC,EAAE,UAAU,EAAE,EAAE,MAAM,EAAE,EAAE,CAAC,CAAO,GAAG,EAAE,GAAG,EAAE,EAAE;;IAC/E,
|
|
1
|
+
{"version":3,"file":"token.js","sourceRoot":"","sources":["../../../../src/lib/handlers/api/token.js"],"names":[],"mappings":";;;;AAAA,gEAAiC;AACjC,yCAAkC;AAClC,+CAAmC;AACnC,+BAAmC;AAEnC,0DAAwD;AAExD,uCAA0C;AAC1C,4CAAmE;AAEnE,yCAAyC;AAClC,MAAM,kBAAkB,GAAG,CAAC,EAAE,UAAU,EAAE,EAAE,MAAM,EAAE,EAAE,CAAC,CAAO,GAAG,EAAE,GAAG,EAAE,EAAE;;IAC/E,MAAM,EAAE,IAAI,EAAE,GAAG,MAAA,GAAG,CAAC,KAAK,mCAAI,EAAE,CAAA;IAChC,MAAM,EACJ,eAAe,EAAE,UAAU,EAC3B,uBAAuB,EAAE,iBAAiB,EAC1C,gBAAgB,EAAE,IAAI,GAAG,iBAAiB,aAAjB,iBAAiB,cAAjB,iBAAiB,GAAI,UAAU,GACzD,GAAG,MAAA,GAAG,CAAC,OAAO,mCAAI,EAAE,CAAA;IAErB,qCAAqC;IACrC,IAAI,IAAA,oBAAW,EAAC,IAAI,CAAC,IAAI,IAAA,oBAAW,EAAC,IAAI,CAAC,EAAE;QAC1C,OAAO,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,wBAAwB,EAAE,CAAC,CAAA;KACnE;IAED,IAAI,KAAK,CAAA;IACT,IAAI;QACF,mDAAmD;QACnD,MAAM,QAAQ,GAAG,MAAM,IAAA,kBAAU,EAAC,GAAG,CAAC,CAAA;QACtC,MAAM,OAAO,GAAG,QAAQ,CAAC,QAAQ,EAAE,CAAA;QACnC,MAAM,KAIF,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,EAJjB,EACJ,GAAG,EACH,GAAG,GAAG,UAAU,CAAC,MAAM,OAEF,EADlB,KAAK,sBAHJ,cAIL,CAAsB,CAAA;QAEvB,IAAI,EACF,IAAI,EACJ,GAAG,EACH,GAAG,EACH,GAAG,KAED,KAAK,EADJ,IAAI,kBACL,KAAK,EANL,6BAMH,CAAQ,CAAA;QAET,IAAI,IAAA,oBAAW,EAAC,IAAI,CAAC,EAAE;YACrB,IAAI,GAAG,IAAI,CAAA;SACZ;QAED,IAAI,IAAA,oBAAW,EAAC,GAAG,CAAC,EAAE;YACpB,GAAG,GAAG,IAAA,kBAAM,EAAC,IAAI,CAAC,CAAA;SACnB;QAED,IAAI,IAAA,6BAAc,EAAC,GAAG,CAAC,EAAE;YACvB,GAAG,GAAG,IAAA,SAAM,GAAE,CAAA;SACf;QAED,IAAI,IAAA,oBAAW,EAAC,GAAG,CAAC,EAAE;YACpB,GAAG,GAAG,IAAA,SAAM,GAAE,CAAA;YACd,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,EAAE,CAAA;SACtB;QAED,MAAM,OAAO,iCACX,IAAI;YACJ,IAAI;YACJ,GAAG;YACH,IAAI;YACJ,GAAG;YACH,GAAG;YACH,GAAG,IACA,GAAG,IAAI,EAAE,GAAG,EAAE,GACd,IAAI,CACR,CAAA;QAED,MAAM,IAAI,GAAG,IAAA,oBAAY,EAAC,IAAA,6BAAoB,EAAC,OAAO,CAAC,EAAE,UAAU,CAAC,YAAY,CAAC,CAAA;QACjF,KAAK,GAAG,IAAA,mBAAI,EAAC,OAAO,EAAE,IAAI,EAAE,MAAM,CAAC,CAAA;KACpC;IAAC,OAAO,KAAK,EAAE;QACd,OAAO,CAAC,KAAK,CAAC,gCAAgC,EAAE,KAAK,CAAC,CAAA;QACtD,OAAO,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,gCAAgC,EAAE,CAAC,CAAA;KAC3E;IAED,OAAO,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,CAAC,CAAA;AACxC,CAAC,CAAA,CAAA;AArEY,QAAA,kBAAkB,sBAqE9B"}
|
package/dist/lib/utils/index.js
CHANGED
|
@@ -8,4 +8,5 @@ tslib_1.__exportStar(require("./headers"), exports);
|
|
|
8
8
|
tslib_1.__exportStar(require("./session"), exports);
|
|
9
9
|
tslib_1.__exportStar(require("./shopify"), exports);
|
|
10
10
|
tslib_1.__exportStar(require("./shopify-api-js/oauth"), exports);
|
|
11
|
+
tslib_1.__exportStar(require("./token"), exports);
|
|
11
12
|
//# sourceMappingURL=index.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/lib/utils/index.js"],"names":[],"mappings":";;;AAAA,oDAAyB;AACzB,mDAAwB;AACxB,qDAA0B;AAC1B,oDAAyB;AACzB,oDAAyB;AACzB,oDAAyB;AACzB,iEAAsC"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/lib/utils/index.js"],"names":[],"mappings":";;;AAAA,oDAAyB;AACzB,mDAAwB;AACxB,qDAA0B;AAC1B,oDAAyB;AACzB,oDAAyB;AACzB,oDAAyB;AACzB,iEAAsC;AACtC,kDAAuB"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
export function getVerifiedSessionData(serverRuntimeConfig: any): (sessionToken: any, { shop, host }: {
|
|
2
|
+
shop: any;
|
|
3
|
+
host: any;
|
|
4
|
+
}) => Promise<{
|
|
5
|
+
dest?: undefined;
|
|
6
|
+
sid?: undefined;
|
|
7
|
+
shop?: undefined;
|
|
8
|
+
host?: undefined;
|
|
9
|
+
store_name?: undefined;
|
|
10
|
+
} | {
|
|
11
|
+
dest: any;
|
|
12
|
+
sid: any;
|
|
13
|
+
shop: string;
|
|
14
|
+
host: any;
|
|
15
|
+
store_name: string;
|
|
16
|
+
}>;
|
|
17
|
+
//# sourceMappingURL=token.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"token.d.ts","sourceRoot":"","sources":["../../../src/lib/utils/token.js"],"names":[],"mappings":"AASO;;;;;;;;;;;;;;;GA2BN"}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.getVerifiedSessionData = void 0;
|
|
4
|
+
const tslib_1 = require("tslib");
|
|
5
|
+
const jsonwebtoken_1 = require("jsonwebtoken");
|
|
6
|
+
const shared_1 = require("../../shared");
|
|
7
|
+
const crypto_1 = require("./crypto");
|
|
8
|
+
const getVerifiedSessionData = (serverRuntimeConfig) => (sessionToken, { shop, host }) => tslib_1.__awaiter(void 0, void 0, void 0, function* () {
|
|
9
|
+
const { APP_CONFIG } = serverRuntimeConfig;
|
|
10
|
+
let data;
|
|
11
|
+
try {
|
|
12
|
+
// NOTE: this does not always contain sid (depending on if calling from appbridge)
|
|
13
|
+
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
|
14
|
+
const _a = (0, shared_1.decodeShopData)(sessionToken), { decoded, token } = _a, _data = tslib_1.__rest(_a, ["decoded", "token"]);
|
|
15
|
+
const { shop: sessionShop, host: sessionHost } = _data;
|
|
16
|
+
data = _data;
|
|
17
|
+
if ((sessionShop !== shop) || (sessionHost !== host)) {
|
|
18
|
+
throw new shared_1.ShopifySessionInvalidError('Unauthorized shop or host');
|
|
19
|
+
}
|
|
20
|
+
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
|
21
|
+
const { iat, nbf, exp } = decoded, verifiable = tslib_1.__rest(decoded, ["iat", "nbf", "exp"]);
|
|
22
|
+
const hmac = (0, crypto_1.generateHMAC)((0, shared_1.objectToSortedString)(verifiable), APP_CONFIG.apiSecretKey);
|
|
23
|
+
const verified = (0, jsonwebtoken_1.verify)(sessionToken, hmac);
|
|
24
|
+
if (verified == undefined) {
|
|
25
|
+
throw new shared_1.ShopifySessionInvalidError('Error verifying session token');
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
catch (_error) {
|
|
29
|
+
console.error('Error verifying session token', _error);
|
|
30
|
+
throw new shared_1.ShopifySessionInvalidError('Error verifying session token');
|
|
31
|
+
}
|
|
32
|
+
return data;
|
|
33
|
+
});
|
|
34
|
+
exports.getVerifiedSessionData = getVerifiedSessionData;
|
|
35
|
+
//# sourceMappingURL=token.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"token.js","sourceRoot":"","sources":["../../../src/lib/utils/token.js"],"names":[],"mappings":";;;;AAAA,+CAAqC;AAErC,yCAIqB;AACrB,qCAAuC;AAEhC,MAAM,sBAAsB,GAAG,CAAC,mBAAmB,EAAE,EAAE,CAAC,CAAO,YAAY,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,EAAE,EAAE;IACpG,MAAM,EAAC,UAAU,EAAE,GAAG,mBAAmB,CAAA;IACzC,IAAI,IAAI,CAAA;IACR,IAAI;QACF,kFAAkF;QAClF,6DAA6D;QAC7D,MAAM,KAA+B,IAAA,uBAAc,EAAC,YAAY,CAAC,EAA3D,EAAE,OAAO,EAAE,KAAK,OAA2C,EAAtC,KAAK,sBAA1B,oBAA4B,CAA+B,CAAA;QACjE,MAAM,EAAE,IAAI,EAAE,WAAW,EAAE,IAAI,EAAE,WAAW,EAAE,GAAG,KAAK,CAAA;QACtD,IAAI,GAAG,KAAK,CAAA;QAEZ,IAAI,CAAC,WAAW,KAAK,IAAI,CAAC,IAAI,CAAC,WAAW,KAAK,IAAI,CAAC,EAAE;YACpD,MAAM,IAAI,mCAA0B,CAAC,2BAA2B,CAAC,CAAA;SAClE;QAED,6DAA6D;QAC7D,MAAM,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,KAAoB,OAAO,EAAtB,UAAU,kBAAK,OAAO,EAA1C,qBAAgC,CAAU,CAAA;QAChD,MAAM,IAAI,GAAG,IAAA,qBAAY,EAAC,IAAA,6BAAoB,EAAC,UAAU,CAAC,EAAE,UAAU,CAAC,YAAY,CAAC,CAAA;QAEpF,MAAM,QAAQ,GAAG,IAAA,qBAAM,EAAC,YAAY,EAAE,IAAI,CAAC,CAAA;QAC3C,IAAI,QAAQ,IAAI,SAAS,EAAE;YACzB,MAAM,IAAI,mCAA0B,CAAC,+BAA+B,CAAC,CAAA;SACtE;KACF;IAAC,OAAO,MAAM,EAAE;QACf,OAAO,CAAC,KAAK,CAAC,+BAA+B,EAAE,MAAM,CAAC,CAAA;QACtD,MAAM,IAAI,mCAA0B,CAAC,+BAA+B,CAAC,CAAA;KACtE;IACD,OAAO,IAAI,CAAA;AACb,CAAC,CAAA,CAAA;AA3BY,QAAA,sBAAsB,0BA2BlC"}
|
package/dist/shared/errors.d.ts
CHANGED
|
@@ -4,6 +4,8 @@ export class ShopifyAuthenticationError extends Error {
|
|
|
4
4
|
}
|
|
5
5
|
export class ShopifySessionAuthenticationError extends ShopifyAuthenticationError {
|
|
6
6
|
}
|
|
7
|
+
export class ShopifySessionInvalidError extends ShopifySessionAuthenticationError {
|
|
8
|
+
}
|
|
7
9
|
export class ShopifySessionMissingError extends ShopifySessionAuthenticationError {
|
|
8
10
|
}
|
|
9
11
|
export namespace ERROR_CODES {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../../src/shared/errors.js"],"names":[],"mappings":"AAAA;IACE,qCAKC;IAHC,UAAgB;CAInB;AAED;CAMC;AAED;CAMC"}
|
|
1
|
+
{"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../../src/shared/errors.js"],"names":[],"mappings":"AAAA;IACE,qCAKC;IAHC,UAAgB;CAInB;AAED;CAMC;AAED;CAMC;AAED;CAMC"}
|
package/dist/shared/errors.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.ERROR_CODES = exports.ShopifySessionMissingError = exports.ShopifySessionAuthenticationError = exports.ShopifyAuthenticationError = void 0;
|
|
3
|
+
exports.ERROR_CODES = exports.ShopifySessionMissingError = exports.ShopifySessionInvalidError = exports.ShopifySessionAuthenticationError = exports.ShopifyAuthenticationError = void 0;
|
|
4
4
|
class ShopifyAuthenticationError extends Error {
|
|
5
5
|
constructor(message, data) {
|
|
6
6
|
super(message);
|
|
@@ -18,6 +18,14 @@ class ShopifySessionAuthenticationError extends ShopifyAuthenticationError {
|
|
|
18
18
|
}
|
|
19
19
|
}
|
|
20
20
|
exports.ShopifySessionAuthenticationError = ShopifySessionAuthenticationError;
|
|
21
|
+
class ShopifySessionInvalidError extends ShopifySessionAuthenticationError {
|
|
22
|
+
constructor(message, data) {
|
|
23
|
+
super(message, data);
|
|
24
|
+
this.name = 'ShopifySessionInvalidError';
|
|
25
|
+
Object.setPrototypeOf(this, ShopifySessionInvalidError.prototype);
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
exports.ShopifySessionInvalidError = ShopifySessionInvalidError;
|
|
21
29
|
class ShopifySessionMissingError extends ShopifySessionAuthenticationError {
|
|
22
30
|
constructor(message, data) {
|
|
23
31
|
super(message, data);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"errors.js","sourceRoot":"","sources":["../../src/shared/errors.js"],"names":[],"mappings":";;;AAAA,MAAa,0BAA2B,SAAQ,KAAK;IACnD,YAAY,OAAO,EAAE,IAAI;QACvB,KAAK,CAAC,OAAO,CAAC,CAAA;QACd,IAAI,CAAC,IAAI,GAAG,IAAI,CAAA;QAChB,IAAI,CAAC,IAAI,GAAG,4BAA4B,CAAA;QACxC,MAAM,CAAC,cAAc,CAAC,IAAI,EAAE,0BAA0B,CAAC,SAAS,CAAC,CAAA;IACnE,CAAC;CACF;AAPD,gEAOC;AAED,MAAa,iCAAkC,SAAQ,0BAA0B;IAC/E,YAAY,OAAO,EAAE,IAAI;QACvB,KAAK,CAAC,OAAO,EAAE,IAAI,CAAC,CAAA;QACpB,IAAI,CAAC,IAAI,GAAG,mCAAmC,CAAA;QAC/C,MAAM,CAAC,cAAc,CAAC,IAAI,EAAE,iCAAiC,CAAC,SAAS,CAAC,CAAA;IAC1E,CAAC;CACF;AAND,8EAMC;AAED,MAAa,0BAA2B,SAAQ,iCAAiC;IAC/E,YAAY,OAAO,EAAE,IAAI;QACvB,KAAK,CAAC,OAAO,EAAE,IAAI,CAAC,CAAA;QACpB,IAAI,CAAC,IAAI,GAAG,4BAA4B,CAAA;QACxC,MAAM,CAAC,cAAc,CAAC,IAAI,EAAE,0BAA0B,CAAC,SAAS,CAAC,CAAA;IACnE,CAAC;CACF;AAND,gEAMC;AAEY,QAAA,WAAW,GAAG;IACzB,QAAQ,EAAE,gBAAgB;IAC1B,KAAK,EAAE,aAAa;IACpB,OAAO,EAAE,eAAe;IACxB,KAAK,EAAE,aAAa;IACpB,YAAY,EAAE,kBAAkB;IAChC,gBAAgB,EAAE,kBAAkB;CACrC,CAAA"}
|
|
1
|
+
{"version":3,"file":"errors.js","sourceRoot":"","sources":["../../src/shared/errors.js"],"names":[],"mappings":";;;AAAA,MAAa,0BAA2B,SAAQ,KAAK;IACnD,YAAY,OAAO,EAAE,IAAI;QACvB,KAAK,CAAC,OAAO,CAAC,CAAA;QACd,IAAI,CAAC,IAAI,GAAG,IAAI,CAAA;QAChB,IAAI,CAAC,IAAI,GAAG,4BAA4B,CAAA;QACxC,MAAM,CAAC,cAAc,CAAC,IAAI,EAAE,0BAA0B,CAAC,SAAS,CAAC,CAAA;IACnE,CAAC;CACF;AAPD,gEAOC;AAED,MAAa,iCAAkC,SAAQ,0BAA0B;IAC/E,YAAY,OAAO,EAAE,IAAI;QACvB,KAAK,CAAC,OAAO,EAAE,IAAI,CAAC,CAAA;QACpB,IAAI,CAAC,IAAI,GAAG,mCAAmC,CAAA;QAC/C,MAAM,CAAC,cAAc,CAAC,IAAI,EAAE,iCAAiC,CAAC,SAAS,CAAC,CAAA;IAC1E,CAAC;CACF;AAND,8EAMC;AAED,MAAa,0BAA2B,SAAQ,iCAAiC;IAC/E,YAAY,OAAO,EAAE,IAAI;QACvB,KAAK,CAAC,OAAO,EAAE,IAAI,CAAC,CAAA;QACpB,IAAI,CAAC,IAAI,GAAG,4BAA4B,CAAA;QACxC,MAAM,CAAC,cAAc,CAAC,IAAI,EAAE,0BAA0B,CAAC,SAAS,CAAC,CAAA;IACnE,CAAC;CACF;AAND,gEAMC;AAED,MAAa,0BAA2B,SAAQ,iCAAiC;IAC/E,YAAY,OAAO,EAAE,IAAI;QACvB,KAAK,CAAC,OAAO,EAAE,IAAI,CAAC,CAAA;QACpB,IAAI,CAAC,IAAI,GAAG,4BAA4B,CAAA;QACxC,MAAM,CAAC,cAAc,CAAC,IAAI,EAAE,0BAA0B,CAAC,SAAS,CAAC,CAAA;IACnE,CAAC;CACF;AAND,gEAMC;AAEY,QAAA,WAAW,GAAG;IACzB,QAAQ,EAAE,gBAAgB;IAC1B,KAAK,EAAE,aAAa;IACpB,OAAO,EAAE,eAAe;IACxB,KAAK,EAAE,aAAa;IACpB,YAAY,EAAE,kBAAkB;IAChC,gBAAgB,EAAE,kBAAkB;CACrC,CAAA"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@agnostack/next-shopify",
|
|
3
|
-
"version": "1.10.0-beta.
|
|
3
|
+
"version": "1.10.0-beta.25",
|
|
4
4
|
"author": "agnoStack Dev <developers@agnostack.com> (https://agnostack.com)",
|
|
5
5
|
"owner": "agnoStack",
|
|
6
6
|
"description": "Please contact agnoStack via info@agnostack.com for any questions",
|