@abtnode/blocklet-services 1.16.0-beta-99e016c7 → 1.16.0-beta-ad6df3ae
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/api/libs/auth/utils.js +1 -0
- package/api/libs/connect/session.js +17 -12
- package/api/libs/translate.js +12 -0
- package/api/routes/oauth.js +22 -5
- package/build/asset-manifest.json +5 -5
- package/build/index.html +1 -1
- package/build/static/js/343.a77b905e.chunk.js +2 -0
- package/build/static/js/main.b81aec72.js +3 -0
- package/package.json +32 -32
- package/build/static/js/343.d41f9df4.chunk.js +0 -2
- package/build/static/js/main.918ec6ce.js +0 -3
- /package/build/static/js/{main.918ec6ce.js.LICENSE.txt → main.b81aec72.js.LICENSE.txt} +0 -0
package/api/libs/auth/utils.js
CHANGED
|
@@ -33,7 +33,7 @@ const {
|
|
|
33
33
|
} = require('@abtnode/auth/lib/passport');
|
|
34
34
|
const { getKeyPairClaim } = require('@abtnode/auth/lib/server');
|
|
35
35
|
const sortBy = require('lodash/sortBy');
|
|
36
|
-
const
|
|
36
|
+
const last = require('lodash/last');
|
|
37
37
|
|
|
38
38
|
const { getRolesFromAuthConfig, getBlockletAppIdList } = require('@blocklet/meta/lib/util');
|
|
39
39
|
|
|
@@ -41,6 +41,7 @@ const logger = require('@abtnode/logger')(require('../../../package.json').name)
|
|
|
41
41
|
|
|
42
42
|
const { isInvitedUserOnly } = require('../../util');
|
|
43
43
|
const { transferPassport } = require('../auth/utils');
|
|
44
|
+
const { generateTranslate } = require('../translate');
|
|
44
45
|
|
|
45
46
|
const vcTypes = [VC_TYPE_GENERAL_PASSPORT, VC_TYPE_NODE_PASSPORT];
|
|
46
47
|
|
|
@@ -483,6 +484,7 @@ module.exports = {
|
|
|
483
484
|
teamDid,
|
|
484
485
|
user: {
|
|
485
486
|
did: user.did,
|
|
487
|
+
pk: user.pk,
|
|
486
488
|
passports: upsertToPassports(
|
|
487
489
|
user.passports || [],
|
|
488
490
|
passport && { ...passport, lastLoginAt: new Date().toISOString() }
|
|
@@ -525,6 +527,7 @@ module.exports = {
|
|
|
525
527
|
alreadyBind: '该账户已绑定 OAuth 账户',
|
|
526
528
|
},
|
|
527
529
|
};
|
|
530
|
+
const t = generateTranslate({ translations });
|
|
528
531
|
const blocklet = await request.getBlocklet();
|
|
529
532
|
const config = await request.getServiceConfig(NODE_SERVICES.AUTH, { componentId });
|
|
530
533
|
const { did: teamDid } = await request.getBlockletInfo();
|
|
@@ -532,17 +535,17 @@ module.exports = {
|
|
|
532
535
|
const bindUser = await node.getUser({ teamDid: blocklet.meta.did, user: { did: userDid } });
|
|
533
536
|
|
|
534
537
|
if (!oauthUser) {
|
|
535
|
-
throw new Error(
|
|
538
|
+
throw new Error(t('notFound'));
|
|
536
539
|
}
|
|
537
540
|
if (oauthUser.source !== USER_TYPE.DERIVED) {
|
|
538
|
-
throw new Error(
|
|
541
|
+
throw new Error(t('notDerivedAccount'));
|
|
539
542
|
}
|
|
540
543
|
if (bindUser) {
|
|
541
544
|
if (bindUser.source === USER_TYPE.DERIVED) {
|
|
542
|
-
throw new Error(
|
|
545
|
+
throw new Error(t('notWalletAccount'));
|
|
543
546
|
}
|
|
544
547
|
if (bindUser.derivedAccount) {
|
|
545
|
-
throw new Error(
|
|
548
|
+
throw new Error(t('alreadyBind'));
|
|
546
549
|
}
|
|
547
550
|
}
|
|
548
551
|
|
|
@@ -590,7 +593,7 @@ module.exports = {
|
|
|
590
593
|
// TODO: 获取当前登录使用的 passport(无法获取到 passport.id)
|
|
591
594
|
// 使用最近一次使用的 passport 来代替
|
|
592
595
|
const validPassports = oauthUser.passports.filter((item) => item.status === 'valid');
|
|
593
|
-
const lastUsedPassport =
|
|
596
|
+
const lastUsedPassport = last(sortBy(validPassports, 'lastLoginAt'));
|
|
594
597
|
const passport = lastUsedPassport || { name: 'Guest', role: 'guest' };
|
|
595
598
|
if (bindUser) {
|
|
596
599
|
const mergePassport = (oauthUser.passports || []).reduce((sum, cur) => {
|
|
@@ -612,6 +615,7 @@ module.exports = {
|
|
|
612
615
|
lastLoginAt: oauthUser.lastLoginAt,
|
|
613
616
|
},
|
|
614
617
|
],
|
|
618
|
+
source: USER_TYPE.WALLET,
|
|
615
619
|
did: userDid,
|
|
616
620
|
pk: userPk,
|
|
617
621
|
locale,
|
|
@@ -659,12 +663,13 @@ module.exports = {
|
|
|
659
663
|
});
|
|
660
664
|
bindUser = doc;
|
|
661
665
|
// remove derived account (updateUser use did as key, so did can't be update)
|
|
662
|
-
|
|
663
|
-
|
|
664
|
-
|
|
665
|
-
|
|
666
|
-
|
|
667
|
-
}
|
|
666
|
+
// FIXME: @zhanghan 将来是否需要移除 derived account
|
|
667
|
+
// await node.removeUser({
|
|
668
|
+
// teamDid,
|
|
669
|
+
// user: {
|
|
670
|
+
// did: previousUserDid,
|
|
671
|
+
// },
|
|
672
|
+
// });
|
|
668
673
|
// TODO: @zhanghan 需要增加 auditLog
|
|
669
674
|
}
|
|
670
675
|
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
const get = require('lodash/get');
|
|
2
|
+
|
|
3
|
+
function generateTranslate({ translations, defaultLocale = 'en' }) {
|
|
4
|
+
const languages = Object.keys(translations);
|
|
5
|
+
|
|
6
|
+
return (key, _locale = defaultLocale) => {
|
|
7
|
+
const locale = languages.includes(_locale) ? _locale : defaultLocale;
|
|
8
|
+
return get(translations[locale], key, key);
|
|
9
|
+
};
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
module.exports = { generateTranslate };
|
package/api/routes/oauth.js
CHANGED
|
@@ -5,7 +5,7 @@ const { parseUserAvatar, extractUserAvatar } = require('@abtnode/util/lib/user-a
|
|
|
5
5
|
const { types } = require('@arcblock/did');
|
|
6
6
|
const { fromAppDid } = require('@arcblock/did-ext');
|
|
7
7
|
const get = require('lodash/get');
|
|
8
|
-
const
|
|
8
|
+
const last = require('lodash/last');
|
|
9
9
|
const pick = require('lodash/pick');
|
|
10
10
|
const sortBy = require('lodash/sortBy');
|
|
11
11
|
const joinUrl = require('url-join');
|
|
@@ -15,12 +15,23 @@ const { getAvatarByEmail, transferPassport } = require('../libs/auth/utils');
|
|
|
15
15
|
const { getUser } = require('../libs/jwt');
|
|
16
16
|
const initJwt = require('../libs/jwt');
|
|
17
17
|
const { sendToUser } = require('../libs/notification');
|
|
18
|
+
const { generateTranslate } = require('../libs/translate');
|
|
18
19
|
const { isInvitedUserOnly } = require('../util');
|
|
19
20
|
|
|
20
21
|
const PREFIX = WELLKNOWN_SERVICE_PATH_PREFIX;
|
|
21
22
|
|
|
22
23
|
const prefix = `${PREFIX}/oauth`;
|
|
23
24
|
|
|
25
|
+
const translations = {
|
|
26
|
+
zh: {
|
|
27
|
+
needInviteToLogin: '你需要被邀请才可以登录此应用',
|
|
28
|
+
},
|
|
29
|
+
en: {
|
|
30
|
+
needInviteToLogin: 'You need to be invited to sign in to this app',
|
|
31
|
+
},
|
|
32
|
+
};
|
|
33
|
+
const t = generateTranslate({ translations });
|
|
34
|
+
|
|
24
35
|
async function getDerivedUser(derivedDid, { node, teamDid }) {
|
|
25
36
|
const { users } = await node.getUsers({
|
|
26
37
|
teamDid,
|
|
@@ -47,6 +58,8 @@ async function login(req, node, options) {
|
|
|
47
58
|
});
|
|
48
59
|
const { did: teamDid, wallet: blockletWallet } = await req.getBlockletInfo();
|
|
49
60
|
const config = await req.getServiceConfig(NODE_SERVICES.AUTH, { componentId });
|
|
61
|
+
const nodeInfo = await req.getNodeInfo();
|
|
62
|
+
const { dataDir } = await getApplicationInfo({ node, nodeInfo, teamDid });
|
|
50
63
|
const [invitedUserOnly] = await isInvitedUserOnly(config, node, teamDid);
|
|
51
64
|
const userInfo = await authClient.getProfile(token);
|
|
52
65
|
const userWallet = fromAppDid(userInfo.sub, blockletWallet.secretKey, types.RoleType.ROLE_ACCOUNT);
|
|
@@ -56,7 +69,7 @@ async function login(req, node, options) {
|
|
|
56
69
|
// 当前 oauth 账户已经绑定了 wallet 账户
|
|
57
70
|
if (currentUser) {
|
|
58
71
|
const validPassports = currentUser.passports.filter((item) => item.status === 'valid');
|
|
59
|
-
const lastUsedPassport =
|
|
72
|
+
const lastUsedPassport = last(sortBy(validPassports, 'lastLoginAt'));
|
|
60
73
|
if (lastUsedPassport) {
|
|
61
74
|
passport = pick(lastUsedPassport, ['id', 'name', 'role']);
|
|
62
75
|
}
|
|
@@ -81,12 +94,13 @@ async function login(req, node, options) {
|
|
|
81
94
|
currentUser = {
|
|
82
95
|
did: userWallet.address,
|
|
83
96
|
};
|
|
84
|
-
|
|
97
|
+
let avatar = await getAvatarByEmail(userInfo.email);
|
|
98
|
+
avatar = await extractUserAvatar(avatar, { dataDir });
|
|
85
99
|
const currentUserInfo = await getUser(node, teamDid, userDid);
|
|
86
100
|
// 当前 oauth 账户不存在,自动添加一个新用户
|
|
87
101
|
if (!currentUserInfo) {
|
|
88
102
|
if (invitedUserOnly) {
|
|
89
|
-
throw new Error('
|
|
103
|
+
throw new Error(t('needInviteToLogin', locale));
|
|
90
104
|
}
|
|
91
105
|
await node.addUser({
|
|
92
106
|
teamDid,
|
|
@@ -110,7 +124,7 @@ async function login(req, node, options) {
|
|
|
110
124
|
});
|
|
111
125
|
} else {
|
|
112
126
|
const validPassports = currentUserInfo.passports.filter((item) => item.status === 'valid');
|
|
113
|
-
const lastUsedPassport =
|
|
127
|
+
const lastUsedPassport = last(sortBy(validPassports, 'lastLoginAt'));
|
|
114
128
|
if (lastUsedPassport) {
|
|
115
129
|
passport = pick(lastUsedPassport, ['id', 'name', 'role']);
|
|
116
130
|
}
|
|
@@ -225,6 +239,7 @@ async function invite(req, node, options) {
|
|
|
225
239
|
teamDid,
|
|
226
240
|
user: {
|
|
227
241
|
did: bindUser.did,
|
|
242
|
+
pk: bindUser.pk,
|
|
228
243
|
connectedAccounts: [
|
|
229
244
|
{
|
|
230
245
|
provider: 'auth0',
|
|
@@ -239,6 +254,7 @@ async function invite(req, node, options) {
|
|
|
239
254
|
teamDid,
|
|
240
255
|
user: {
|
|
241
256
|
did: userDid,
|
|
257
|
+
pk: userPk,
|
|
242
258
|
connectedAccounts: [
|
|
243
259
|
{
|
|
244
260
|
provider: 'auth0',
|
|
@@ -286,6 +302,7 @@ module.exports = {
|
|
|
286
302
|
teamDid,
|
|
287
303
|
user: {
|
|
288
304
|
did: userDid,
|
|
305
|
+
pk: bindUser.pk,
|
|
289
306
|
locale,
|
|
290
307
|
source: USER_TYPE.WALLET,
|
|
291
308
|
derivedAccount: {
|
|
@@ -1,14 +1,14 @@
|
|
|
1
1
|
{
|
|
2
2
|
"files": {
|
|
3
3
|
"main.css": "/.blocklet/proxy/blocklet-service/static/css/main.632501d5.css",
|
|
4
|
-
"main.js": "/.blocklet/proxy/blocklet-service/static/js/main.
|
|
4
|
+
"main.js": "/.blocklet/proxy/blocklet-service/static/js/main.b81aec72.js",
|
|
5
5
|
"static/js/716.e1534c42.chunk.js": "/.blocklet/proxy/blocklet-service/static/js/716.e1534c42.chunk.js",
|
|
6
6
|
"static/js/255.279b1bca.chunk.js": "/.blocklet/proxy/blocklet-service/static/js/255.279b1bca.chunk.js",
|
|
7
7
|
"static/js/371.575d3b08.chunk.js": "/.blocklet/proxy/blocklet-service/static/js/371.575d3b08.chunk.js",
|
|
8
8
|
"static/js/737.14f154ca.chunk.js": "/.blocklet/proxy/blocklet-service/static/js/737.14f154ca.chunk.js",
|
|
9
9
|
"static/js/460.3026a774.chunk.js": "/.blocklet/proxy/blocklet-service/static/js/460.3026a774.chunk.js",
|
|
10
10
|
"static/js/868.f2fac071.chunk.js": "/.blocklet/proxy/blocklet-service/static/js/868.f2fac071.chunk.js",
|
|
11
|
-
"static/js/343.
|
|
11
|
+
"static/js/343.a77b905e.chunk.js": "/.blocklet/proxy/blocklet-service/static/js/343.a77b905e.chunk.js",
|
|
12
12
|
"static/js/682.c64ae291.chunk.js": "/.blocklet/proxy/blocklet-service/static/js/682.c64ae291.chunk.js",
|
|
13
13
|
"static/js/711.6c22b7c7.chunk.js": "/.blocklet/proxy/blocklet-service/static/js/711.6c22b7c7.chunk.js",
|
|
14
14
|
"static/js/437.d815f0c0.chunk.js": "/.blocklet/proxy/blocklet-service/static/js/437.d815f0c0.chunk.js",
|
|
@@ -42,14 +42,14 @@
|
|
|
42
42
|
"router-template-styles/styles.css": "/.blocklet/proxy/blocklet-service/router-template-styles/styles.css",
|
|
43
43
|
"index.html": "/.blocklet/proxy/blocklet-service/index.html",
|
|
44
44
|
"main.632501d5.css.map": "/.blocklet/proxy/blocklet-service/static/css/main.632501d5.css.map",
|
|
45
|
-
"main.
|
|
45
|
+
"main.b81aec72.js.map": "/.blocklet/proxy/blocklet-service/static/js/main.b81aec72.js.map",
|
|
46
46
|
"716.e1534c42.chunk.js.map": "/.blocklet/proxy/blocklet-service/static/js/716.e1534c42.chunk.js.map",
|
|
47
47
|
"255.279b1bca.chunk.js.map": "/.blocklet/proxy/blocklet-service/static/js/255.279b1bca.chunk.js.map",
|
|
48
48
|
"371.575d3b08.chunk.js.map": "/.blocklet/proxy/blocklet-service/static/js/371.575d3b08.chunk.js.map",
|
|
49
49
|
"737.14f154ca.chunk.js.map": "/.blocklet/proxy/blocklet-service/static/js/737.14f154ca.chunk.js.map",
|
|
50
50
|
"460.3026a774.chunk.js.map": "/.blocklet/proxy/blocklet-service/static/js/460.3026a774.chunk.js.map",
|
|
51
51
|
"868.f2fac071.chunk.js.map": "/.blocklet/proxy/blocklet-service/static/js/868.f2fac071.chunk.js.map",
|
|
52
|
-
"343.
|
|
52
|
+
"343.a77b905e.chunk.js.map": "/.blocklet/proxy/blocklet-service/static/js/343.a77b905e.chunk.js.map",
|
|
53
53
|
"682.c64ae291.chunk.js.map": "/.blocklet/proxy/blocklet-service/static/js/682.c64ae291.chunk.js.map",
|
|
54
54
|
"711.6c22b7c7.chunk.js.map": "/.blocklet/proxy/blocklet-service/static/js/711.6c22b7c7.chunk.js.map",
|
|
55
55
|
"437.d815f0c0.chunk.js.map": "/.blocklet/proxy/blocklet-service/static/js/437.d815f0c0.chunk.js.map",
|
|
@@ -64,6 +64,6 @@
|
|
|
64
64
|
},
|
|
65
65
|
"entrypoints": [
|
|
66
66
|
"static/css/main.632501d5.css",
|
|
67
|
-
"static/js/main.
|
|
67
|
+
"static/js/main.b81aec72.js"
|
|
68
68
|
]
|
|
69
69
|
}
|
package/build/index.html
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
<!doctype html><html lang="en"><head><meta charset="utf-8"/><link rel="icon" href="/favicon.ico"/><meta name="viewport" content="width=device-width,initial-scale=1,maximum-scale=1,user-scalable=0"/><meta name="theme-color" content="#000000"/><title>Blocklet Service</title><script src=".well-known/service/api/env"></script><script src="/__blocklet__.js"></script><script defer="defer" src="/.blocklet/proxy/blocklet-service/static/js/main.
|
|
1
|
+
<!doctype html><html lang="en"><head><meta charset="utf-8"/><link rel="icon" href="/favicon.ico"/><meta name="viewport" content="width=device-width,initial-scale=1,maximum-scale=1,user-scalable=0"/><meta name="theme-color" content="#000000"/><title>Blocklet Service</title><script src=".well-known/service/api/env"></script><script src="/__blocklet__.js"></script><script defer="defer" src="/.blocklet/proxy/blocklet-service/static/js/main.b81aec72.js"></script><link href="/.blocklet/proxy/blocklet-service/static/css/main.632501d5.css" rel="stylesheet"></head><body><noscript>You need to enable JavaScript to run this app.</noscript><div id="root"></div></body></html>
|