@blocklet/sdk 1.16.33-beta-20241111-162739-f5906773 → 1.16.33-beta-20241112-095006-c0bb4e6b
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.
|
@@ -73,6 +73,6 @@ declare const _default: {
|
|
|
73
73
|
signedToken?: boolean;
|
|
74
74
|
}) => (req: import("express").Request & {
|
|
75
75
|
user?: import("../util/login").SessionUser;
|
|
76
|
-
}, res: import("express").Response, next: import("express").NextFunction) => void
|
|
76
|
+
}, res: import("express").Response, next: import("express").NextFunction) => Promise<void>;
|
|
77
77
|
};
|
|
78
78
|
export default _default;
|
|
@@ -8,5 +8,5 @@ type SessionOptions = {
|
|
|
8
8
|
};
|
|
9
9
|
declare const sessionMiddleware: (options?: SessionOptions) => (req: Request & {
|
|
10
10
|
user?: SessionUser;
|
|
11
|
-
}, res: Response, next: NextFunction) => void
|
|
11
|
+
}, res: Response, next: NextFunction) => Promise<void>;
|
|
12
12
|
export = sessionMiddleware;
|
|
@@ -1,95 +1,32 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
-
|
|
3
|
-
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
-
};
|
|
5
|
-
const constant_1 = require("@blocklet/constant");
|
|
6
|
-
const mcrypto_1 = require("@ocap/mcrypto");
|
|
7
|
-
const jwt_1 = require("@arcblock/jwt");
|
|
8
|
-
const jsonwebtoken_1 = __importDefault(require("jsonwebtoken"));
|
|
9
|
-
const login_1 = require("../util/login");
|
|
10
|
-
const verify_sign_1 = require("../util/verify-sign");
|
|
11
|
-
const wallet_1 = __importDefault(require("../wallet"));
|
|
2
|
+
const verify_session_1 = require("../util/verify-session");
|
|
12
3
|
const sessionMiddleware = (options = {}) => {
|
|
13
|
-
const wallet = (0, wallet_1.default)();
|
|
14
|
-
const secret = mcrypto_1.Hasher.SHA3.hash256(Buffer.concat([wallet.secretKey, wallet.address].map((v) => Buffer.from(v))));
|
|
15
4
|
const { loginToken = true, componentCall = false, signedToken = '', strictMode = false } = options;
|
|
16
|
-
return (req, res, next) => {
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
if (
|
|
21
|
-
|
|
22
|
-
if (err) {
|
|
23
|
-
if (strictMode) {
|
|
24
|
-
res.status(401).json({ message: 'Unauthorized: Invalid login token' });
|
|
25
|
-
}
|
|
26
|
-
else {
|
|
27
|
-
next();
|
|
28
|
-
}
|
|
29
|
-
}
|
|
30
|
-
else {
|
|
31
|
-
const { did, role, fullName, provider = constant_1.LOGIN_PROVIDER.WALLET, walletOS, kyc = 0 } = decoded;
|
|
32
|
-
req.user = {
|
|
33
|
-
did,
|
|
34
|
-
role,
|
|
35
|
-
fullName,
|
|
36
|
-
provider,
|
|
37
|
-
walletOS,
|
|
38
|
-
...(0, login_1.decodeKycStatus)(Number(kyc) || 0),
|
|
39
|
-
method: 'loginToken',
|
|
40
|
-
};
|
|
41
|
-
next();
|
|
42
|
-
}
|
|
43
|
-
});
|
|
5
|
+
return async (req, res, next) => {
|
|
6
|
+
let result = null;
|
|
7
|
+
try {
|
|
8
|
+
// authenticate by login token
|
|
9
|
+
if (loginToken) {
|
|
10
|
+
result = await (0, verify_session_1.verifyLoginToken)({ token: req.cookies.login_token, strictMode });
|
|
44
11
|
}
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
const { sig, data } = (0, verify_sign_1.getVerifyData)(req);
|
|
49
|
-
if (sig) {
|
|
50
|
-
if ((0, verify_sign_1.verify)(data, sig) === false) {
|
|
51
|
-
if (strictMode) {
|
|
52
|
-
return res.status(401).json({ error: 'Unauthorized: Invalid signature' });
|
|
53
|
-
}
|
|
54
|
-
return next();
|
|
55
|
-
}
|
|
56
|
-
req.user = {
|
|
57
|
-
did: req.get('x-component-did'),
|
|
58
|
-
role: 'component',
|
|
59
|
-
provider: 'wallet',
|
|
60
|
-
fullName: req.get('x-component-did'),
|
|
61
|
-
walletOS: 'embed',
|
|
62
|
-
emailVerified: false,
|
|
63
|
-
phoneVerified: false,
|
|
64
|
-
method: 'componentCall',
|
|
65
|
-
};
|
|
66
|
-
return next();
|
|
12
|
+
// authenticate by component call
|
|
13
|
+
if (!result && componentCall) {
|
|
14
|
+
result = (0, verify_session_1.verifyComponentCall)({ req, strictMode });
|
|
67
15
|
}
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
if (token) {
|
|
73
|
-
if ((0, jwt_1.verify)(token, secret) === false) {
|
|
74
|
-
if (strictMode) {
|
|
75
|
-
return res.status(401).json({ error: 'Unauthorized: Invalid signed token' });
|
|
76
|
-
}
|
|
77
|
-
return next();
|
|
78
|
-
}
|
|
79
|
-
req.user = {
|
|
80
|
-
did: wallet.address,
|
|
81
|
-
role: 'component',
|
|
82
|
-
provider: 'wallet',
|
|
83
|
-
fullName: wallet.address,
|
|
84
|
-
walletOS: 'embed',
|
|
85
|
-
emailVerified: false,
|
|
86
|
-
phoneVerified: false,
|
|
87
|
-
method: 'signedToken',
|
|
88
|
-
};
|
|
89
|
-
return next();
|
|
16
|
+
// authenticate by signed tmp token: which expires in 5 minutes
|
|
17
|
+
if (!result && signedToken) {
|
|
18
|
+
const token = req.query.__jwt || '';
|
|
19
|
+
result = (0, verify_session_1.verifySignedToken)({ token, strictMode });
|
|
90
20
|
}
|
|
91
21
|
}
|
|
92
|
-
|
|
22
|
+
catch (err) {
|
|
23
|
+
res.status(401).json({ error: err.message });
|
|
24
|
+
return;
|
|
25
|
+
}
|
|
26
|
+
if (result) {
|
|
27
|
+
req.user = result;
|
|
28
|
+
}
|
|
29
|
+
next();
|
|
93
30
|
};
|
|
94
31
|
};
|
|
95
32
|
module.exports = sessionMiddleware;
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { SessionUser } from './login';
|
|
2
|
+
export declare function verifyLoginToken({ token, strictMode }: {
|
|
3
|
+
token: any;
|
|
4
|
+
strictMode: any;
|
|
5
|
+
}): Promise<SessionUser | null>;
|
|
6
|
+
export declare function verifyComponentCall({ req, strictMode }: {
|
|
7
|
+
req: any;
|
|
8
|
+
strictMode: any;
|
|
9
|
+
}): SessionUser | null;
|
|
10
|
+
export declare function verifySignedToken({ token, strictMode }: {
|
|
11
|
+
token: any;
|
|
12
|
+
strictMode: any;
|
|
13
|
+
}): SessionUser | null;
|
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.verifyLoginToken = verifyLoginToken;
|
|
7
|
+
exports.verifyComponentCall = verifyComponentCall;
|
|
8
|
+
exports.verifySignedToken = verifySignedToken;
|
|
9
|
+
const constant_1 = require("@blocklet/constant");
|
|
10
|
+
const jsonwebtoken_1 = __importDefault(require("jsonwebtoken"));
|
|
11
|
+
const mcrypto_1 = require("@ocap/mcrypto");
|
|
12
|
+
const jwt_1 = require("@arcblock/jwt");
|
|
13
|
+
const login_1 = require("./login");
|
|
14
|
+
const wallet_1 = __importDefault(require("../wallet"));
|
|
15
|
+
const verify_sign_1 = require("./verify-sign");
|
|
16
|
+
function verifyLoginToken({ token, strictMode }) {
|
|
17
|
+
if (!token)
|
|
18
|
+
return null;
|
|
19
|
+
const wallet = (0, wallet_1.default)();
|
|
20
|
+
const secret = mcrypto_1.Hasher.SHA3.hash256(Buffer.concat([wallet.secretKey, wallet.address].map((v) => Buffer.from(v))));
|
|
21
|
+
return new Promise((resolve, reject) => {
|
|
22
|
+
jsonwebtoken_1.default.verify(token, secret, (err, decoded) => {
|
|
23
|
+
if (err) {
|
|
24
|
+
if (strictMode) {
|
|
25
|
+
reject(new Error('Unauthorized: Invalid login token'));
|
|
26
|
+
}
|
|
27
|
+
resolve(null);
|
|
28
|
+
return;
|
|
29
|
+
}
|
|
30
|
+
const { did, role, fullName, provider = constant_1.LOGIN_PROVIDER.WALLET, walletOS, kyc = 0 } = decoded;
|
|
31
|
+
resolve({
|
|
32
|
+
did,
|
|
33
|
+
role,
|
|
34
|
+
fullName,
|
|
35
|
+
provider,
|
|
36
|
+
walletOS,
|
|
37
|
+
...(0, login_1.decodeKycStatus)(Number(kyc) || 0),
|
|
38
|
+
method: 'loginToken',
|
|
39
|
+
});
|
|
40
|
+
});
|
|
41
|
+
});
|
|
42
|
+
}
|
|
43
|
+
function verifyComponentCall({ req, strictMode }) {
|
|
44
|
+
const { sig, data } = (0, verify_sign_1.getVerifyData)(req);
|
|
45
|
+
if (!sig)
|
|
46
|
+
return null;
|
|
47
|
+
if ((0, verify_sign_1.verify)(data, sig) === false) {
|
|
48
|
+
if (strictMode) {
|
|
49
|
+
throw new Error('Unauthorized: Invalid signature');
|
|
50
|
+
}
|
|
51
|
+
return null;
|
|
52
|
+
}
|
|
53
|
+
return {
|
|
54
|
+
did: req.get('x-component-did'),
|
|
55
|
+
role: 'component',
|
|
56
|
+
provider: 'wallet',
|
|
57
|
+
fullName: req.get('x-component-did'),
|
|
58
|
+
walletOS: 'embed',
|
|
59
|
+
emailVerified: false,
|
|
60
|
+
phoneVerified: false,
|
|
61
|
+
method: 'componentCall',
|
|
62
|
+
};
|
|
63
|
+
}
|
|
64
|
+
function verifySignedToken({ token, strictMode }) {
|
|
65
|
+
if (!token)
|
|
66
|
+
return null;
|
|
67
|
+
const wallet = (0, wallet_1.default)();
|
|
68
|
+
const secret = mcrypto_1.Hasher.SHA3.hash256(Buffer.concat([wallet.secretKey, wallet.address].map((v) => Buffer.from(v))));
|
|
69
|
+
if ((0, jwt_1.verify)(token, secret) === false) {
|
|
70
|
+
if (strictMode) {
|
|
71
|
+
throw new Error('Unauthorized: Invalid signed token');
|
|
72
|
+
}
|
|
73
|
+
return null;
|
|
74
|
+
}
|
|
75
|
+
return {
|
|
76
|
+
did: wallet.address,
|
|
77
|
+
role: 'component',
|
|
78
|
+
provider: 'wallet',
|
|
79
|
+
fullName: wallet.address,
|
|
80
|
+
walletOS: 'embed',
|
|
81
|
+
emailVerified: false,
|
|
82
|
+
phoneVerified: false,
|
|
83
|
+
method: 'signedToken',
|
|
84
|
+
};
|
|
85
|
+
}
|
package/lib/wallet.js
CHANGED
|
@@ -1,7 +1,14 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
2
5
|
const wallet_1 = require("@ocap/wallet");
|
|
3
6
|
const mcrypto_1 = require("@ocap/mcrypto");
|
|
4
7
|
const did_1 = require("@arcblock/did");
|
|
8
|
+
const lru_cache_1 = __importDefault(require("lru-cache"));
|
|
9
|
+
// NOTICE: 1 个应用的 sdk 运行时最多 4 个钱包
|
|
10
|
+
// 此处 cache 只是优化性能的手段,即使 miss 也不会造成任何错误,最终决定设置 size 为 4
|
|
11
|
+
const cacheWallet = new lru_cache_1.default({ max: 4, maxAge: 60 * 1000 });
|
|
5
12
|
/**
|
|
6
13
|
* @param {string} [type=process.env.CHAIN_TYPE] can only be 'eth|ethereum' or 'default|arcblock'
|
|
7
14
|
* @param {string} [appSk=process.env.BLOCKLET_APP_SK] must be hex
|
|
@@ -13,6 +20,10 @@ const getWallet = (type, appSk = process.env.BLOCKLET_APP_SK) => {
|
|
|
13
20
|
// BLOCKLET_WALLET_TYPE is for backward compatibility
|
|
14
21
|
// eslint-disable-next-line no-param-reassign
|
|
15
22
|
type = type || process.env.CHAIN_TYPE || process.env.BLOCKLET_WALLET_TYPE;
|
|
23
|
+
const cacheKey = [type, appSk].join('_');
|
|
24
|
+
const cache = cacheWallet.get(cacheKey);
|
|
25
|
+
if (cache)
|
|
26
|
+
return cache;
|
|
16
27
|
if ((0, did_1.isEthereumType)((0, did_1.DidType)(type))) {
|
|
17
28
|
sk = appSk.slice(0, 66);
|
|
18
29
|
t = (0, wallet_1.WalletType)(type);
|
|
@@ -21,7 +32,9 @@ const getWallet = (type, appSk = process.env.BLOCKLET_APP_SK) => {
|
|
|
21
32
|
sk = appSk;
|
|
22
33
|
t = (0, wallet_1.WalletType)({ role: mcrypto_1.types.RoleType.ROLE_APPLICATION, pk: mcrypto_1.types.KeyType.ED25519, hash: mcrypto_1.types.HashType.SHA3 });
|
|
23
34
|
}
|
|
24
|
-
|
|
35
|
+
const currentWallet = (0, wallet_1.fromSecretKey)(sk, t);
|
|
36
|
+
cacheWallet.set(cacheKey, currentWallet);
|
|
37
|
+
return currentWallet;
|
|
25
38
|
};
|
|
26
39
|
// BLOCKLET_WALLET_TYPE is for backward compatibility
|
|
27
40
|
const getPermanentWallet = () => getWallet(process.env.CHAIN_TYPE || process.env.BLOCKLET_WALLET_TYPE, process.env.BLOCKLET_APP_PSK);
|
package/package.json
CHANGED
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
"publishConfig": {
|
|
4
4
|
"access": "public"
|
|
5
5
|
},
|
|
6
|
-
"version": "1.16.33-beta-
|
|
6
|
+
"version": "1.16.33-beta-20241112-095006-c0bb4e6b",
|
|
7
7
|
"description": "graphql client to read/write data on abt node",
|
|
8
8
|
"main": "lib/index.js",
|
|
9
9
|
"typings": "lib/index.d.ts",
|
|
@@ -27,15 +27,15 @@
|
|
|
27
27
|
"author": "linchen1987 <linchen.1987@foxmail.com> (http://github.com/linchen1987)",
|
|
28
28
|
"license": "Apache-2.0",
|
|
29
29
|
"dependencies": {
|
|
30
|
-
"@abtnode/client": "1.16.33-beta-
|
|
31
|
-
"@abtnode/constant": "1.16.33-beta-
|
|
30
|
+
"@abtnode/client": "1.16.33-beta-20241112-095006-c0bb4e6b",
|
|
31
|
+
"@abtnode/constant": "1.16.33-beta-20241112-095006-c0bb4e6b",
|
|
32
32
|
"@arcblock/did": "1.18.139",
|
|
33
33
|
"@arcblock/did-auth": "1.18.139",
|
|
34
34
|
"@arcblock/jwt": "1.18.139",
|
|
35
35
|
"@arcblock/ws": "1.18.139",
|
|
36
|
-
"@blocklet/constant": "1.16.33-beta-
|
|
37
|
-
"@blocklet/env": "1.16.33-beta-
|
|
38
|
-
"@blocklet/meta": "1.16.33-beta-
|
|
36
|
+
"@blocklet/constant": "1.16.33-beta-20241112-095006-c0bb4e6b",
|
|
37
|
+
"@blocklet/env": "1.16.33-beta-20241112-095006-c0bb4e6b",
|
|
38
|
+
"@blocklet/meta": "1.16.33-beta-20241112-095006-c0bb4e6b",
|
|
39
39
|
"@did-connect/authenticator": "^2.2.4",
|
|
40
40
|
"@did-connect/handler": "^2.2.4",
|
|
41
41
|
"@nedb/core": "^2.1.5",
|
|
@@ -79,5 +79,5 @@
|
|
|
79
79
|
"ts-node": "^10.9.1",
|
|
80
80
|
"typescript": "^5.6.3"
|
|
81
81
|
},
|
|
82
|
-
"gitHead": "
|
|
82
|
+
"gitHead": "60cc6bf9891c7b3995b312841c41562e1a360f21"
|
|
83
83
|
}
|