@abtnode/auth 1.16.24 → 1.16.25-beta-4f765cf3
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/lib/lost-passport.js +117 -2
- package/lib/util/federated.js +65 -0
- package/lib/util/request.js +10 -0
- package/package.json +17 -15
package/lib/lost-passport.js
CHANGED
|
@@ -9,8 +9,15 @@ const getNodeWallet = require('@abtnode/util/lib/get-app-wallet');
|
|
|
9
9
|
const { getDisplayName, getBlockletAppIdList } = require('@blocklet/meta/lib/util');
|
|
10
10
|
const { VC_TYPE_NODE_PASSPORT, PASSPORT_STATUS, NODE_DATA_DIR_NAME } = require('@abtnode/constant');
|
|
11
11
|
const get = require('lodash/get');
|
|
12
|
+
const isFunction = require('lodash/isFunction');
|
|
12
13
|
const { getUserAvatarUrl, getAppAvatarUrl, getServerAvatarUrl, extractUserAvatar } = require('@abtnode/util/lib/user');
|
|
13
14
|
const { getWalletDid } = require('@blocklet/meta/lib/did-utils');
|
|
15
|
+
const { getSourceAppPid, getLoginProvider } = require('@blocklet/sdk/lib/util/login');
|
|
16
|
+
const {
|
|
17
|
+
getFederatedMaster,
|
|
18
|
+
shouldSyncFederated,
|
|
19
|
+
getUserAvatarUrl: getUserAvatarUrlForFederated,
|
|
20
|
+
} = require('./util/federated');
|
|
14
21
|
|
|
15
22
|
const logger = require('./logger');
|
|
16
23
|
const { messages, getUser, checkWalletVersion, getPassportStatusEndpoint } = require('./auth');
|
|
@@ -24,6 +31,7 @@ const {
|
|
|
24
31
|
const verifySignature = require('./util/verify-signature');
|
|
25
32
|
|
|
26
33
|
const createPassportSvg = require('./util/create-passport-svg');
|
|
34
|
+
const { getDidConnectVersion } = require('../../blocklet-services/api/util');
|
|
27
35
|
|
|
28
36
|
const TEAM_TYPES = {
|
|
29
37
|
BLOCKLET: 'blocklet',
|
|
@@ -150,7 +158,7 @@ const createLostPassportListRoute = ({ node, type }) => ({
|
|
|
150
158
|
* Did Auth api for issue lost passport
|
|
151
159
|
* @param {Enum} type node | blocklet
|
|
152
160
|
*/
|
|
153
|
-
const createLostPassportIssueRoute = ({ node, type, authServicePrefix }) => ({
|
|
161
|
+
const createLostPassportIssueRoute = ({ node, type, authServicePrefix, createToken }) => ({
|
|
154
162
|
action: 'lost-passport-issue',
|
|
155
163
|
authPrincipal: false,
|
|
156
164
|
claims: [
|
|
@@ -210,7 +218,7 @@ const createLostPassportIssueRoute = ({ node, type, authServicePrefix }) => ({
|
|
|
210
218
|
},
|
|
211
219
|
],
|
|
212
220
|
|
|
213
|
-
onAuth: async ({ claims, userDid, userPk, extraParams, updateSession, baseUrl, req }) => {
|
|
221
|
+
onAuth: async ({ claims, userDid, userPk, extraParams, updateSession, baseUrl, req, request }) => {
|
|
214
222
|
const { locale = 'en', receiverDid, passportName } = extraParams;
|
|
215
223
|
|
|
216
224
|
const { teamDid, issuerDidList, issuerName, issuerLogo, issuerWallet, passportColor, info, dataDir } =
|
|
@@ -316,6 +324,113 @@ const createLostPassportIssueRoute = ({ node, type, authServicePrefix }) => ({
|
|
|
316
324
|
node
|
|
317
325
|
);
|
|
318
326
|
|
|
327
|
+
if (isFunction(createToken)) {
|
|
328
|
+
if (type === TEAM_TYPES.BLOCKLET) {
|
|
329
|
+
const lastLoginIp = request.headers['x-real-ip'];
|
|
330
|
+
const ua = request.headers['user-agent'];
|
|
331
|
+
const walletOS = request.context.didwallet.os;
|
|
332
|
+
const sourceAppPid = getSourceAppPid(request);
|
|
333
|
+
const provider = getLoginProvider(request);
|
|
334
|
+
|
|
335
|
+
const currentUser = await node.getUser({
|
|
336
|
+
teamDid,
|
|
337
|
+
user: {
|
|
338
|
+
did: userDid,
|
|
339
|
+
},
|
|
340
|
+
options: {
|
|
341
|
+
enableConnectedAccount: true,
|
|
342
|
+
},
|
|
343
|
+
});
|
|
344
|
+
const connectAccount = { provider, did: userDid, pk: userPk };
|
|
345
|
+
|
|
346
|
+
const updatedUser = await node.loginUser({
|
|
347
|
+
teamDid,
|
|
348
|
+
user: {
|
|
349
|
+
did: currentUser.did,
|
|
350
|
+
pk: currentUser.pk,
|
|
351
|
+
locale,
|
|
352
|
+
passport,
|
|
353
|
+
sourceAppPid,
|
|
354
|
+
lastLoginIp,
|
|
355
|
+
connectedAccount: [connectAccount],
|
|
356
|
+
},
|
|
357
|
+
});
|
|
358
|
+
|
|
359
|
+
const blocklet = await request.getBlocklet();
|
|
360
|
+
const sessionConfig = blocklet.settings?.session || {};
|
|
361
|
+
const { secret } = await request.getBlockletInfo();
|
|
362
|
+
const userSessionDoc = await node.upsertUserSession({
|
|
363
|
+
teamDid,
|
|
364
|
+
visitorId: extraParams?.visitorId,
|
|
365
|
+
userDid,
|
|
366
|
+
appPid: teamDid,
|
|
367
|
+
passportId: passport?.id,
|
|
368
|
+
status: 'online',
|
|
369
|
+
ua,
|
|
370
|
+
lastLoginIp,
|
|
371
|
+
extra: {
|
|
372
|
+
walletOS,
|
|
373
|
+
},
|
|
374
|
+
});
|
|
375
|
+
|
|
376
|
+
if (shouldSyncFederated(sourceAppPid, blocklet)) {
|
|
377
|
+
const masterSite = getFederatedMaster(blocklet);
|
|
378
|
+
node
|
|
379
|
+
.syncFederated({
|
|
380
|
+
did: teamDid,
|
|
381
|
+
data: {
|
|
382
|
+
users: [
|
|
383
|
+
{
|
|
384
|
+
did: updatedUser.did,
|
|
385
|
+
pk: updatedUser.pk,
|
|
386
|
+
fullName: updatedUser.fullName,
|
|
387
|
+
email: updatedUser.email || '',
|
|
388
|
+
avatar: getUserAvatarUrlForFederated(updatedUser.avatar, blocklet),
|
|
389
|
+
connectedAccount: [connectAccount],
|
|
390
|
+
action: 'connectAccount',
|
|
391
|
+
sourceAppPid: sourceAppPid || masterSite.appPid,
|
|
392
|
+
},
|
|
393
|
+
],
|
|
394
|
+
},
|
|
395
|
+
})
|
|
396
|
+
.then(() => {
|
|
397
|
+
node.syncUserSession({
|
|
398
|
+
teamDid,
|
|
399
|
+
userDid,
|
|
400
|
+
visitorId: userSessionDoc.visitorId,
|
|
401
|
+
passportId: passport?.id,
|
|
402
|
+
targetAppPid: sourceAppPid,
|
|
403
|
+
ua,
|
|
404
|
+
lastLoginIp,
|
|
405
|
+
extra: {
|
|
406
|
+
walletOS,
|
|
407
|
+
},
|
|
408
|
+
});
|
|
409
|
+
});
|
|
410
|
+
}
|
|
411
|
+
const { sessionToken, refreshToken } = createToken(
|
|
412
|
+
userDid,
|
|
413
|
+
{
|
|
414
|
+
secret,
|
|
415
|
+
passport,
|
|
416
|
+
role,
|
|
417
|
+
fullName: user.fullName,
|
|
418
|
+
provider,
|
|
419
|
+
// request.context.store.connectedWallet
|
|
420
|
+
walletOS,
|
|
421
|
+
},
|
|
422
|
+
{ ...sessionConfig, didConnectVersion: getDidConnectVersion(req) }
|
|
423
|
+
);
|
|
424
|
+
await updateSession({ sessionToken, refreshToken }, true);
|
|
425
|
+
} else if (type === TEAM_TYPES.NODE) {
|
|
426
|
+
const sessionToken = createToken(userDid, {
|
|
427
|
+
passport,
|
|
428
|
+
role,
|
|
429
|
+
});
|
|
430
|
+
await updateSession({ sessionToken }, true);
|
|
431
|
+
}
|
|
432
|
+
}
|
|
433
|
+
|
|
319
434
|
await updateSession({ passportId: vc.id });
|
|
320
435
|
|
|
321
436
|
return {
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
const { WELLKNOWN_SERVICE_PATH_PREFIX, USER_AVATAR_URL_PREFIX, USER_AVATAR_PATH_PREFIX } = require('@abtnode/constant');
|
|
2
|
+
const pRetry = require('p-retry');
|
|
3
|
+
const { signV2 } = require('@arcblock/jwt');
|
|
4
|
+
const joinUrl = require('url-join');
|
|
5
|
+
|
|
6
|
+
const request = require('./request');
|
|
7
|
+
|
|
8
|
+
function isMaster(site) {
|
|
9
|
+
return site?.isMaster !== false;
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
function getUserAvatarUrl(avatar, blocklet) {
|
|
13
|
+
let avatarUrl = avatar;
|
|
14
|
+
if (avatar && avatar.startsWith(USER_AVATAR_URL_PREFIX)) {
|
|
15
|
+
avatarUrl = joinUrl(WELLKNOWN_SERVICE_PATH_PREFIX, USER_AVATAR_PATH_PREFIX, avatarUrl.split('/').slice(-1)[0]);
|
|
16
|
+
|
|
17
|
+
const appUrl = blocklet.environmentObj.BLOCKLET_APP_URL;
|
|
18
|
+
avatarUrl = joinUrl(appUrl, avatarUrl);
|
|
19
|
+
}
|
|
20
|
+
return avatarUrl;
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
function getFederatedMaster(blocklet) {
|
|
24
|
+
const { sites } = blocklet?.settings?.federated || {};
|
|
25
|
+
const masterSite = (sites || []).find((item) => isMaster(item));
|
|
26
|
+
return masterSite || null;
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
function shouldSyncFederated(sourceAppPid, blocklet) {
|
|
30
|
+
if (sourceAppPid) {
|
|
31
|
+
return true;
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
const masterSite = getFederatedMaster(blocklet);
|
|
35
|
+
return !!(masterSite && blocklet && masterSite.appPid === blocklet.appPid);
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
function findFederatedSite(blocklet, targetAppPid) {
|
|
39
|
+
const { sites } = blocklet?.settings?.federated || {};
|
|
40
|
+
const targetSite = (sites || []).find((item) => item.appPid === targetAppPid);
|
|
41
|
+
return targetSite || null;
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
async function callFederated({ site, permanentWallet, data, action }) {
|
|
45
|
+
const url = new URL(site.appUrl);
|
|
46
|
+
url.pathname = joinUrl(WELLKNOWN_SERVICE_PATH_PREFIX, `/api/federated/${action}`);
|
|
47
|
+
const result = await pRetry(
|
|
48
|
+
() =>
|
|
49
|
+
request.post(url.href, {
|
|
50
|
+
signer: permanentWallet.address,
|
|
51
|
+
data: signV2(permanentWallet.address, permanentWallet.secretKey, data),
|
|
52
|
+
}),
|
|
53
|
+
{ retries: 3 }
|
|
54
|
+
);
|
|
55
|
+
return result.data;
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
module.exports = {
|
|
59
|
+
callFederated,
|
|
60
|
+
getUserAvatarUrl,
|
|
61
|
+
shouldSyncFederated,
|
|
62
|
+
getFederatedMaster,
|
|
63
|
+
findFederatedSite,
|
|
64
|
+
isMaster,
|
|
65
|
+
};
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
const axios = require('@abtnode/util/lib/axios');
|
|
2
|
+
const { version } = require('../../package.json');
|
|
3
|
+
|
|
4
|
+
module.exports =
|
|
5
|
+
process.env.NODE_ENV === 'test'
|
|
6
|
+
? axios
|
|
7
|
+
: axios.create({
|
|
8
|
+
timeout: 10 * 1000,
|
|
9
|
+
headers: { 'User-Agent': `ABTNode/${version}`, 'x-blocklet-server-version': version },
|
|
10
|
+
});
|
package/package.json
CHANGED
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
"publishConfig": {
|
|
4
4
|
"access": "public"
|
|
5
5
|
},
|
|
6
|
-
"version": "1.16.
|
|
6
|
+
"version": "1.16.25-beta-4f765cf3",
|
|
7
7
|
"description": "Simple lib to manage auth in ABT Node",
|
|
8
8
|
"main": "lib/index.js",
|
|
9
9
|
"files": [
|
|
@@ -20,19 +20,21 @@
|
|
|
20
20
|
"author": "linchen <linchen1987@foxmail.com> (http://github.com/linchen1987)",
|
|
21
21
|
"license": "Apache-2.0",
|
|
22
22
|
"dependencies": {
|
|
23
|
-
"@abtnode/constant": "1.16.
|
|
24
|
-
"@abtnode/logger": "1.16.
|
|
25
|
-
"@abtnode/util": "1.16.
|
|
26
|
-
"@arcblock/did": "1.18.
|
|
27
|
-
"@arcblock/
|
|
28
|
-
"@arcblock/
|
|
29
|
-
"@arcblock/
|
|
30
|
-
"@
|
|
31
|
-
"@blocklet/
|
|
32
|
-
"@
|
|
33
|
-
"@
|
|
34
|
-
"@ocap/
|
|
35
|
-
"@ocap/
|
|
23
|
+
"@abtnode/constant": "1.16.25-beta-4f765cf3",
|
|
24
|
+
"@abtnode/logger": "1.16.25-beta-4f765cf3",
|
|
25
|
+
"@abtnode/util": "1.16.25-beta-4f765cf3",
|
|
26
|
+
"@arcblock/did": "1.18.113",
|
|
27
|
+
"@arcblock/jwt": "^1.18.113",
|
|
28
|
+
"@arcblock/nft-display": "2.9.42",
|
|
29
|
+
"@arcblock/validator": "^1.18.113",
|
|
30
|
+
"@arcblock/vc": "1.18.113",
|
|
31
|
+
"@blocklet/constant": "1.16.25-beta-4f765cf3",
|
|
32
|
+
"@blocklet/meta": "1.16.25-beta-4f765cf3",
|
|
33
|
+
"@blocklet/sdk": "1.16.25-beta-4f765cf3",
|
|
34
|
+
"@ocap/client": "^1.18.113",
|
|
35
|
+
"@ocap/mcrypto": "1.18.113",
|
|
36
|
+
"@ocap/util": "1.18.113",
|
|
37
|
+
"@ocap/wallet": "1.18.113",
|
|
36
38
|
"axios": "^0.27.2",
|
|
37
39
|
"flat": "^5.0.2",
|
|
38
40
|
"fs-extra": "^11.2.0",
|
|
@@ -49,5 +51,5 @@
|
|
|
49
51
|
"devDependencies": {
|
|
50
52
|
"jest": "^29.7.0"
|
|
51
53
|
},
|
|
52
|
-
"gitHead": "
|
|
54
|
+
"gitHead": "7783a4bf883bb44b4266651b04008ef65bf6c2ce"
|
|
53
55
|
}
|