@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.
@@ -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');
@@ -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: object;
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
  };
@@ -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 tmp = (0, ufo_1.parseURL)(url);
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(tmp.search.slice(1)), query ?? {}),
57
+ query: (0, merge_1.default)(qs_1.default.parse(parsedUrl.search.slice(1)), query ?? {}),
59
58
  method: method.toLowerCase(),
60
- url: tmp.pathname,
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`) || constant_1.SIG_VERSION.V0;
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
- // FIXME: @zhanghan 2024-11-30 需要移除这个旧的兼容(提升总体的安全性)
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 tmp = (0, ufo_1.parseURL)(url);
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(tmp.search.slice(1)), params ?? {})));
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 = tmp.pathname;
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
@@ -1,4 +1,4 @@
1
- declare const version = "1.17.2";
1
+ declare const version = "1.17.3";
2
2
  export { version };
3
3
  declare const _default: {
4
4
  version: string;
package/lib/version.js CHANGED
@@ -1,6 +1,6 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.version = void 0;
4
- const version = '1.17.2';
4
+ const version = '1.17.3';
5
5
  exports.version = version;
6
6
  exports.default = { version };
package/package.json CHANGED
@@ -3,7 +3,7 @@
3
3
  "publishConfig": {
4
4
  "access": "public"
5
5
  },
6
- "version": "1.17.2-beta-20251114-122922-4319f1ac",
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.2-beta-20251114-122922-4319f1ac",
30
- "@abtnode/db-cache": "1.17.2-beta-20251114-122922-4319f1ac",
31
- "@abtnode/util": "1.17.2-beta-20251114-122922-4319f1ac",
32
- "@arcblock/did": "^1.27.6",
33
- "@arcblock/did-connect-js": "^1.27.6",
34
- "@arcblock/did-ext": "^1.27.6",
35
- "@arcblock/jwt": "^1.27.6",
36
- "@arcblock/ws": "^1.27.6",
37
- "@blocklet/constant": "1.17.2-beta-20251114-122922-4319f1ac",
38
- "@blocklet/env": "1.17.2-beta-20251114-122922-4319f1ac",
39
- "@blocklet/error": "^0.3.2",
40
- "@blocklet/meta": "1.17.2-beta-20251114-122922-4319f1ac",
41
- "@blocklet/server-js": "1.17.2-beta-20251114-122922-4319f1ac",
42
- "@blocklet/theme": "^3.2.5",
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.6",
47
- "@ocap/util": "^1.27.6",
48
- "@ocap/wallet": "^1.27.6",
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": "eb484ccabce50c438b8eec1be3738da18cd28f75"
85
+ "gitHead": "f561ece39d3cd479fc6274cb2895ae5423722b38"
86
86
  }