@abtnode/blocklet-services 1.16.6-beta-4ea1eb90 → 1.16.6-beta-7c9b42cc
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 +57 -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 +15 -15
- 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.22aaa94b.chunk.js +2 -0
- package/build/static/js/{460.97b02ba6.chunk.js → 460.81dc5588.chunk.js} +2 -2
- package/build/static/js/547.8daf63c9.chunk.js +2 -0
- package/build/static/js/737.3e75c89d.chunk.js +2 -0
- package/build/static/js/895.ce650598.chunk.js +3 -0
- package/build/static/js/main.cbcfd398.js +3 -0
- package/package.json +33 -33
- package/build/static/js/343.f30fdb24.chunk.js +0 -2
- package/build/static/js/547.f8830a9e.chunk.js +0 -2
- package/build/static/js/61.3c903dd8.chunk.js +0 -3
- package/build/static/js/737.ed53dec5.chunk.js +0 -2
- package/build/static/js/main.00308947.js +0 -3
- /package/build/static/js/{61.3c903dd8.chunk.js.LICENSE.txt → 895.ce650598.chunk.js.LICENSE.txt} +0 -0
- /package/build/static/js/{main.00308947.js.LICENSE.txt → main.cbcfd398.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,16 @@ 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: {
|
|
99
|
+
did: currentUser.did,
|
|
100
|
+
pk: currentUser.pk,
|
|
86
101
|
locale,
|
|
87
102
|
lastLoginIp,
|
|
88
|
-
lastUsedPassport,
|
|
103
|
+
passport: lastUsedPassport,
|
|
89
104
|
connectedAccount: { provider, did: userDid },
|
|
90
|
-
}
|
|
105
|
+
},
|
|
91
106
|
});
|
|
92
107
|
} else {
|
|
93
108
|
currentUser = {
|
|
@@ -100,21 +115,14 @@ async function login(req, node, options) {
|
|
|
100
115
|
if (invitedUserOnly) {
|
|
101
116
|
throw new Error(t('needInviteToLogin', locale));
|
|
102
117
|
}
|
|
103
|
-
await node.
|
|
118
|
+
await node.loginUser({
|
|
104
119
|
teamDid,
|
|
105
120
|
user: {
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
id: oauthInfo.sub,
|
|
112
|
-
did: userDid,
|
|
113
|
-
pk: userPk,
|
|
114
|
-
lastLoginAt: currentTime,
|
|
115
|
-
firstLoginAt: currentTime,
|
|
116
|
-
},
|
|
117
|
-
],
|
|
121
|
+
connectedAccount: {
|
|
122
|
+
provider,
|
|
123
|
+
id: oauthInfo.sub,
|
|
124
|
+
did: userDid,
|
|
125
|
+
pk: userPk,
|
|
118
126
|
},
|
|
119
127
|
did: userDid,
|
|
120
128
|
pk: userPk,
|
|
@@ -122,11 +130,6 @@ async function login(req, node, options) {
|
|
|
122
130
|
email: oauthInfo.email,
|
|
123
131
|
avatar,
|
|
124
132
|
locale,
|
|
125
|
-
type: 'profile',
|
|
126
|
-
approved: true,
|
|
127
|
-
passports: [],
|
|
128
|
-
firstLoginAt: currentTime,
|
|
129
|
-
lastLoginAt: currentTime,
|
|
130
133
|
lastLoginIp,
|
|
131
134
|
},
|
|
132
135
|
});
|
|
@@ -155,13 +158,16 @@ async function invite(req, node, options) {
|
|
|
155
158
|
let userPk = userWallet.publicKey;
|
|
156
159
|
|
|
157
160
|
let profile;
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
161
|
+
const currentUser = await node.getUser({
|
|
162
|
+
teamDid,
|
|
163
|
+
user: {
|
|
164
|
+
did: userDid,
|
|
165
|
+
},
|
|
166
|
+
options: {
|
|
167
|
+
enableConnectedAccout: true,
|
|
168
|
+
enableNormalize: true,
|
|
169
|
+
blockletSk: blockletWallet.secretKey,
|
|
170
|
+
},
|
|
165
171
|
});
|
|
166
172
|
const { dataDir, name: applicationName } = await getApplicationInfo({ node, nodeInfo, teamDid });
|
|
167
173
|
if (currentUser) {
|
|
@@ -199,6 +205,7 @@ async function invite(req, node, options) {
|
|
|
199
205
|
userDid,
|
|
200
206
|
userPk,
|
|
201
207
|
locale,
|
|
208
|
+
provider,
|
|
202
209
|
});
|
|
203
210
|
|
|
204
211
|
if (currentUser) {
|
|
@@ -225,28 +232,18 @@ async function invite(req, node, options) {
|
|
|
225
232
|
);
|
|
226
233
|
}
|
|
227
234
|
} else {
|
|
228
|
-
await node.
|
|
235
|
+
await node.loginUser({
|
|
229
236
|
teamDid,
|
|
230
|
-
user:
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
extraConfigs: {
|
|
235
|
-
sourceProvider: provider,
|
|
236
|
-
},
|
|
237
|
-
},
|
|
238
|
-
{
|
|
237
|
+
user: {
|
|
238
|
+
did: userDid,
|
|
239
|
+
pk: userPk,
|
|
240
|
+
connectedAccount: {
|
|
239
241
|
provider,
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
firstLoginAt: new Date().toISOString(),
|
|
246
|
-
lastLoginAt: new Date().toISOString(),
|
|
247
|
-
},
|
|
248
|
-
}
|
|
249
|
-
),
|
|
242
|
+
id: oauthInfo.sub,
|
|
243
|
+
did: userWallet.address,
|
|
244
|
+
pk: userWallet.publicKey,
|
|
245
|
+
},
|
|
246
|
+
},
|
|
250
247
|
});
|
|
251
248
|
await declareAccount({ wallet: userWallet, moniker: oauthInfo.nickname, blocklet });
|
|
252
249
|
}
|
|
@@ -269,17 +266,14 @@ async function bind(req, node, options) {
|
|
|
269
266
|
const userWallet = fromAppDid(userInfo.sub, blockletWallet.secretKey, types.RoleType.ROLE_ACCOUNT);
|
|
270
267
|
let oauthUser = await node.getUser({ teamDid, user: { did: userWallet.address } });
|
|
271
268
|
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');
|
|
269
|
+
throw new Error(t('alreadyMainAccount', locale));
|
|
276
270
|
}
|
|
277
271
|
|
|
278
|
-
// NOTICE: 这里获得的 userDid 已经是登录返回的
|
|
272
|
+
// NOTICE: 这里获得的 userDid 已经是登录返回的 userDid 了,无需再去查询 connectedAccount
|
|
279
273
|
const bindUser = await node.getUser({ teamDid, user: { did: userDid } });
|
|
280
274
|
|
|
281
275
|
if (bindUser.extraConfigs?.sourceProvider !== 'wallet') {
|
|
282
|
-
throw new Error(
|
|
276
|
+
throw new Error('oauthCantBindOauth', locale);
|
|
283
277
|
}
|
|
284
278
|
|
|
285
279
|
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, email } }) => {
|
|
13
|
+
return authPrincipal({ locale, previousUserDid, email });
|
|
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(
|