@abtnode/blocklet-services 1.16.6-beta-4ea1eb90 → 1.16.6-beta-eaa4d39d
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/connect/session.js +132 -102
- package/api/routes/oauth.js +55 -63
- package/api/services/auth/connect/bind-wallet.js +7 -1
- package/api/services/auth/connect/receive-transfer-app-owner.js +6 -18
- package/api/services/auth/connect/setup.js +6 -5
- package/api/services/dashboard/index.js +1 -0
- package/api/services/notification/index.js +1 -0
- package/api/services/relay/index.js +1 -0
- package/build/asset-manifest.json +9 -9
- package/build/index.html +1 -1
- package/build/static/css/{61.03a48b17.chunk.css → 895.c5def0cb.chunk.css} +1 -1
- package/build/static/js/343.948c6447.chunk.js +2 -0
- package/build/static/js/895.43f7362e.chunk.js +3 -0
- package/build/static/js/main.d441df83.js +3 -0
- package/package.json +30 -30
- package/build/static/js/343.f30fdb24.chunk.js +0 -2
- package/build/static/js/61.3c903dd8.chunk.js +0 -3
- package/build/static/js/main.00308947.js +0 -3
- /package/build/static/js/{61.3c903dd8.chunk.js.LICENSE.txt → 895.43f7362e.chunk.js.LICENSE.txt} +0 -0
- /package/build/static/js/{main.00308947.js.LICENSE.txt → main.d441df83.js.LICENSE.txt} +0 -0
|
@@ -43,7 +43,7 @@ const logger = require('@abtnode/logger')(require('../../../package.json').name)
|
|
|
43
43
|
const { isInvitedUserOnly } = require('../../util');
|
|
44
44
|
const { transferPassport } = require('../auth/utils');
|
|
45
45
|
const { generateTranslate } = require('../translate');
|
|
46
|
-
const {
|
|
46
|
+
const { mergeUserData, migrateAccount } = require('../../services/oauth');
|
|
47
47
|
|
|
48
48
|
const vcTypes = [VC_TYPE_GENERAL_PASSPORT, VC_TYPE_NODE_PASSPORT];
|
|
49
49
|
|
|
@@ -135,7 +135,7 @@ module.exports = {
|
|
|
135
135
|
onConnect: async ({ node, request, userDid, locale, passportId = '', componentId, action }) => {
|
|
136
136
|
const blocklet = await request.getBlocklet();
|
|
137
137
|
const config = await request.getServiceConfig(NODE_SERVICES.AUTH, { componentId });
|
|
138
|
-
const { did: teamDid } = await request.getBlockletInfo();
|
|
138
|
+
const { did: teamDid, wallet: blockletWallet } = await request.getBlockletInfo();
|
|
139
139
|
|
|
140
140
|
const profileFields = get(config, 'profileFields');
|
|
141
141
|
|
|
@@ -172,13 +172,16 @@ module.exports = {
|
|
|
172
172
|
};
|
|
173
173
|
}
|
|
174
174
|
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
175
|
+
const user = await node.getUser({
|
|
176
|
+
teamDid: blocklet.meta.did,
|
|
177
|
+
user: {
|
|
178
|
+
did: userDid,
|
|
179
|
+
},
|
|
180
|
+
options: {
|
|
181
|
+
enableConnectedAccout: true,
|
|
182
|
+
enableNormalize: true,
|
|
183
|
+
blockletSk: blockletWallet.secretKey,
|
|
184
|
+
},
|
|
182
185
|
});
|
|
183
186
|
if (user) {
|
|
184
187
|
delete claims.profile;
|
|
@@ -201,16 +204,19 @@ module.exports = {
|
|
|
201
204
|
action,
|
|
202
205
|
}) => {
|
|
203
206
|
const blocklet = await request.getBlocklet();
|
|
204
|
-
const { wallet, name, passportColor, did: teamDid } = await request.getBlockletInfo();
|
|
207
|
+
const { wallet, name, passportColor, did: teamDid, wallet: blockletWallet } = await request.getBlockletInfo();
|
|
205
208
|
|
|
206
209
|
// Check user approved
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
210
|
+
const user = await node.getUser({
|
|
211
|
+
teamDid,
|
|
212
|
+
user: {
|
|
213
|
+
did: userDid,
|
|
214
|
+
},
|
|
215
|
+
options: {
|
|
216
|
+
enableConnectedAccout: true,
|
|
217
|
+
enableNormalize: true,
|
|
218
|
+
blockletSk: blockletWallet.secretKey,
|
|
219
|
+
},
|
|
214
220
|
});
|
|
215
221
|
if (user && !user.approved) {
|
|
216
222
|
throw new Error(messages.notAllowed[locale]);
|
|
@@ -303,14 +309,16 @@ module.exports = {
|
|
|
303
309
|
const passportForLog = passport || { name: 'Guest', role: 'guest' };
|
|
304
310
|
if (user) {
|
|
305
311
|
// Update user
|
|
306
|
-
const doc = await node.
|
|
312
|
+
const doc = await node.loginUser({
|
|
307
313
|
teamDid,
|
|
308
|
-
user:
|
|
314
|
+
user: {
|
|
315
|
+
did: user.did,
|
|
316
|
+
pk: user.pk,
|
|
309
317
|
locale,
|
|
310
|
-
|
|
318
|
+
passport,
|
|
311
319
|
lastLoginIp: get(request, 'headers[x-real-ip]') || '',
|
|
312
|
-
connectedAccount: [{ provider: 'wallet', did: realDid }, connectedNft]
|
|
313
|
-
}
|
|
320
|
+
connectedAccount: [{ provider: 'wallet', did: realDid }, connectedNft],
|
|
321
|
+
},
|
|
314
322
|
});
|
|
315
323
|
await node.createAuditLog(
|
|
316
324
|
{
|
|
@@ -325,7 +333,7 @@ module.exports = {
|
|
|
325
333
|
// Create user
|
|
326
334
|
const profile = claims.find((x) => x.type === 'profile');
|
|
327
335
|
|
|
328
|
-
const doc = await node.
|
|
336
|
+
const doc = await node.loginUser({
|
|
329
337
|
teamDid,
|
|
330
338
|
user: {
|
|
331
339
|
...profile,
|
|
@@ -334,25 +342,17 @@ module.exports = {
|
|
|
334
342
|
}),
|
|
335
343
|
did: realDid,
|
|
336
344
|
pk: realPk,
|
|
337
|
-
approved: true,
|
|
338
345
|
locale,
|
|
339
|
-
|
|
340
|
-
firstLoginAt: now,
|
|
341
|
-
lastLoginAt: now,
|
|
346
|
+
passport,
|
|
342
347
|
lastLoginIp: get(request, 'headers[x-real-ip]') || '',
|
|
343
|
-
|
|
344
|
-
|
|
345
|
-
|
|
346
|
-
|
|
347
|
-
|
|
348
|
-
|
|
349
|
-
|
|
350
|
-
|
|
351
|
-
lastLoginAt: now,
|
|
352
|
-
},
|
|
353
|
-
connectedNft,
|
|
354
|
-
].filter(Boolean),
|
|
355
|
-
},
|
|
348
|
+
connectedAccount: [
|
|
349
|
+
{
|
|
350
|
+
provider: 'wallet',
|
|
351
|
+
did: realDid,
|
|
352
|
+
pk: realPk,
|
|
353
|
+
},
|
|
354
|
+
connectedNft,
|
|
355
|
+
],
|
|
356
356
|
},
|
|
357
357
|
});
|
|
358
358
|
await node.createAuditLog(
|
|
@@ -413,14 +413,17 @@ module.exports = {
|
|
|
413
413
|
throw new Error(messages.actionForbidden[locale]);
|
|
414
414
|
}
|
|
415
415
|
|
|
416
|
-
const { did: teamDid } = await request.getBlockletInfo();
|
|
417
|
-
|
|
418
|
-
|
|
419
|
-
|
|
420
|
-
|
|
421
|
-
|
|
422
|
-
|
|
423
|
-
|
|
416
|
+
const { did: teamDid, wallet: blockletWallet } = await request.getBlockletInfo();
|
|
417
|
+
const user = await node.getUser({
|
|
418
|
+
teamDid,
|
|
419
|
+
user: {
|
|
420
|
+
did: userDid,
|
|
421
|
+
},
|
|
422
|
+
options: {
|
|
423
|
+
enableConnectedAccout: true,
|
|
424
|
+
enableNormalize: true,
|
|
425
|
+
blockletSk: blockletWallet.secretKey,
|
|
426
|
+
},
|
|
424
427
|
});
|
|
425
428
|
|
|
426
429
|
if (!user) {
|
|
@@ -440,16 +443,19 @@ module.exports = {
|
|
|
440
443
|
},
|
|
441
444
|
onApprove: async ({ node, request, locale, profile, userDid }) => {
|
|
442
445
|
const blocklet = await request.getBlocklet();
|
|
443
|
-
const teamDid =
|
|
446
|
+
const { did: teamDid, blocklet: blockletWallet } = await request.getBlockletInfo();
|
|
444
447
|
|
|
445
448
|
// check user approved
|
|
446
|
-
|
|
447
|
-
|
|
448
|
-
|
|
449
|
-
|
|
450
|
-
|
|
451
|
-
|
|
452
|
-
|
|
449
|
+
const user = await node.getUser({
|
|
450
|
+
teamDid,
|
|
451
|
+
user: {
|
|
452
|
+
did: userDid,
|
|
453
|
+
},
|
|
454
|
+
options: {
|
|
455
|
+
enableConnectedAccout: true,
|
|
456
|
+
enableNormalize: true,
|
|
457
|
+
blockletSk: blockletWallet.secretKey,
|
|
458
|
+
},
|
|
453
459
|
});
|
|
454
460
|
if (!user) {
|
|
455
461
|
throw new Error(messages.userNotFound[locale]);
|
|
@@ -488,15 +494,18 @@ module.exports = {
|
|
|
488
494
|
throw new Error(messages.userMismatch[locale]);
|
|
489
495
|
}
|
|
490
496
|
|
|
491
|
-
const { did: teamDid } = await request.getBlockletInfo();
|
|
497
|
+
const { did: teamDid, wallet: blockletWallet } = await request.getBlockletInfo();
|
|
492
498
|
|
|
493
|
-
|
|
494
|
-
|
|
495
|
-
|
|
496
|
-
|
|
497
|
-
|
|
498
|
-
|
|
499
|
-
|
|
499
|
+
const user = await node.getUser({
|
|
500
|
+
teamDid,
|
|
501
|
+
user: {
|
|
502
|
+
did: userDid,
|
|
503
|
+
},
|
|
504
|
+
options: {
|
|
505
|
+
enableConnectedAccout: true,
|
|
506
|
+
enableNormalize: true,
|
|
507
|
+
blockletSk: blockletWallet.secretKey,
|
|
508
|
+
},
|
|
500
509
|
});
|
|
501
510
|
|
|
502
511
|
if (!user) {
|
|
@@ -534,16 +543,19 @@ module.exports = {
|
|
|
534
543
|
componentId,
|
|
535
544
|
}) => {
|
|
536
545
|
const blocklet = await request.getBlocklet();
|
|
537
|
-
const { name, did: teamDid } = await request.getBlockletInfo();
|
|
546
|
+
const { name, did: teamDid, wallet: blockletWallet } = await request.getBlockletInfo();
|
|
538
547
|
|
|
539
548
|
// Validate user
|
|
540
|
-
|
|
541
|
-
|
|
542
|
-
|
|
543
|
-
|
|
544
|
-
|
|
545
|
-
|
|
546
|
-
|
|
549
|
+
const user = await node.getUser({
|
|
550
|
+
teamDid,
|
|
551
|
+
user: {
|
|
552
|
+
did: userDid,
|
|
553
|
+
},
|
|
554
|
+
options: {
|
|
555
|
+
enableConnectedAccout: true,
|
|
556
|
+
enableNormalize: true,
|
|
557
|
+
blockletSk: blockletWallet.secretKey,
|
|
558
|
+
},
|
|
547
559
|
});
|
|
548
560
|
if (!user) {
|
|
549
561
|
throw new Error(messages.userNotFound[locale]);
|
|
@@ -616,7 +628,17 @@ module.exports = {
|
|
|
616
628
|
|
|
617
629
|
// 基本流程与 login 一致,但在创建更新用户信息的逻辑不一样
|
|
618
630
|
bindWallet: {
|
|
619
|
-
|
|
631
|
+
authPrincipal: async ({ email, locale, previousUserDid }) => {
|
|
632
|
+
const user = email || previousUserDid;
|
|
633
|
+
|
|
634
|
+
const message = locale === 'zh' ? `将你的 DID 钱包与账号 ${user} 绑定` : `Connect your DID Wallet with ${user}`;
|
|
635
|
+
|
|
636
|
+
return {
|
|
637
|
+
description: message,
|
|
638
|
+
supervised: true,
|
|
639
|
+
};
|
|
640
|
+
},
|
|
641
|
+
onConnect: async ({ node, request, userDid, locale, componentId, previousUserDid }) => {
|
|
620
642
|
const translations = {
|
|
621
643
|
en: {
|
|
622
644
|
notFound: "Can't get bind account information",
|
|
@@ -632,7 +654,7 @@ module.exports = {
|
|
|
632
654
|
},
|
|
633
655
|
};
|
|
634
656
|
const t = generateTranslate({ translations });
|
|
635
|
-
const { did: teamDid } = await request.getBlockletInfo();
|
|
657
|
+
const { did: teamDid, wallet: blockletWallet } = await request.getBlockletInfo();
|
|
636
658
|
|
|
637
659
|
const walletUser = await node.getUser({ teamDid, user: { did: userDid } });
|
|
638
660
|
if (walletUser) {
|
|
@@ -640,13 +662,16 @@ module.exports = {
|
|
|
640
662
|
}
|
|
641
663
|
|
|
642
664
|
const config = await request.getServiceConfig(NODE_SERVICES.AUTH, { componentId });
|
|
643
|
-
|
|
644
|
-
|
|
645
|
-
|
|
646
|
-
|
|
647
|
-
|
|
648
|
-
|
|
649
|
-
|
|
665
|
+
const oauthUser = await node.getUser({
|
|
666
|
+
teamDid,
|
|
667
|
+
user: {
|
|
668
|
+
did: previousUserDid,
|
|
669
|
+
},
|
|
670
|
+
options: {
|
|
671
|
+
enableConnectedAccout: true,
|
|
672
|
+
enableNormalize: true,
|
|
673
|
+
blockletSk: blockletWallet.secretKey,
|
|
674
|
+
},
|
|
650
675
|
});
|
|
651
676
|
|
|
652
677
|
if (!oauthUser) {
|
|
@@ -658,13 +683,16 @@ module.exports = {
|
|
|
658
683
|
throw new Error(t('alreadyBindWallet', locale));
|
|
659
684
|
}
|
|
660
685
|
|
|
661
|
-
|
|
662
|
-
|
|
663
|
-
|
|
664
|
-
|
|
665
|
-
|
|
666
|
-
|
|
667
|
-
|
|
686
|
+
const bindUser = await node.getUser({
|
|
687
|
+
teamDid,
|
|
688
|
+
user: {
|
|
689
|
+
did: userDid,
|
|
690
|
+
},
|
|
691
|
+
options: {
|
|
692
|
+
enableConnectedAccout: true,
|
|
693
|
+
enableNormalize: true,
|
|
694
|
+
blockletSk: blockletWallet.secretKey,
|
|
695
|
+
},
|
|
668
696
|
});
|
|
669
697
|
|
|
670
698
|
if (bindUser) {
|
|
@@ -684,15 +712,14 @@ module.exports = {
|
|
|
684
712
|
};
|
|
685
713
|
|
|
686
714
|
// 至少需要一个 claim
|
|
687
|
-
|
|
688
|
-
|
|
689
|
-
|
|
690
|
-
|
|
691
|
-
|
|
692
|
-
claims.verifiableCredential.target = passportId;
|
|
715
|
+
if (oauthUser.avatar) {
|
|
716
|
+
delete claims.profile;
|
|
717
|
+
}
|
|
718
|
+
if (Object.keys(claims).length > 0) {
|
|
719
|
+
return claims;
|
|
693
720
|
}
|
|
694
721
|
|
|
695
|
-
return
|
|
722
|
+
return [];
|
|
696
723
|
},
|
|
697
724
|
onApprove: async ({ node, request, locale, userDid, userPk, claims, previousUserDid }) => {
|
|
698
725
|
const blocklet = await request.getBlocklet();
|
|
@@ -701,13 +728,16 @@ module.exports = {
|
|
|
701
728
|
const oauthUser = await node.getUser({ teamDid, user: { did: previousUserDid } });
|
|
702
729
|
const nodeInfo = await request.getNodeInfo();
|
|
703
730
|
// Check user approved
|
|
704
|
-
let bindUser = await
|
|
705
|
-
|
|
706
|
-
|
|
707
|
-
|
|
708
|
-
|
|
709
|
-
|
|
710
|
-
|
|
731
|
+
let bindUser = await node.getUser({
|
|
732
|
+
teamDid,
|
|
733
|
+
user: {
|
|
734
|
+
did: userDid,
|
|
735
|
+
},
|
|
736
|
+
options: {
|
|
737
|
+
enableConnectedAccout: true,
|
|
738
|
+
enableNormalize: true,
|
|
739
|
+
blockletSk: blockletWallet.secretKey,
|
|
740
|
+
},
|
|
711
741
|
});
|
|
712
742
|
if (bindUser && !bindUser.approved) {
|
|
713
743
|
throw new Error(messages.notAllowed[locale]);
|
package/api/routes/oauth.js
CHANGED
|
@@ -18,7 +18,7 @@ const { getAvatarByEmail, transferPassport } = require('../libs/auth/utils');
|
|
|
18
18
|
const initJwt = require('../libs/jwt');
|
|
19
19
|
const { sendToUser } = require('../libs/notification');
|
|
20
20
|
const { generateTranslate } = require('../libs/translate');
|
|
21
|
-
const {
|
|
21
|
+
const { mergeUserData, declareAccount, migrateAccount } = require('../services/oauth');
|
|
22
22
|
const { isInvitedUserOnly } = require('../util');
|
|
23
23
|
|
|
24
24
|
const PREFIX = WELLKNOWN_SERVICE_PATH_PREFIX;
|
|
@@ -28,11 +28,18 @@ const prefix = `${PREFIX}/oauth`;
|
|
|
28
28
|
const translations = {
|
|
29
29
|
zh: {
|
|
30
30
|
needInviteToLogin: '你需要被邀请才可以登录此应用',
|
|
31
|
+
alreadyMainAccount: '已给该账户分配一个主账户',
|
|
32
|
+
oauthCantBeOwner: '第三方登录的账户不能成为应用的拥有者',
|
|
33
|
+
oauthCantBindOauth: '第三方登录的账户无法绑定另一个第三方登录的账户',
|
|
31
34
|
},
|
|
32
35
|
en: {
|
|
33
36
|
needInviteToLogin: 'You need to be invited to sign in to this app',
|
|
37
|
+
alreadyMainAccount: 'Current account is already a main account',
|
|
38
|
+
oauthCantBeOwner: "Can't login oauth account as owner",
|
|
39
|
+
oauthCantBindOauth: "Current account can't bind a third party account",
|
|
34
40
|
},
|
|
35
41
|
};
|
|
42
|
+
|
|
36
43
|
const t = generateTranslate({ translations });
|
|
37
44
|
|
|
38
45
|
function getAuthClient(blocklet, provider) {
|
|
@@ -49,13 +56,13 @@ function getAuthClient(blocklet, provider) {
|
|
|
49
56
|
|
|
50
57
|
async function login(req, node, options) {
|
|
51
58
|
const blocklet = await req.getBlocklet();
|
|
59
|
+
const { token, locale = 'en', provider, componentId } = req.body;
|
|
60
|
+
|
|
52
61
|
if (!blocklet.settings?.owner) {
|
|
53
|
-
throw new Error('
|
|
62
|
+
throw new Error(t('oauthCantBeOwner', locale));
|
|
54
63
|
}
|
|
55
|
-
const { token, locale = 'en', provider, componentId } = req.body;
|
|
56
64
|
const authClient = getAuthClient(blocklet, provider);
|
|
57
65
|
|
|
58
|
-
const currentTime = new Date().toISOString();
|
|
59
66
|
const { did: teamDid, wallet: blockletWallet } = await req.getBlockletInfo();
|
|
60
67
|
const config = await req.getServiceConfig(NODE_SERVICES.AUTH, { componentId });
|
|
61
68
|
const nodeInfo = await req.getNodeInfo();
|
|
@@ -67,10 +74,16 @@ async function login(req, node, options) {
|
|
|
67
74
|
const userPk = userWallet.publicKey;
|
|
68
75
|
const lastLoginIp = get(req, 'headers[x-real-ip]') || '';
|
|
69
76
|
let passport = { name: 'Guest', role: 'guest' };
|
|
70
|
-
let currentUser = await
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
77
|
+
let currentUser = await node.getUser({
|
|
78
|
+
teamDid,
|
|
79
|
+
user: {
|
|
80
|
+
did: userDid,
|
|
81
|
+
},
|
|
82
|
+
options: {
|
|
83
|
+
enableConnectedAccout: true,
|
|
84
|
+
enableNormalize: true,
|
|
85
|
+
blockletSk: blockletWallet.secretKey,
|
|
86
|
+
},
|
|
74
87
|
});
|
|
75
88
|
// 当前账户已存在,更新账户信息
|
|
76
89
|
if (currentUser) {
|
|
@@ -80,14 +93,14 @@ async function login(req, node, options) {
|
|
|
80
93
|
if (lastUsedPassport) {
|
|
81
94
|
passport = pick(lastUsedPassport, ['id', 'name', 'role']);
|
|
82
95
|
}
|
|
83
|
-
await node.
|
|
96
|
+
await node.loginUser({
|
|
84
97
|
teamDid,
|
|
85
|
-
user:
|
|
98
|
+
user: {
|
|
86
99
|
locale,
|
|
87
100
|
lastLoginIp,
|
|
88
|
-
lastUsedPassport,
|
|
101
|
+
passport: lastUsedPassport,
|
|
89
102
|
connectedAccount: { provider, did: userDid },
|
|
90
|
-
}
|
|
103
|
+
},
|
|
91
104
|
});
|
|
92
105
|
} else {
|
|
93
106
|
currentUser = {
|
|
@@ -100,21 +113,14 @@ async function login(req, node, options) {
|
|
|
100
113
|
if (invitedUserOnly) {
|
|
101
114
|
throw new Error(t('needInviteToLogin', locale));
|
|
102
115
|
}
|
|
103
|
-
await node.
|
|
116
|
+
await node.loginUser({
|
|
104
117
|
teamDid,
|
|
105
118
|
user: {
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
id: oauthInfo.sub,
|
|
112
|
-
did: userDid,
|
|
113
|
-
pk: userPk,
|
|
114
|
-
lastLoginAt: currentTime,
|
|
115
|
-
firstLoginAt: currentTime,
|
|
116
|
-
},
|
|
117
|
-
],
|
|
119
|
+
connectedAccount: {
|
|
120
|
+
provider,
|
|
121
|
+
id: oauthInfo.sub,
|
|
122
|
+
did: userDid,
|
|
123
|
+
pk: userPk,
|
|
118
124
|
},
|
|
119
125
|
did: userDid,
|
|
120
126
|
pk: userPk,
|
|
@@ -122,11 +128,6 @@ async function login(req, node, options) {
|
|
|
122
128
|
email: oauthInfo.email,
|
|
123
129
|
avatar,
|
|
124
130
|
locale,
|
|
125
|
-
type: 'profile',
|
|
126
|
-
approved: true,
|
|
127
|
-
passports: [],
|
|
128
|
-
firstLoginAt: currentTime,
|
|
129
|
-
lastLoginAt: currentTime,
|
|
130
131
|
lastLoginIp,
|
|
131
132
|
},
|
|
132
133
|
});
|
|
@@ -155,13 +156,16 @@ async function invite(req, node, options) {
|
|
|
155
156
|
let userPk = userWallet.publicKey;
|
|
156
157
|
|
|
157
158
|
let profile;
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
159
|
+
const currentUser = await node.getUser({
|
|
160
|
+
teamDid,
|
|
161
|
+
user: {
|
|
162
|
+
did: userDid,
|
|
163
|
+
},
|
|
164
|
+
options: {
|
|
165
|
+
enableConnectedAccout: true,
|
|
166
|
+
enableNormalize: true,
|
|
167
|
+
blockletSk: blockletWallet.secretKey,
|
|
168
|
+
},
|
|
165
169
|
});
|
|
166
170
|
const { dataDir, name: applicationName } = await getApplicationInfo({ node, nodeInfo, teamDid });
|
|
167
171
|
if (currentUser) {
|
|
@@ -199,6 +203,7 @@ async function invite(req, node, options) {
|
|
|
199
203
|
userDid,
|
|
200
204
|
userPk,
|
|
201
205
|
locale,
|
|
206
|
+
provider,
|
|
202
207
|
});
|
|
203
208
|
|
|
204
209
|
if (currentUser) {
|
|
@@ -225,28 +230,18 @@ async function invite(req, node, options) {
|
|
|
225
230
|
);
|
|
226
231
|
}
|
|
227
232
|
} else {
|
|
228
|
-
await node.
|
|
233
|
+
await node.loginUser({
|
|
229
234
|
teamDid,
|
|
230
|
-
user:
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
extraConfigs: {
|
|
235
|
-
sourceProvider: provider,
|
|
236
|
-
},
|
|
237
|
-
},
|
|
238
|
-
{
|
|
235
|
+
user: {
|
|
236
|
+
did: userDid,
|
|
237
|
+
pk: userPk,
|
|
238
|
+
connectedAccount: {
|
|
239
239
|
provider,
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
firstLoginAt: new Date().toISOString(),
|
|
246
|
-
lastLoginAt: new Date().toISOString(),
|
|
247
|
-
},
|
|
248
|
-
}
|
|
249
|
-
),
|
|
240
|
+
id: oauthInfo.sub,
|
|
241
|
+
did: userWallet.address,
|
|
242
|
+
pk: userWallet.publicKey,
|
|
243
|
+
},
|
|
244
|
+
},
|
|
250
245
|
});
|
|
251
246
|
await declareAccount({ wallet: userWallet, moniker: oauthInfo.nickname, blocklet });
|
|
252
247
|
}
|
|
@@ -269,17 +264,14 @@ async function bind(req, node, options) {
|
|
|
269
264
|
const userWallet = fromAppDid(userInfo.sub, blockletWallet.secretKey, types.RoleType.ROLE_ACCOUNT);
|
|
270
265
|
let oauthUser = await node.getUser({ teamDid, user: { did: userWallet.address } });
|
|
271
266
|
if (oauthUser) {
|
|
272
|
-
|
|
273
|
-
throw new Error('OAuth account is already bind to another wallet account');
|
|
274
|
-
}
|
|
275
|
-
throw new Error('OAuth account is already a main account');
|
|
267
|
+
throw new Error(t('alreadyMainAccount', locale));
|
|
276
268
|
}
|
|
277
269
|
|
|
278
|
-
// NOTICE: 这里获得的 userDid 已经是登录返回的
|
|
270
|
+
// NOTICE: 这里获得的 userDid 已经是登录返回的 userDid 了,无需再去查询 connectedAccount
|
|
279
271
|
const bindUser = await node.getUser({ teamDid, user: { did: userDid } });
|
|
280
272
|
|
|
281
273
|
if (bindUser.extraConfigs?.sourceProvider !== 'wallet') {
|
|
282
|
-
throw new Error(
|
|
274
|
+
throw new Error('oauthCantBindOauth', locale);
|
|
283
275
|
}
|
|
284
276
|
|
|
285
277
|
const mergePassport = (oauthUser?.passports || []).reduce((sum, cur) => {
|
|
@@ -2,11 +2,17 @@ const logger = require('@abtnode/logger')(require('../../../../package.json').na
|
|
|
2
2
|
|
|
3
3
|
const { bindWallet } = require('../../../libs/connect/session');
|
|
4
4
|
|
|
5
|
-
const { onConnect, onApprove } = bindWallet;
|
|
5
|
+
const { onConnect, onApprove, authPrincipal } = bindWallet;
|
|
6
6
|
|
|
7
7
|
module.exports = function createRoutes(node, authenticator, createSessionToken) {
|
|
8
8
|
return {
|
|
9
9
|
action: 'bind-wallet',
|
|
10
|
+
authPrincipal: false,
|
|
11
|
+
claims: {
|
|
12
|
+
authPrincipal: async ({ extraParams: { locale, previousUserDid } }) => {
|
|
13
|
+
return authPrincipal({ locale, previousUserDid });
|
|
14
|
+
},
|
|
15
|
+
},
|
|
10
16
|
onConnect: async ({ req, userDid, extraParams: { locale, passportId = '', componentId, previousUserDid } }) => {
|
|
11
17
|
return onConnect({
|
|
12
18
|
node,
|
|
@@ -243,8 +243,6 @@ module.exports = function createRoutes(node, _, createSessionToken) {
|
|
|
243
243
|
dataDir,
|
|
244
244
|
});
|
|
245
245
|
|
|
246
|
-
const now = new Date().toISOString();
|
|
247
|
-
|
|
248
246
|
if (user) {
|
|
249
247
|
const doc = await node.updateUser({
|
|
250
248
|
teamDid: appPid,
|
|
@@ -270,30 +268,20 @@ module.exports = function createRoutes(node, _, createSessionToken) {
|
|
|
270
268
|
node
|
|
271
269
|
);
|
|
272
270
|
} else {
|
|
273
|
-
const doc = await node.
|
|
271
|
+
const doc = await node.loginUser({
|
|
274
272
|
teamDid: appPid,
|
|
275
273
|
user: {
|
|
276
274
|
...profile,
|
|
277
275
|
avatar,
|
|
278
276
|
did: userDid,
|
|
279
277
|
pk: userPk,
|
|
280
|
-
approved: true,
|
|
281
278
|
locale,
|
|
282
|
-
|
|
283
|
-
firstLoginAt: now,
|
|
284
|
-
lastLoginAt: now,
|
|
279
|
+
passport,
|
|
285
280
|
lastLoginIp: get(req, 'headers[x-real-ip]') || '',
|
|
286
|
-
|
|
287
|
-
|
|
288
|
-
|
|
289
|
-
|
|
290
|
-
provider: 'wallet',
|
|
291
|
-
did: userDid,
|
|
292
|
-
pk: userPk,
|
|
293
|
-
lastLoginAt: now,
|
|
294
|
-
firstLoginAt: now,
|
|
295
|
-
},
|
|
296
|
-
],
|
|
281
|
+
connectedAccount: {
|
|
282
|
+
provider: 'wallet',
|
|
283
|
+
did: userDid,
|
|
284
|
+
pk: userPk,
|
|
297
285
|
},
|
|
298
286
|
},
|
|
299
287
|
});
|
|
@@ -75,7 +75,7 @@ module.exports = function createRoutes(node, _authenticator, createSessionToken)
|
|
|
75
75
|
// Create user
|
|
76
76
|
const profile = claims.find((x) => x.type === 'profile');
|
|
77
77
|
|
|
78
|
-
const doc = await node.
|
|
78
|
+
const doc = await node.loginUser({
|
|
79
79
|
teamDid,
|
|
80
80
|
user: {
|
|
81
81
|
...profile,
|
|
@@ -84,15 +84,16 @@ module.exports = function createRoutes(node, _authenticator, createSessionToken)
|
|
|
84
84
|
}),
|
|
85
85
|
did: userDid,
|
|
86
86
|
pk: userPk,
|
|
87
|
-
approved: true,
|
|
88
87
|
locale,
|
|
89
|
-
passports: [],
|
|
90
|
-
firstLoginAt: new Date().toISOString(),
|
|
91
|
-
lastLoginAt: new Date().toISOString(),
|
|
92
88
|
lastLoginIp: get(req, 'headers[x-real-ip]') || '',
|
|
93
89
|
extra: {
|
|
94
90
|
baseUrl,
|
|
95
91
|
},
|
|
92
|
+
connectedAccount: {
|
|
93
|
+
provider: 'wallet',
|
|
94
|
+
did: userDid,
|
|
95
|
+
pk: userPk,
|
|
96
|
+
},
|
|
96
97
|
},
|
|
97
98
|
});
|
|
98
99
|
await node.createAuditLog(
|
|
@@ -12,6 +12,7 @@ const logger = require('@abtnode/logger')(`${require('../../../package.json').na
|
|
|
12
12
|
function createWebsocketServer(node, ensureWsUser) {
|
|
13
13
|
const wsServer = new WsServer({
|
|
14
14
|
broadcastEventName: '@abtnode/blocklet-services:dashboard',
|
|
15
|
+
heartbeatTimeout: 60 * 1000 * 5,
|
|
15
16
|
|
|
16
17
|
logger,
|
|
17
18
|
|