@blocklet/sdk 1.17.2-beta-20251114-122922-4319f1ac → 1.17.3-beta-20251117-102849-8103f298
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/lib/middlewares/csrf.js +13 -0
- package/lib/util/service-api.js +0 -1
- package/lib/util/verify-sign.d.ts +8 -1
- package/lib/util/verify-sign.js +8 -21
- package/lib/version.d.ts +1 -1
- package/lib/version.js +1 -1
- package/package.json +20 -20
package/lib/middlewares/csrf.js
CHANGED
|
@@ -6,9 +6,12 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
6
6
|
exports.csrf = csrf;
|
|
7
7
|
const isEmpty_1 = __importDefault(require("lodash/isEmpty"));
|
|
8
8
|
const joi_1 = __importDefault(require("joi"));
|
|
9
|
+
const debug_1 = __importDefault(require("debug"));
|
|
10
|
+
const jwt_decode_1 = __importDefault(require("jwt-decode"));
|
|
9
11
|
const csrf_1 = require("../util/csrf");
|
|
10
12
|
const wallet_1 = require("../util/wallet");
|
|
11
13
|
const config_1 = __importDefault(require("../config"));
|
|
14
|
+
const debug = (0, debug_1.default)('@blocklet/sdk:middleware:csrf');
|
|
12
15
|
function printCookieParserNotInstalledWarning() {
|
|
13
16
|
config_1.default.logger.warn('cookie-parser middleware is required for the csrf middleware to work properly.');
|
|
14
17
|
}
|
|
@@ -29,6 +32,12 @@ function defaultGenerateToken(req, res) {
|
|
|
29
32
|
const newCsrfToken = (0, csrf_1.sign)((0, csrf_1.getCsrfSecret)(), req.cookies.login_token);
|
|
30
33
|
const oldCsrfToken = req.cookies['x-csrf-token'];
|
|
31
34
|
if (newCsrfToken !== oldCsrfToken) {
|
|
35
|
+
debug('defaultGenerateToken.createCsrfToken', {
|
|
36
|
+
newCsrfToken,
|
|
37
|
+
oldCsrfToken,
|
|
38
|
+
loginTokenPart: req.cookies.login_token.slice(-32),
|
|
39
|
+
loginTokenDecoded: (0, jwt_decode_1.default)(req.cookies.login_token),
|
|
40
|
+
});
|
|
32
41
|
res.cookie('x-csrf-token', newCsrfToken, {
|
|
33
42
|
sameSite: 'strict',
|
|
34
43
|
secure: true,
|
|
@@ -52,12 +61,16 @@ function defaultVerifyToken(req) {
|
|
|
52
61
|
config_1.default.logger.warn('Invalid request: csrf token mismatch', {
|
|
53
62
|
csrfTokenFromReq: req.cookies['x-csrf-token'],
|
|
54
63
|
csrfTokenFromHeader: req.headers['x-csrf-token'],
|
|
64
|
+
loginTokenPart: req.cookies.login_token.slice(-32),
|
|
65
|
+
loginTokenDecoded: (0, jwt_decode_1.default)(req.cookies.login_token),
|
|
55
66
|
});
|
|
56
67
|
}
|
|
57
68
|
else {
|
|
58
69
|
config_1.default.logger.warn('Invalid request: csrf token not found', {
|
|
59
70
|
csrfTokenFromReq: req.cookies['x-csrf-token'],
|
|
60
71
|
csrfTokenFromHeader: req.headers['x-csrf-token'],
|
|
72
|
+
loginTokenPart: req.cookies.login_token.slice(-32),
|
|
73
|
+
loginTokenDecoded: (0, jwt_decode_1.default)(req.cookies.login_token),
|
|
61
74
|
});
|
|
62
75
|
}
|
|
63
76
|
throw new Error('Invalid request: csrf token mismatch, please refresh the page try again');
|
package/lib/util/service-api.js
CHANGED
|
@@ -38,7 +38,6 @@ axios.interceptors.request.use(async (config) => {
|
|
|
38
38
|
// Compatible with previous version where APP_ASK does not exist
|
|
39
39
|
appSk: process.env.BLOCKLET_APP_ASK || process.env.BLOCKLET_APP_SK,
|
|
40
40
|
});
|
|
41
|
-
// 同时对 post 和 get 参数做签名,确保同时支持 post get 请求的校验
|
|
42
41
|
// 签名使用的是当前 blocklet 的 appSk,固命名为 x-blocklet-sig,以后可做统一使用
|
|
43
42
|
config.headers['x-blocklet-sig'] = sig;
|
|
44
43
|
config.headers['x-blocklet-sig-iat'] = iat;
|
|
@@ -13,7 +13,14 @@ declare const sign: (data: object, { type, appSk }?: SignOptions) => Promise<str
|
|
|
13
13
|
type SignType = 'component' | 'blocklet';
|
|
14
14
|
declare const getVerifyData: (req: Request, type?: SignType) => {
|
|
15
15
|
sig: string;
|
|
16
|
-
data:
|
|
16
|
+
data: {
|
|
17
|
+
iat: number;
|
|
18
|
+
exp: number;
|
|
19
|
+
body: any;
|
|
20
|
+
query: any;
|
|
21
|
+
method: string;
|
|
22
|
+
url: string;
|
|
23
|
+
};
|
|
17
24
|
sigVersion: string;
|
|
18
25
|
sigPk: string;
|
|
19
26
|
};
|
package/lib/util/verify-sign.js
CHANGED
|
@@ -11,7 +11,6 @@ const merge_1 = __importDefault(require("lodash/merge"));
|
|
|
11
11
|
const json_stable_stringify_1 = __importDefault(require("json-stable-stringify"));
|
|
12
12
|
const ufo_1 = require("ufo");
|
|
13
13
|
const constant_1 = require("@blocklet/constant");
|
|
14
|
-
const semver_1 = __importDefault(require("semver"));
|
|
15
14
|
const qs_1 = __importDefault(require("qs"));
|
|
16
15
|
const wallet_1 = require("../wallet");
|
|
17
16
|
const { getPkWallet } = wallet_1.getWallet;
|
|
@@ -50,38 +49,26 @@ const getLatestFn = ({ iat, exp, body, query, method, url, }) => {
|
|
|
50
49
|
if (exp < now) {
|
|
51
50
|
throw new Error('expired sig');
|
|
52
51
|
}
|
|
53
|
-
const
|
|
52
|
+
const parsedUrl = (0, ufo_1.parseURL)(url);
|
|
54
53
|
const data = {
|
|
55
54
|
iat,
|
|
56
55
|
exp,
|
|
57
56
|
body: body ?? {},
|
|
58
|
-
query: (0, merge_1.default)(qs_1.default.parse(
|
|
57
|
+
query: (0, merge_1.default)(qs_1.default.parse(parsedUrl.search.slice(1)), query ?? {}),
|
|
59
58
|
method: method.toLowerCase(),
|
|
60
|
-
url:
|
|
59
|
+
url: parsedUrl.pathname,
|
|
61
60
|
};
|
|
62
61
|
return data;
|
|
63
62
|
};
|
|
64
|
-
const getLegacyFn = ({ body, query, type = 'component' }) => {
|
|
65
|
-
// NOTICE: legacy 保持和原来一样,不做 parse 和 stringify 的处理了
|
|
66
|
-
const data = body ?? {};
|
|
67
|
-
const params = query ?? {};
|
|
68
|
-
if (type === 'blocklet') {
|
|
69
|
-
return { data, params };
|
|
70
|
-
}
|
|
71
|
-
return data;
|
|
72
|
-
};
|
|
73
63
|
const getVerifyData = (req, type = 'component') => {
|
|
74
64
|
const sig = req.get(`x-${type}-sig`);
|
|
75
65
|
const sigPk = req.get(`x-${type}-sig-pk`);
|
|
76
|
-
const sigVersion = req.get(`x-${type}-sig-version`)
|
|
66
|
+
const sigVersion = req.get(`x-${type}-sig-version`);
|
|
77
67
|
const iat = Number(req.get(`x-${type}-sig-iat`));
|
|
78
68
|
const exp = Number(req.get(`x-${type}-sig-exp`));
|
|
79
69
|
// NOTICE: 从 req 拿到的数据是经过 axios 和 JSON.parse 处理过的,所以 body 和 query 不需要再处理了
|
|
80
70
|
const { body, method, originalUrl: url, query } = req;
|
|
81
|
-
|
|
82
|
-
const data = semver_1.default.gt(semver_1.default.coerce(sigVersion), semver_1.default.coerce(constant_1.SIG_VERSION.V0))
|
|
83
|
-
? getLatestFn({ iat, exp, body, query, method, url })
|
|
84
|
-
: getLegacyFn({ body, query, type });
|
|
71
|
+
const data = getLatestFn({ iat, exp, body, query, method, url });
|
|
85
72
|
return { sig, data, sigVersion, sigPk };
|
|
86
73
|
};
|
|
87
74
|
exports.getVerifyData = getVerifyData;
|
|
@@ -92,13 +79,13 @@ const getSignData = async ({ data, params, method, url, }, signOptions) => {
|
|
|
92
79
|
iat,
|
|
93
80
|
exp,
|
|
94
81
|
};
|
|
95
|
-
const
|
|
82
|
+
const parsedUrl = (0, ufo_1.parseURL)(url);
|
|
96
83
|
// 此处的数据为了保持和 verify 一致,需要做一次 JSON.parse 和 qs.parse
|
|
97
84
|
raw.body = JSON.parse(JSON.stringify(data ?? {}));
|
|
98
85
|
// NOTICE: 为了保持和 verify 一致,需要做一次 qs.stringify 和 qs.parse
|
|
99
|
-
raw.query = qs_1.default.parse(qs_1.default.stringify((0, merge_1.default)(qs_1.default.parse(
|
|
86
|
+
raw.query = qs_1.default.parse(qs_1.default.stringify((0, merge_1.default)(qs_1.default.parse(parsedUrl.search.slice(1)), params ?? {})));
|
|
100
87
|
raw.method = method.toLowerCase();
|
|
101
|
-
raw.url =
|
|
88
|
+
raw.url = parsedUrl.pathname;
|
|
102
89
|
const sig = await sign(raw, signOptions);
|
|
103
90
|
const version = constant_1.SIG_VERSION.DEFAULT;
|
|
104
91
|
return {
|
package/lib/version.d.ts
CHANGED
package/lib/version.js
CHANGED
package/package.json
CHANGED
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
"publishConfig": {
|
|
4
4
|
"access": "public"
|
|
5
5
|
},
|
|
6
|
-
"version": "1.17.
|
|
6
|
+
"version": "1.17.3-beta-20251117-102849-8103f298",
|
|
7
7
|
"description": "graphql client to read/write data on abt node",
|
|
8
8
|
"homepage": "https://www.arcblock.io/docs/blocklet-sdk-nodejs",
|
|
9
9
|
"main": "lib/index.js",
|
|
@@ -26,33 +26,33 @@
|
|
|
26
26
|
"author": "linchen1987 <linchen.1987@foxmail.com> (http://github.com/linchen1987)",
|
|
27
27
|
"license": "Apache-2.0",
|
|
28
28
|
"dependencies": {
|
|
29
|
-
"@abtnode/constant": "1.17.
|
|
30
|
-
"@abtnode/db-cache": "1.17.
|
|
31
|
-
"@abtnode/util": "1.17.
|
|
32
|
-
"@arcblock/did": "^1.27.
|
|
33
|
-
"@arcblock/did-connect-js": "^1.27.
|
|
34
|
-
"@arcblock/did-ext": "^1.27.
|
|
35
|
-
"@arcblock/jwt": "^1.27.
|
|
36
|
-
"@arcblock/ws": "^1.27.
|
|
37
|
-
"@blocklet/constant": "1.17.
|
|
38
|
-
"@blocklet/env": "1.17.
|
|
39
|
-
"@blocklet/error": "^0.3.
|
|
40
|
-
"@blocklet/meta": "1.17.
|
|
41
|
-
"@blocklet/server-js": "1.17.
|
|
42
|
-
"@blocklet/theme": "^3.2.
|
|
29
|
+
"@abtnode/constant": "1.17.3-beta-20251117-102849-8103f298",
|
|
30
|
+
"@abtnode/db-cache": "1.17.3-beta-20251117-102849-8103f298",
|
|
31
|
+
"@abtnode/util": "1.17.3-beta-20251117-102849-8103f298",
|
|
32
|
+
"@arcblock/did": "^1.27.7",
|
|
33
|
+
"@arcblock/did-connect-js": "^1.27.7",
|
|
34
|
+
"@arcblock/did-ext": "^1.27.7",
|
|
35
|
+
"@arcblock/jwt": "^1.27.7",
|
|
36
|
+
"@arcblock/ws": "^1.27.7",
|
|
37
|
+
"@blocklet/constant": "1.17.3-beta-20251117-102849-8103f298",
|
|
38
|
+
"@blocklet/env": "1.17.3-beta-20251117-102849-8103f298",
|
|
39
|
+
"@blocklet/error": "^0.3.3",
|
|
40
|
+
"@blocklet/meta": "1.17.3-beta-20251117-102849-8103f298",
|
|
41
|
+
"@blocklet/server-js": "1.17.3-beta-20251117-102849-8103f298",
|
|
42
|
+
"@blocklet/theme": "^3.2.6",
|
|
43
43
|
"@did-connect/authenticator": "^2.2.8",
|
|
44
44
|
"@did-connect/handler": "^2.2.8",
|
|
45
45
|
"@nedb/core": "^2.1.5",
|
|
46
|
-
"@ocap/mcrypto": "^1.27.
|
|
47
|
-
"@ocap/util": "^1.27.
|
|
48
|
-
"@ocap/wallet": "^1.27.
|
|
46
|
+
"@ocap/mcrypto": "^1.27.7",
|
|
47
|
+
"@ocap/util": "^1.27.7",
|
|
48
|
+
"@ocap/wallet": "^1.27.7",
|
|
49
49
|
"axios": "^1.7.9",
|
|
50
|
-
"cheerio": "1.0.0-rc.12",
|
|
51
50
|
"debug": "^4.4.1",
|
|
52
51
|
"fs-extra": "^11.2.0",
|
|
53
52
|
"joi": "17.12.2",
|
|
54
53
|
"json-stable-stringify": "^1.0.1",
|
|
55
54
|
"jsonwebtoken": "^9.0.0",
|
|
55
|
+
"jwt-decode": "^3.1.2",
|
|
56
56
|
"lodash": "^4.17.21",
|
|
57
57
|
"lru-cache": "^11.0.2",
|
|
58
58
|
"p-retry": "^4.6.2",
|
|
@@ -82,5 +82,5 @@
|
|
|
82
82
|
"ts-node": "^10.9.1",
|
|
83
83
|
"typescript": "^5.6.3"
|
|
84
84
|
},
|
|
85
|
-
"gitHead": "
|
|
85
|
+
"gitHead": "f561ece39d3cd479fc6274cb2895ae5423722b38"
|
|
86
86
|
}
|